From 47067497037082cdc50c5b334df9d86d4c3d5e83 Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Wed, 15 Jul 2026 23:27:37 +0000 Subject: [PATCH 01/26] propagated gpu_virtualized field --- docs/openapi/gateway.swagger.json | 3 + pkg/abstractions/common/instance.go | 1 + pkg/abstractions/endpoint/instance.go | 1 + pkg/abstractions/function/task.go | 34 +- pkg/abstractions/pod/instance.go | 1 + pkg/abstractions/pod/pod.go | 1 + pkg/abstractions/shell/shell.go | 31 +- pkg/abstractions/taskqueue/instance.go | 1 + pkg/gateway/gateway.proto | 1 + pkg/gateway/services/compute/rentals.go | 1 + pkg/gateway/services/rollout.go | 23 +- pkg/gateway/services/rollout_test.go | 22 + pkg/gateway/services/stub.go | 11 +- pkg/gateway/services/stub_test.go | 46 + pkg/types/backend.go | 13 +- pkg/types/scheduler.go | 7 + pkg/types/types.proto | 1 + proto/gateway.pb.go | 3913 +++++++++++---------- proto/types.pb.go | 608 ++-- sdk/src/beta9/abstractions/base/runner.py | 3 + sdk/src/beta9/abstractions/pod.py | 5 + sdk/src/beta9/abstractions/sandbox.py | 5 + sdk/src/beta9/clients/gateway/__init__.py | 1 + sdk/src/beta9/clients/types/__init__.py | 1 + 24 files changed, 2431 insertions(+), 2303 deletions(-) diff --git a/docs/openapi/gateway.swagger.json b/docs/openapi/gateway.swagger.json index 482f16ac1..18cf79f2b 100644 --- a/docs/openapi/gateway.swagger.json +++ b/docs/openapi/gateway.swagger.json @@ -3501,6 +3501,9 @@ }, "checkpointTrigger": { "$ref": "#/definitions/typesCheckpointTrigger" + }, + "gpuVirtualized": { + "type": "boolean" } } }, diff --git a/pkg/abstractions/common/instance.go b/pkg/abstractions/common/instance.go index 42d491951..d467ce099 100644 --- a/pkg/abstractions/common/instance.go +++ b/pkg/abstractions/common/instance.go @@ -334,6 +334,7 @@ func (i *AutoscaledInstance) CheckConcurrencyLimit() error { request := &types.ContainerRequest{ Cpu: i.StubConfig.Runtime.Cpu, GpuCount: uint32(gpuCount), + GpuVirtualized: i.StubConfig.Runtime.GpuVirtualized, WorkspaceId: i.Workspace.ExternalId, Workspace: *i.Workspace, AllowMarketplace: i.StubConfig.AllowMarketplace, diff --git a/pkg/abstractions/endpoint/instance.go b/pkg/abstractions/endpoint/instance.go index 7695a0290..2e8e530a6 100644 --- a/pkg/abstractions/endpoint/instance.go +++ b/pkg/abstractions/endpoint/instance.go @@ -113,6 +113,7 @@ func (i *endpointInstance) startContainers(containersToRun int) error { Memory: i.StubConfig.Runtime.Memory, GpuRequest: gpuRequest, GpuCount: uint32(gpuCount), + GpuVirtualized: i.StubConfig.Runtime.GpuVirtualized, AppId: i.Stub.App.ExternalId, ImageId: i.StubConfig.Runtime.ImageId, StubId: i.Stub.ExternalId, diff --git a/pkg/abstractions/function/task.go b/pkg/abstractions/function/task.go index c89f60df6..641ac4ef3 100644 --- a/pkg/abstractions/function/task.go +++ b/pkg/abstractions/function/task.go @@ -47,6 +47,7 @@ func (t *FunctionTask) Execute(ctx context.Context, options ...interface{}) erro if err := t.fs.scheduler.CheckConcurrencyLimit(&types.ContainerRequest{ Cpu: cpu, GpuCount: uint32(gpuCount), + GpuVirtualized: stubConfig.Runtime.GpuVirtualized, WorkspaceId: stub.Workspace.ExternalId, Workspace: stub.Workspace, StubId: stub.ExternalId, @@ -205,22 +206,23 @@ func (t *FunctionTask) run(ctx context.Context, stub *types.StubWithRelated, tas } runRequest := &types.ContainerRequest{ - ContainerId: t.containerId, - Env: env, - Cpu: stubConfig.Runtime.Cpu, - Memory: stubConfig.Runtime.Memory, - GpuRequest: gpuRequest, - GpuCount: uint32(gpuCount), - ImageId: stubConfig.Runtime.ImageId, - StubId: stub.ExternalId, - TaskId: task.ExternalId, - AppId: stub.App.ExternalId, - WorkspaceId: stub.Workspace.ExternalId, - Workspace: stub.Workspace, - EntryPoint: []string{stubConfig.PythonVersion, "-m", "beta9.runner.function"}, - Mounts: mounts, - Stub: *stub, - PoolSelector: stubConfig.PoolSelector(), + ContainerId: t.containerId, + Env: env, + Cpu: stubConfig.Runtime.Cpu, + Memory: stubConfig.Runtime.Memory, + GpuRequest: gpuRequest, + GpuCount: uint32(gpuCount), + GpuVirtualized: stubConfig.Runtime.GpuVirtualized, + ImageId: stubConfig.Runtime.ImageId, + StubId: stub.ExternalId, + TaskId: task.ExternalId, + AppId: stub.App.ExternalId, + WorkspaceId: stub.Workspace.ExternalId, + Workspace: stub.Workspace, + EntryPoint: []string{stubConfig.PythonVersion, "-m", "beta9.runner.function"}, + Mounts: mounts, + Stub: *stub, + PoolSelector: stubConfig.PoolSelector(), } if err := abstractions.ConfigureContainerRequestNetwork(runRequest, stubConfig); err != nil { return err diff --git a/pkg/abstractions/pod/instance.go b/pkg/abstractions/pod/instance.go index e26c48302..c6f598737 100644 --- a/pkg/abstractions/pod/instance.go +++ b/pkg/abstractions/pod/instance.go @@ -117,6 +117,7 @@ func (i *podInstance) startContainers(containersToRun int) error { Memory: i.StubConfig.Runtime.Memory, GpuRequest: gpuRequest, GpuCount: uint32(gpuCount), + GpuVirtualized: i.StubConfig.Runtime.GpuVirtualized, ImageId: i.StubConfig.Runtime.ImageId, StubId: i.Stub.ExternalId, AppId: i.Stub.App.ExternalId, diff --git a/pkg/abstractions/pod/pod.go b/pkg/abstractions/pod/pod.go index f6343cbc4..15f7597ac 100644 --- a/pkg/abstractions/pod/pod.go +++ b/pkg/abstractions/pod/pod.go @@ -440,6 +440,7 @@ func (s *GenericPodService) run(ctx context.Context, authInfo *auth.AuthInfo, st Memory: stubConfig.Runtime.Memory, GpuRequest: gpuRequest, GpuCount: uint32(gpuCount), + GpuVirtualized: stubConfig.Runtime.GpuVirtualized, Mounts: mounts, Stub: *stub, ImageId: *imageId, diff --git a/pkg/abstractions/shell/shell.go b/pkg/abstractions/shell/shell.go index 228d0bd29..026ed97f9 100644 --- a/pkg/abstractions/shell/shell.go +++ b/pkg/abstractions/shell/shell.go @@ -443,21 +443,22 @@ func (ss *SSHShellService) CreateStandaloneShell(ctx context.Context, in *pb.Cre } runRequest := &types.ContainerRequest{ - ContainerId: containerId, - Env: env, - Cpu: stubConfig.Runtime.Cpu, - Memory: stubConfig.Runtime.Memory, - GpuRequest: gpuRequest, - GpuCount: uint32(gpuCount), - ImageId: stubConfig.Runtime.ImageId, - StubId: stub.ExternalId, - AppId: stub.App.ExternalId, - WorkspaceId: authInfo.Workspace.ExternalId, - Workspace: *authInfo.Workspace, - EntryPoint: entryPoint, - Mounts: mounts, - Stub: *stub, - PoolSelector: stubConfig.PoolSelector(), + ContainerId: containerId, + Env: env, + Cpu: stubConfig.Runtime.Cpu, + Memory: stubConfig.Runtime.Memory, + GpuRequest: gpuRequest, + GpuCount: uint32(gpuCount), + GpuVirtualized: stubConfig.Runtime.GpuVirtualized, + ImageId: stubConfig.Runtime.ImageId, + StubId: stub.ExternalId, + AppId: stub.App.ExternalId, + WorkspaceId: authInfo.Workspace.ExternalId, + Workspace: *authInfo.Workspace, + EntryPoint: entryPoint, + Mounts: mounts, + Stub: *stub, + PoolSelector: stubConfig.PoolSelector(), AllowMarketplace: stubConfig.AllowMarketplace, MachineId: stubConfig.MachineID, } diff --git a/pkg/abstractions/taskqueue/instance.go b/pkg/abstractions/taskqueue/instance.go index a3f3c1321..942c8b8c1 100644 --- a/pkg/abstractions/taskqueue/instance.go +++ b/pkg/abstractions/taskqueue/instance.go @@ -94,6 +94,7 @@ func (i *taskQueueInstance) startContainers(containersToRun int) error { Memory: i.StubConfig.Runtime.Memory, GpuRequest: gpuRequest, GpuCount: uint32(gpuCount), + GpuVirtualized: i.StubConfig.Runtime.GpuVirtualized, ImageId: i.StubConfig.Runtime.ImageId, StubId: i.Stub.ExternalId, AppId: i.Stub.App.ExternalId, diff --git a/pkg/gateway/gateway.proto b/pkg/gateway/gateway.proto index 9d232a038..3f19b9873 100644 --- a/pkg/gateway/gateway.proto +++ b/pkg/gateway/gateway.proto @@ -706,6 +706,7 @@ message GetOrCreateStubRequest { repeated DurableDisk disks = 44; bool allow_marketplace = 45; types.CheckpointTrigger checkpoint_trigger = 46; + bool gpu_virtualized = 47; } message GetOrCreateStubResponse { diff --git a/pkg/gateway/services/compute/rentals.go b/pkg/gateway/services/compute/rentals.go index ca0ac2df8..203491322 100644 --- a/pkg/gateway/services/compute/rentals.go +++ b/pkg/gateway/services/compute/rentals.go @@ -499,6 +499,7 @@ func (s *Service) rentalContainerRequest( Memory: stubConfig.Runtime.Memory, GpuRequest: []string{rental.GPU}, GpuCount: stubConfig.Runtime.GpuCount, + GpuVirtualized: stubConfig.Runtime.GpuVirtualized, ImageId: stubConfig.Runtime.ImageId, WorkspaceId: authInfo.Workspace.ExternalId, Workspace: *authInfo.Workspace, diff --git a/pkg/gateway/services/rollout.go b/pkg/gateway/services/rollout.go index 03018f72e..0b8da8e18 100644 --- a/pkg/gateway/services/rollout.go +++ b/pkg/gateway/services/rollout.go @@ -168,17 +168,18 @@ func rolloutContainerRequest(in deploymentRolloutInput) *types.ContainerRequest workspaceID = in.workspace.ExternalId } return &types.ContainerRequest{ - Cpu: in.config.Runtime.Cpu, - Memory: in.config.Runtime.Memory, - Gpu: string(in.config.Runtime.Gpu), - GpuRequest: types.GpuTypesToStrings(in.config.Runtime.Gpus), - GpuCount: in.config.Runtime.GpuCount, - ImageId: in.config.Runtime.ImageId, - StubId: in.stub.ExternalId, - WorkspaceId: workspaceID, - Stub: *in.stub, - PoolSelector: in.config.PoolSelector(), - MachineId: in.config.MachineID, + Cpu: in.config.Runtime.Cpu, + Memory: in.config.Runtime.Memory, + Gpu: string(in.config.Runtime.Gpu), + GpuRequest: types.GpuTypesToStrings(in.config.Runtime.Gpus), + GpuCount: in.config.Runtime.GpuCount, + GpuVirtualized: in.config.Runtime.GpuVirtualized, + ImageId: in.config.Runtime.ImageId, + StubId: in.stub.ExternalId, + WorkspaceId: workspaceID, + Stub: *in.stub, + PoolSelector: in.config.PoolSelector(), + MachineId: in.config.MachineID, } } diff --git a/pkg/gateway/services/rollout_test.go b/pkg/gateway/services/rollout_test.go index f9189768a..59dbdbaed 100644 --- a/pkg/gateway/services/rollout_test.go +++ b/pkg/gateway/services/rollout_test.go @@ -10,6 +10,28 @@ import ( "github.com/beam-cloud/beta9/pkg/types" ) +func TestRolloutContainerRequestPropagatesGpuVirtualized(t *testing.T) { + request := rolloutContainerRequest(deploymentRolloutInput{ + workspace: &types.Workspace{ExternalId: "workspace-1"}, + stub: &types.StubWithRelated{Stub: types.Stub{ExternalId: "stub-1"}}, + config: &types.StubConfigV1{Runtime: types.Runtime{ + Cpu: 1_000, + Memory: 2_048, + Gpus: []types.GpuType{types.GPU_A10G}, + GpuCount: 1, + GpuVirtualized: true, + ImageId: "image-1", + }}, + }) + + if !request.GpuVirtualized { + t.Fatal("expected virtualized GPU flag to propagate") + } + if request.GpuCount != 1 || len(request.GpuRequest) != 1 || request.GpuRequest[0] != string(types.GPU_A10G) { + t.Fatalf("gpu scheduling fields = count %d request %v, want A10G x1", request.GpuCount, request.GpuRequest) + } +} + func TestDeploymentRolloutAppliesToAnyAlwaysOnDeployment(t *testing.T) { latestConfig := types.StubConfigV1{ Autoscaler: &types.Autoscaler{MinContainers: 1}, diff --git a/pkg/gateway/services/stub.go b/pkg/gateway/services/stub.go index 7b5ac1f81..5178b514e 100644 --- a/pkg/gateway/services/stub.go +++ b/pkg/gateway/services/stub.go @@ -111,11 +111,12 @@ func (gws *GatewayService) GetOrCreateStub(ctx context.Context, in *pb.GetOrCrea stubConfig := types.StubConfigV1{ Runtime: types.Runtime{ - Cpu: in.Cpu, - Gpus: gpus, - GpuCount: in.GpuCount, - Memory: in.Memory, - ImageId: in.ImageId, + Cpu: in.Cpu, + Gpus: gpus, + GpuCount: in.GpuCount, + GpuVirtualized: in.GpuVirtualized, + Memory: in.Memory, + ImageId: in.ImageId, }, Handler: in.Handler, OnStart: in.OnStart, diff --git a/pkg/gateway/services/stub_test.go b/pkg/gateway/services/stub_test.go index 217e99456..728ec8674 100644 --- a/pkg/gateway/services/stub_test.go +++ b/pkg/gateway/services/stub_test.go @@ -19,6 +19,52 @@ func (r *checkpointVolumeBackendRepo) GetOrCreateVolume(ctx context.Context, wor return &types.Volume{ExternalId: "volume-123", WorkspaceId: workspaceId, Name: name}, nil } +type getOrCreateStubBackendRepo struct { + repository.BackendRepository + stubConfig types.StubConfigV1 +} + +func (r *getOrCreateStubBackendRepo) GetOrCreateApp(ctx context.Context, workspaceId uint, appName string) (*types.App, error) { + return &types.App{Id: 3, WorkspaceId: workspaceId, Name: appName}, nil +} + +func (r *getOrCreateStubBackendRepo) GetObjectByExternalId(ctx context.Context, externalId string, workspaceId uint) (types.Object, error) { + return types.Object{Id: 2, ExternalId: externalId, WorkspaceId: workspaceId}, nil +} + +func (r *getOrCreateStubBackendRepo) GetOrCreateStub(ctx context.Context, name, stubType string, config types.StubConfigV1, objectId, workspaceId uint, forceCreate bool, appId uint) (types.Stub, error) { + r.stubConfig = config + return types.Stub{Id: 4, ExternalId: "stub-123", Name: name, Type: types.StubType(stubType), ObjectId: objectId, WorkspaceId: workspaceId, AppId: appId}, nil +} + +func TestGetOrCreateStubPersistsGpuVirtualizedRuntimeConfig(t *testing.T) { + backend := &getOrCreateStubBackendRepo{} + gws := &GatewayService{ + backendRepo: backend, + appConfig: types.AppConfig{GatewayService: types.GatewayServiceConfig{StubLimits: types.StubLimits{ + Cpu: 1000, + Memory: 1024, + MaxGpuCount: 1, + }}}, + } + ctx := auth.ContextWithAuthInfo(context.Background(), &auth.AuthInfo{Workspace: &types.Workspace{Id: 1, ExternalId: "workspace-1"}}) + + resp, err := gws.GetOrCreateStub(ctx, &pb.GetOrCreateStubRequest{ + Name: "sandbox", + StubType: types.StubTypeSandbox, + ObjectId: "object-123", + AppName: "app", + Cpu: 1000, + Memory: 1024, + GpuVirtualized: true, + }) + + require.NoError(t, err) + require.True(t, resp.Ok) + require.Equal(t, "stub-123", resp.StubId) + require.True(t, backend.stubConfig.Runtime.GpuVirtualized) +} + func TestConfigureDurableDiskPlacementDefaultsSnapshotDriver(t *testing.T) { config := &types.StubConfigV1{ Disks: []*pb.DurableDisk{{Name: "pg-data"}}, diff --git a/pkg/types/backend.go b/pkg/types/backend.go index 818fd56a4..7c073f88c 100644 --- a/pkg/types/backend.go +++ b/pkg/types/backend.go @@ -995,12 +995,13 @@ type Image struct { } type Runtime struct { - Cpu int64 `json:"cpu"` - Gpu GpuType `json:"gpu"` - GpuCount uint32 `json:"gpu_count"` - Memory int64 `json:"memory"` - ImageId string `json:"image_id"` - Gpus []GpuType `json:"gpus"` + Cpu int64 `json:"cpu"` + Gpu GpuType `json:"gpu"` + GpuCount uint32 `json:"gpu_count"` + GpuVirtualized bool `json:"gpu_virtualized"` + Memory int64 `json:"memory"` + ImageId string `json:"image_id"` + Gpus []GpuType `json:"gpus"` } // FilterFieldMapping represents a mapping between a client-provided field and diff --git a/pkg/types/scheduler.go b/pkg/types/scheduler.go index 9159b2f44..9dc886029 100644 --- a/pkg/types/scheduler.go +++ b/pkg/types/scheduler.go @@ -273,6 +273,7 @@ type ContainerRequest struct { MachineId string `json:"machine_id,omitempty"` CheckpointTrigger *CheckpointTrigger `json:"checkpoint_trigger,omitempty"` TaskId string `json:"task_id,omitempty"` + GpuVirtualized bool `json:"gpu_virtualized"` } // @go2proto @@ -327,6 +328,10 @@ func (c *ContainerRequest) RequiresGPU() bool { return c.Gpu != "" && c.Gpu != string(NO_GPU) } +func (c *ContainerRequest) RequiresPhysicalGPU() bool { + return c.RequiresGPU() && !c.GpuVirtualized +} + func WorkerStartConcurrencyForPool(poolConfig WorkerPoolConfig, globalRuntime, runtimeType string, workerCPU int64) int { if runtimeType == "" { runtimeType = poolConfig.ContainerRuntime @@ -582,6 +587,7 @@ func (c *ContainerRequest) ToProto() *pb.ContainerRequest { Gpu: c.Gpu, GpuRequest: c.GpuRequest, GpuCount: c.GpuCount, + GpuVirtualized: c.GpuVirtualized, ImageId: c.ImageId, Mounts: mounts, StubId: c.StubId, @@ -642,6 +648,7 @@ func NewContainerRequestFromProto(in *pb.ContainerRequest) *ContainerRequest { Gpu: in.Gpu, GpuRequest: in.GpuRequest, GpuCount: in.GpuCount, + GpuVirtualized: in.GpuVirtualized, ImageId: in.ImageId, Mounts: mounts, WorkspaceId: in.WorkspaceId, diff --git a/pkg/types/types.proto b/pkg/types/types.proto index 6ccb22f61..2f68b4a97 100644 --- a/pkg/types/types.proto +++ b/pkg/types/types.proto @@ -112,6 +112,7 @@ message ContainerRequest { string machine_id = 34; CheckpointTrigger checkpoint_trigger = 35; string task_id = 36; + bool gpu_virtualized = 37; } message ContainerState { diff --git a/proto/gateway.pb.go b/proto/gateway.pb.go index 3408677b0..e139d91b7 100644 --- a/proto/gateway.pb.go +++ b/proto/gateway.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.25.1 +// protoc v3.21.12 // source: gateway.proto package proto @@ -2840,6 +2840,7 @@ type GetOrCreateStubRequest struct { Disks []*DurableDisk `protobuf:"bytes,44,rep,name=disks,proto3" json:"disks,omitempty"` AllowMarketplace bool `protobuf:"varint,45,opt,name=allow_marketplace,json=allowMarketplace,proto3" json:"allow_marketplace,omitempty"` CheckpointTrigger *CheckpointTrigger `protobuf:"bytes,46,opt,name=checkpoint_trigger,json=checkpointTrigger,proto3" json:"checkpoint_trigger,omitempty"` + GpuVirtualized bool `protobuf:"varint,47,opt,name=gpu_virtualized,json=gpuVirtualized,proto3" json:"gpu_virtualized,omitempty"` } func (x *GetOrCreateStubRequest) Reset() { @@ -3189,6 +3190,13 @@ func (x *GetOrCreateStubRequest) GetCheckpointTrigger() *CheckpointTrigger { return nil } +func (x *GetOrCreateStubRequest) GetGpuVirtualized() bool { + if x != nil { + return x.GpuVirtualized + } + return false +} + type GetOrCreateStubResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -13756,7 +13764,7 @@ var file_gateway_proto_rawDesc = []byte{ 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x73, 0x22, 0xc4, 0x0c, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x73, 0x22, 0xed, 0x0c, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6d, 0x61, @@ -13856,2020 +13864,2023 @@ var file_gateway_proto_rawDesc = []byte{ 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x22, 0x76, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4f, - 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, - 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x6d, 0x73, - 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x4d, 0x73, 0x67, - 0x22, 0x5a, 0x0a, 0x11, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x22, 0xdd, 0x01, 0x0a, - 0x12, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x55, 0x72, - 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x77, 0x61, - 0x72, 0x6e, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x61, - 0x72, 0x6e, 0x4d, 0x73, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, - 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, - 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9b, 0x04, 0x0a, - 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, - 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, - 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x73, 0x74, 0x75, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, - 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 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, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4b, 0x69, 0x6e, 0x64, - 0x12, 0x38, 0x0a, 0x18, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x16, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x76, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x76, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x16, 0x4c, - 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x79, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, - 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x35, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0x27, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x41, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x28, 0x0a, 0x16, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x42, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, - 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x48, 0x0a, 0x16, 0x53, 0x63, 0x61, - 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x73, 0x22, 0x42, 0x0a, 0x17, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, - 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x29, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x22, 0x43, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, - 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xec, 0x02, 0x0a, 0x04, 0x50, 0x6f, 0x6f, 0x6c, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1e, - 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x12, 0x1e, - 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x43, 0x70, 0x75, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x43, 0x70, 0x75, 0x12, 0x24, - 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x43, 0x70, 0x75, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x43, 0x70, 0x75, - 0x12, 0x30, 0x0a, 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x12, 0x34, 0x0a, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, - 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xbb, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x61, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, + 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x67, 0x70, 0x75, 0x5f, + 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x2f, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x67, 0x70, 0x75, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x22, 0x76, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, + 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x19, + 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x4d, 0x73, 0x67, 0x22, 0x5a, 0x0a, 0x11, 0x44, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, + 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, + 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x6f, + 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x22, 0xdd, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x23, 0x0a, 0x0d, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, + 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, + 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, + 0x4d, 0x73, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x6d, 0x73, 0x67, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x4d, 0x73, 0x67, 0x12, 0x25, + 0x0a, 0x0e, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9b, 0x04, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x75, + 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, + 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x75, 0x62, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, + 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, + 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x0b, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x15, 0x0a, + 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, + 0x70, 0x70, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x65, 0x6e, 0x76, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x76, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, + 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, 0x29, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x79, 0x0a, + 0x17, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, + 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, + 0x67, 0x12, 0x35, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x27, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x70, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x22, 0x41, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, + 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, + 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, + 0x72, 0x4d, 0x73, 0x67, 0x22, 0x28, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x42, + 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, - 0x73, 0x67, 0x12, 0x23, 0x0a, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, - 0x52, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x22, 0xf9, 0x02, 0x0a, 0x0a, 0x50, 0x6f, 0x6f, 0x6c, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, - 0x75, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x14, 0x0a, 0x05, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x6f, 0x64, - 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x70, 0x65, 0x6e, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x70, 0x65, 0x6e, - 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, - 0x5f, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x0e, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x12, - 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, - 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, - 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, - 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x66, 0x66, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, - 0x72, 0x49, 0x64, 0x22, 0xd2, 0x04, 0x0a, 0x09, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, - 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x23, 0x0a, - 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, - 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, - 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, - 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, - 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, 0x12, 0x2c, 0x0a, - 0x12, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, - 0x72, 0x6f, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x68, 0x6f, 0x75, 0x72, 0x6c, - 0x79, 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x72, - 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, - 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4d, 0x62, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x2e, - 0x0a, 0x13, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, - 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, - 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x22, 0xfb, 0x05, 0x0a, 0x10, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, - 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, - 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, - 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x10, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, - 0x63, 0x72, 0x6f, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 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, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, - 0x41, 0x74, 0x12, 0x48, 0x0a, 0x12, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, - 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x5f, 0x61, 0x74, 0x18, 0x0b, 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, 0x10, 0x62, 0x69, 0x6c, 0x6c, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x41, 0x74, 0x12, 0x25, 0x0a, 0x0e, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x11, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, - 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, - 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, - 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, - 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x70, 0x75, - 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x15, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x4d, 0x62, 0x22, 0xad, 0x04, 0x0a, 0x0b, 0x50, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x3d, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x5f, - 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x70, 0x65, - 0x6e, 0x64, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, - 0x74, 0x18, 0x0a, 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x23, - 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x72, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x04, 0x62, 0x79, - 0x6f, 0x63, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x22, 0x40, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, - 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x27, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x6d, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, - 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2a, 0x0a, 0x06, 0x6f, - 0x66, 0x66, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, - 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x22, 0x5a, 0x0a, 0x19, 0x4c, 0x61, 0x75, 0x6e, 0x63, - 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, - 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, - 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x22, 0xde, 0x01, 0x0a, 0x1a, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, - 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x67, 0x22, 0x48, 0x0a, 0x16, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x42, 0x0a, 0x17, + 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, + 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, + 0x22, 0x29, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x43, 0x0a, 0x18, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, + 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, + 0x22, 0xec, 0x02, 0x0a, 0x04, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, + 0x65, 0x65, 0x47, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x6e, + 0x46, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, + 0x65, 0x65, 0x43, 0x70, 0x75, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x6e, + 0x46, 0x72, 0x65, 0x65, 0x43, 0x70, 0x75, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x46, 0x72, + 0x65, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x2a, 0x0a, + 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x43, 0x70, + 0x75, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x43, 0x70, 0x75, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x34, 0x0a, 0x15, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x47, 0x70, 0x75, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x2c, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x50, + 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, + 0xbb, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, 0x29, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x61, 0x0a, + 0x11, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, - 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, - 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, - 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x43, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, - 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x72, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x61, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, - 0x65, 0x6e, 0x74, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x47, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, - 0x4f, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x6f, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, - 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, - 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2a, 0x0a, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x05, 0x70, 0x6f, 0x6f, 0x6c, - 0x73, 0x22, 0x9d, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, - 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, - 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, - 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x4e, 0x6f, - 0x64, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0xfc, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, - 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, - 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, - 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x74, 0x75, 0x70, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x55, 0x72, 0x6c, 0x12, 0x2a, 0x0a, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, - 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, - 0x22, 0xd8, 0x05, 0x0a, 0x0d, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1d, - 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x23, 0x0a, 0x05, 0x70, + 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, + 0x22, 0xf9, 0x02, 0x0a, 0x0a, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, + 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, + 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x6d, 0x69, 0x6e, + 0x52, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x61, 0x6c, + 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x61, 0x6c, + 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x22, 0xd2, 0x04, 0x0a, + 0x09, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, + 0x6f, 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x4d, + 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, 0x12, 0x2c, 0x0a, 0x12, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, + 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x10, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, + 0x63, 0x72, 0x6f, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x69, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x6d, 0x62, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x4d, 0x62, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, + 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, + 0x75, 0x64, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, + 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, + 0x65, 0x22, 0xfb, 0x05, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, + 0x19, 0x0a, 0x08, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x2c, 0x0a, 0x12, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, + 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x68, 0x6f, 0x75, + 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x09, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x0a, + 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x48, 0x0a, 0x12, 0x62, + 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x5f, 0x61, + 0x74, 0x18, 0x0b, 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, 0x10, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x65, + 0x77, 0x61, 0x6c, 0x41, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x12, + 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x6f, + 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, + 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x13, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, + 0x72, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, + 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x15, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4d, 0x62, 0x22, + 0xad, 0x04, 0x0a, 0x0b, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, + 0x2b, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3d, 0x0a, 0x0c, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x72, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6d, + 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4d, 0x69, 0x63, 0x72, 0x6f, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x09, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, + 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x6f, + 0x64, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, 0x43, + 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x22, + 0x40, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x70, 0x6f, 0x6f, + 0x6c, 0x22, 0x6d, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, + 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, + 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, + 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2a, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, + 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, + 0x22, 0x5a, 0x0a, 0x19, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, + 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0xde, 0x01, 0x0a, + 0x1a, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, + 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, + 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, + 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x1d, + 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, + 0x0e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x43, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xc9, 0x01, + 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, + 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x07, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6f, 0x0a, 0x18, 0x4c, 0x69, 0x73, + 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2a, + 0x0a, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, + 0x6f, 0x6f, 0x6c, 0x52, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x22, 0x9d, 0x02, 0x0a, 0x15, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, - 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, + 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, + 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, + 0x70, 0x75, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, + 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xfc, 0x01, 0x0a, 0x16, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, + 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, + 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x75, + 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x74, + 0x75, 0x70, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x1f, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x14, - 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, - 0x68, 0x61, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x64, 0x65, 0x73, - 0x69, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, - 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5f, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, - 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x5f, 0x70, - 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x73, - 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x50, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, - 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, - 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, - 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x10, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, 0x63, 0x72, 0x6f, - 0x73, 0x12, 0x37, 0x0a, 0x18, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x6c, - 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x48, 0x6f, 0x75, 0x72, 0x6c, 0x79, - 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x53, 0x63, 0x61, 0x6c, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x10, 0x0a, 0x03, - 0x67, 0x70, 0x75, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, - 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x31, 0x0a, 0x12, 0x47, - 0x65, 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x2a, 0x0a, + 0x04, 0x62, 0x79, 0x6f, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x22, 0xd8, 0x05, 0x0a, 0x0d, 0x42, 0x59, + 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x23, + 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, + 0x79, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x73, + 0x74, 0x72, 0x6f, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, + 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, + 0x29, 0x0a, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, + 0x78, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x61, + 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, + 0x73, 0x50, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x12, + 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, 0x72, + 0x6f, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, + 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, + 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x48, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, 0x63, + 0x72, 0x6f, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x12, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x45, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x13, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x31, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, + 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, + 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xff, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, + 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, + 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, + 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, + 0x04, 0x62, 0x79, 0x6f, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x22, 0x75, 0x0a, 0x14, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xff, - 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, - 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, - 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, - 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, - 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, - 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4e, 0x6f, + 0x64, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x73, + 0x22, 0x96, 0x01, 0x0a, 0x15, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, + 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, + 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, + 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x2a, 0x0a, + 0x04, 0x62, 0x79, 0x6f, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x22, 0xe2, 0x04, 0x0a, 0x12, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, + 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, + 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, + 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, + 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 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, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x0c, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, - 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, - 0x22, 0x75, 0x0a, 0x14, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x64, 0x65, - 0x73, 0x69, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, - 0x78, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, - 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x15, 0x53, 0x63, 0x61, 0x6c, - 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, - 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, - 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, - 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x2a, 0x0a, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, - 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, - 0x22, 0xe2, 0x04, 0x0a, 0x12, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x6c, 0x6c, 0x65, - 0x72, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, - 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, - 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, - 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, - 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, + 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, + 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9a, + 0x05, 0x0a, 0x10, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, + 0x66, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x11, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x72, + 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, 0x12, + 0x17, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x67, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x06, 0x64, 0x69, 0x73, 0x6b, 0x47, 0x62, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, + 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x11, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, 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, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, - 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, - 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x36, 0x0a, - 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, - 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, - 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9a, 0x05, 0x0a, 0x10, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x6c, - 0x6c, 0x65, 0x72, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, - 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, - 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, - 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, - 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, - 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x08, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x67, - 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x64, 0x69, 0x73, 0x6b, 0x47, 0x62, 0x12, - 0x24, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x69, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x11, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x36, 0x0a, 0x18, 0x70, 0x72, - 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, - 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x70, 0x72, - 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0xb2, 0x02, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, - 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, - 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, - 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, - 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x36, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, - 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, - 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, - 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x35, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x52, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x93, 0x03, 0x0a, - 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, + 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x12, 0x36, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, + 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, + 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xb2, 0x02, 0x0a, 0x1f, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x72, 0x65, - 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, - 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, - 0x48, 0x01, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, - 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, - 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x48, - 0x02, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, - 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, - 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, + 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x70, + 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, + 0x22, 0x82, 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x35, + 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x6c, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x93, 0x03, 0x0a, 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, + 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, + 0x70, 0x75, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, + 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, + 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, + 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, - 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, - 0x12, 0x35, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x07, - 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x40, 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x22, 0x4b, 0x0a, 0x20, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, + 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, + 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, + 0x62, 0x6c, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x42, 0x1b, + 0x0a, 0x19, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, + 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x20, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, + 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x35, 0x0a, 0x07, 0x6c, 0x69, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x22, 0x40, 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x49, 0x64, 0x22, 0x4b, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, + 0x36, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, + 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, + 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, + 0x72, 0x4d, 0x73, 0x67, 0x12, 0x37, 0x0a, 0x08, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x52, 0x08, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x53, 0x0a, + 0x20, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, + 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, + 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, + 0x74, 0x6c, 0x22, 0xb7, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, + 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, + 0x67, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, + 0x05, 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0x46, 0x0a, 0x1c, + 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, + 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x67, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x22, 0x7b, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x31, + 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, + 0x73, 0x22, 0x3b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x22, 0x77, + 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x36, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x83, - 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2f, 0x0a, 0x05, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, + 0x52, 0x05, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x22, 0x88, 0x03, 0x0a, 0x11, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, + 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, + 0x70, 0x75, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, + 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, + 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x36, 0x0a, 0x18, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, + 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0x7b, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x7e, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x37, 0x0a, 0x08, 0x6c, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x6c, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x22, 0x53, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0xb7, 0x01, 0x0a, 0x21, 0x47, 0x65, - 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, 0x6e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, - 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, - 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x05, 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, - 0x73, 0x41, 0x74, 0x22, 0x46, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x7b, 0x0a, 0x1d, 0x4c, - 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, - 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, - 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x31, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, - 0x52, 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x22, 0x3b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x49, 0x64, 0x22, 0x77, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2f, 0x0a, - 0x05, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x32, 0x0a, 0x06, 0x72, + 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x06, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x22, + 0x1f, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x7f, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, + 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x72, + 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x22, 0x88, - 0x03, 0x0a, 0x11, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x36, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, - 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, - 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x7b, 0x0a, 0x1e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, - 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x7e, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, - 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, - 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, - 0x73, 0x67, 0x12, 0x32, 0x0a, 0x06, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x06, - 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x22, 0x1f, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7f, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, - 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, - 0x73, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, - 0x07, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x22, 0x3d, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, - 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x49, 0x64, 0x22, 0x4a, 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, - 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, - 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, - 0x4d, 0x73, 0x67, 0x22, 0xc8, 0x01, 0x0a, 0x1b, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, + 0x73, 0x22, 0x3d, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x49, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x72, - 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, - 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x65, 0x6e, 0x76, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x22, 0xf2, - 0x01, 0x0a, 0x1c, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, - 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, - 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, - 0x75, 0x62, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x5f, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, - 0x68, 0x65, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x22, 0x55, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x78, 0x0a, 0x1f, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, - 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x73, 0x22, 0x5a, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, - 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, - 0x67, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, - 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x63, - 0x70, 0x75, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, - 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, - 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, - 0x73, 0x67, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x3c, 0x0a, - 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x67, 0x0a, 0x12, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, - 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, - 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, - 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, - 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3d, 0x0a, - 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x22, 0x4a, 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x5e, 0x0a, 0x19, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, - 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, - 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x22, 0x6f, 0x0a, 0x1a, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xc8, 0x01, 0x0a, + 0x1b, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, + 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x0d, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x22, 0xf2, 0x01, 0x0a, 0x1c, 0x4c, 0x61, 0x75, 0x6e, + 0x63, 0x68, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, + 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, + 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x10, 0x0a, + 0x03, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, + 0x23, 0x0a, 0x0d, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x55, 0x0a, 0x1e, + 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x22, 0x78, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, + 0x2c, 0x0a, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x5a, 0x0a, + 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x21, + 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x21, + 0x0a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x22, 0x83, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, + 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x39, 0x0a, 0x0a, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x3c, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x70, + 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, + 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x67, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, + 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x4b, 0x0a, - 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, - 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0x97, 0x01, 0x0a, 0x1b, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, - 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, - 0x4d, 0x73, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, - 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x04, 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, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x65, 0x73, 0x41, 0x74, 0x22, 0x32, 0x0a, 0x1a, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, - 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x46, 0x0a, 0x1b, 0x52, 0x65, 0x76, 0x6f, - 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, - 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, - 0x22, 0x4a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, - 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, - 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0xb0, 0x01, 0x0a, - 0x1a, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, - 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, - 0x72, 0x4d, 0x73, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, - 0x61, 0x74, 0x18, 0x05, 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, - 0x4c, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, - 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x71, 0x0a, - 0x18, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, - 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, - 0x73, 0x67, 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, - 0x22, 0x94, 0x05, 0x0a, 0x14, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, - 0x72, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, - 0x55, 0x72, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, - 0x72, 0x70, 0x63, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x12, - 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, - 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x74, 0x6c, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, - 0x70, 0x63, 0x54, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, - 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, - 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, - 0x1a, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x11, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6d, - 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x69, - 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x19, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x61, 0x63, 0x68, 0x65, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, - 0x12, 0x35, 0x0a, 0x07, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, - 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0xe2, 0x01, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, - 0x0a, 0x0e, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x75, 0x73, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x73, 0x61, 0x67, - 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x68, - 0x6f, 0x6f, 0x6b, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x45, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x6f, - 0x6b, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, - 0x6f, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2e, 0x0a, 0x13, - 0x62, 0x69, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, - 0x70, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x62, 0x69, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x50, 0x63, 0x74, 0x22, 0xc7, 0x01, 0x0a, - 0x14, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x12, 0x35, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x53, 0x69, 0x6e, 0x6b, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, - 0x65, 0x74, 0x72, 0x79, 0x53, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x18, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x53, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0xba, 0x04, 0x0a, 0x10, 0x4a, - 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2f, - 0x0a, 0x13, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x6f, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, - 0x72, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x63, 0x68, 0x12, - 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x08, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x08, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, - 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x66, - 0x6c, 0x69, 0x67, 0x68, 0x74, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x66, 0x6c, - 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x09, 0x70, 0x72, 0x65, 0x66, 0x6c, - 0x69, 0x67, 0x68, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, - 0x6f, 0x72, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x4d, - 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x70, 0x75, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x67, 0x70, 0x75, 0x49, - 0x64, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x6c, - 0x6f, 0x74, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6c, 0x6f, 0x74, 0x50, - 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3e, 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x19, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, 0xf9, 0x01, 0x0a, 0x11, 0x4a, 0x6f, 0x69, 0x6e, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, - 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, - 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, - 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x3b, 0x0a, 0x09, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, - 0x72, 0x61, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, - 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, - 0x72, 0x61, 0x70, 0x22, 0x6f, 0x0a, 0x13, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x66, - 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, - 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, - 0x72, 0x69, 0x74, 0x79, 0x22, 0xb9, 0x03, 0x0a, 0x0a, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x49, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, - 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, - 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, - 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, - 0x21, 0x0a, 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x22, 0x67, 0x0a, 0x26, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xc8, 0x01, 0x0a, 0x27, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, - 0x6f, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x19, - 0x0a, 0x08, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x61, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, - 0x72, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x65, 0x70, 0x68, 0x65, 0x6d, - 0x65, 0x72, 0x61, 0x6c, 0x22, 0x39, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, - 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, - 0x6f, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, - 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, - 0x4d, 0x73, 0x67, 0x12, 0x2b, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, - 0x22, 0xad, 0x02, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x49, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x78, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x47, 0x0a, - 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x1a, 0x38, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x72, 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, - 0x22, 0x49, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, - 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x8a, 0x06, 0x0a, 0x0f, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6c, 0x6f, 0x74, 0x12, - 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, - 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, - 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x61, 0x73, 0x73, 0x69, - 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x70, - 0x75, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x72, 0x65, 0x66, - 0x69, 0x78, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, - 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6c, - 0x6f, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3e, 0x0a, 0x1b, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, - 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, - 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, - 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x2b, - 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, - 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x77, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, - 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, - 0x64, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x70, 0x6f, - 0x6f, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x14, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x50, 0x6f, 0x6f, 0x6c, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, - 0x69, 0x74, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, - 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x69, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x53, 0x65, 0x74, 0x22, 0x35, 0x0a, 0x12, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, - 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, - 0x9b, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, - 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, - 0x12, 0x2b, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x2e, 0x0a, - 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x22, 0xb7, 0x01, - 0x0a, 0x0e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x55, - 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x22, 0xb4, 0x04, 0x0a, 0x13, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, - 0x2e, 0x0a, 0x13, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x75, 0x6e, 0x69, - 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x12, - 0x2e, 0x0a, 0x13, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x70, - 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, - 0x24, 0x0a, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, - 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, - 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x34, 0x0a, - 0x16, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x63, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x73, 0x65, 0x64, - 0x5f, 0x6d, 0x62, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x6b, 0x55, - 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x22, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x64, 0x69, - 0x73, 0x6b, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x24, 0x0a, 0x0e, 0x64, 0x69, 0x73, - 0x6b, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, 0x12, - 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x21, 0x0a, 0x0c, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, - 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3e, - 0x0a, 0x0c, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0d, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x52, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xa1, - 0x02, 0x0a, 0x10, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, - 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x38, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x72, - 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, 0x22, 0xd0, 0x01, 0x0a, 0x15, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, - 0x6d, 0x65, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2b, 0x0a, - 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x36, 0x0a, 0x07, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x06, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x41, 0x0a, 0x16, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, - 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, - 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x8c, 0x04, 0x0a, 0x07, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, - 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x63, - 0x61, 0x6c, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x41, 0x75, - 0x74, 0x68, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x65, 0x70, 0x61, - 0x6c, 0x69, 0x76, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, - 0x4b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0f, 0x6d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0e, 0x6d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x22, 0xed, 0x05, 0x0a, 0x0e, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, - 0x75, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, - 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, - 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, - 0x52, 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x77, 0x6f, - 0x72, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, - 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x61, 0x63, 0x68, - 0x65, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x55, 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, - 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x61, 0x63, 0x68, 0x65, - 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x61, 0x63, 0x68, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, - 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, - 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, - 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x65, - 0x64, 0x4d, 0x62, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x20, 0x0a, 0x0c, 0x64, - 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x22, 0x0a, - 0x0d, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4d, - 0x62, 0x12, 0x24, 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, - 0x70, 0x63, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x6b, 0x55, - 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, 0x12, 0x3e, 0x0a, 0x0c, 0x70, 0x61, 0x74, 0x68, 0x5f, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, - 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0b, 0x70, 0x61, 0x74, 0x68, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xb2, 0x01, 0x0a, 0x12, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x64, - 0x5f, 0x6d, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x64, 0x4d, - 0x62, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x07, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x21, 0x0a, 0x0c, - 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0b, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x62, 0x12, - 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x08, 0x75, 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, 0x22, 0x48, 0x0a, 0x13, - 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x27, 0x0a, + 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3d, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, + 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, + 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x5e, 0x0a, 0x19, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, + 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, + 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6d, 0x61, 0x78, + 0x53, 0x70, 0x65, 0x6e, 0x64, 0x22, 0x6f, 0x0a, 0x1a, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, + 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, + 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, + 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x4b, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x74, 0x74, 0x6c, 0x22, 0x97, 0x01, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, + 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, + 0x18, 0x04, 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0x32, 0x0a, + 0x1a, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x22, 0x46, 0x0a, 0x1b, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, + 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, + 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x4a, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0xb0, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, + 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x18, 0x0a, + 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, 0x0a, + 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x05, 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, 0x65, + 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0x4c, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, + 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xe3, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, - 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x08, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x04, 0x67, 0x70, 0x75, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x47, 0x70, 0x75, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x67, - 0x70, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x47, 0x70, 0x75, 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, - 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x33, 0x0a, 0x14, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0xa9, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x71, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, + 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, + 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2c, 0x0a, 0x08, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, + 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x94, 0x05, 0x0a, 0x14, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, + 0x74, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, 0x55, 0x72, 0x6c, 0x12, 0x2a, 0x0a, 0x11, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x68, 0x6f, 0x73, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x47, 0x72, 0x70, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, + 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, + 0x67, 0x72, 0x70, 0x63, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x54, 0x6c, 0x73, 0x12, 0x21, + 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, + 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x10, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x69, + 0x70, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x10, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x69, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x39, 0x0a, 0x19, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x09, + 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, + 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, + 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x12, 0x35, 0x0a, 0x07, 0x62, 0x69, 0x6c, + 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, + 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, + 0x22, 0xe2, 0x01, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, + 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x75, 0x73, 0x61, 0x67, 0x65, + 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x75, 0x73, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x73, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x2c, 0x0a, 0x12, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x65, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x73, + 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x26, 0x0a, + 0x0f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x62, 0x69, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x11, 0x62, 0x69, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x50, 0x63, 0x74, 0x22, 0xc7, 0x01, 0x0a, 0x14, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, + 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, + 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x35, 0x0a, + 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x74, 0x72, 0x79, 0x53, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, + 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x53, 0x69, 0x6e, + 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, + 0x81, 0x01, 0x0a, 0x18, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, + 0x72, 0x79, 0x53, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x23, + 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x22, 0xba, 0x04, 0x0a, 0x10, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6a, 0x6f, 0x69, 0x6e, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6a, 0x6f, + 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2f, 0x0a, 0x13, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x46, 0x69, 0x6e, + 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x6f, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x63, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x63, 0x70, 0x75, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, + 0x6d, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x4d, 0x62, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x3a, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x18, 0x0a, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x52, 0x09, 0x70, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x12, 0x20, 0x0a, + 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x63, + 0x70, 0x75, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x70, 0x75, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0e, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x06, 0x67, 0x70, 0x75, 0x49, 0x64, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6c, 0x6f, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x3e, 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, + 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, + 0x22, 0xf9, 0x01, 0x0a, 0x11, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, + 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1f, + 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x3b, 0x0a, 0x09, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x22, 0x6f, 0x0a, 0x13, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x22, 0xb9, 0x03, + 0x0a, 0x0a, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, + 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, + 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x67, 0x0a, 0x26, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, + 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, + 0x72, 0x74, 0x22, 0xc8, 0x01, 0x0a, 0x27, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, + 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x68, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x75, 0x74, 0x68, 0x4b, + 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x75, 0x72, + 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x55, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x39, 0x0a, + 0x16, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2b, 0x0a, 0x06, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x22, 0xad, 0x02, 0x0a, 0x1d, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x47, 0x0a, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x74, + 0x74, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x1a, + 0x38, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x72, 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, 0x22, 0x49, 0x0a, 0x1e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, - 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2a, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x55, 0x72, 0x6c, 0x12, 0x32, - 0x0a, 0x15, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x72, 0x61, 0x6e, - 0x63, 0x68, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x12, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x52, 0x0a, - 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0x40, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, - 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, - 0x4d, 0x73, 0x67, 0x22, 0xb6, 0x02, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, 0x0a, - 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, - 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x07, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, - 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x13, 0x0a, 0x11, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x65, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, - 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, - 0x12, 0x26, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x33, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x64, 0x0a, - 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x72, 0x4d, 0x73, 0x67, 0x22, 0x8a, 0x06, 0x0a, 0x0f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, + 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, + 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, + 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, + 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x70, 0x75, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x21, 0x0a, 0x0c, 0x77, + 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x33, + 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x70, + 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6c, 0x6f, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x3e, 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x63, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, + 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x57, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x73, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x13, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, + 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x21, + 0x0a, 0x0c, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x15, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x53, 0x65, + 0x74, 0x22, 0x35, 0x0a, 0x12, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x9b, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, + 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2b, 0x0a, 0x06, 0x72, 0x6f, 0x75, + 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x06, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6c, 0x6f, 0x74, 0x52, + 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x22, 0xb7, 0x01, 0x0a, 0x0e, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, + 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, + 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x75, 0x6e, + 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, + 0x22, 0xb4, 0x04, 0x0a, 0x13, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x70, 0x75, 0x5f, + 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x26, + 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, + 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, + 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, 0x20, 0x0a, 0x0c, + 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x22, + 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x4d, 0x62, 0x12, 0x24, 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, + 0x5f, 0x70, 0x63, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x6b, + 0x55, 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, + 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x77, 0x6f, 0x72, + 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x47, + 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x0c, 0x70, 0x61, 0x74, 0x68, 0x5f, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, + 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0b, 0x70, 0x61, 0x74, 0x68, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xa1, 0x02, 0x0a, 0x10, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, + 0x2e, 0x41, 0x74, 0x74, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x61, 0x74, 0x74, + 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, + 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, + 0x6e, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x1a, 0x38, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x72, 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, 0x22, 0xd0, 0x01, 0x0a, 0x15, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2b, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x04, 0x6c, + 0x6f, 0x67, 0x73, 0x12, 0x36, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x41, + 0x0a, 0x16, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, + 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, + 0x67, 0x22, 0x8c, 0x04, 0x0a, 0x07, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, + 0x03, 0x63, 0x70, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, + 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, + 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, + 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x75, 0x72, 0x6c, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x63, 0x61, 0x6c, + 0x65, 0x55, 0x72, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x63, 0x61, 0x6c, + 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, 0x12, 0x25, 0x0a, 0x0e, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x4b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, + 0x76, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x40, 0x0a, 0x0f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x52, 0x0e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, + 0x22, 0xed, 0x05, 0x0a, 0x0e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, + 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x11, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x70, 0x75, + 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x70, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, + 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x66, + 0x72, 0x65, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, + 0x5f, 0x70, 0x63, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x55, 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x26, + 0x0a, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x70, + 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x26, 0x0a, 0x0f, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x20, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x73, 0x65, + 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x6b, + 0x55, 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x22, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x64, + 0x69, 0x73, 0x6b, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x24, 0x0a, 0x0e, 0x64, 0x69, + 0x73, 0x6b, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, + 0x12, 0x3e, 0x0a, 0x0c, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x52, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x22, 0xb2, 0x01, 0x0a, 0x12, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x61, 0x74, 0x68, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x62, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x61, 0x67, + 0x65, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x75, 0x73, 0x61, + 0x67, 0x65, 0x50, 0x63, 0x74, 0x22, 0x48, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, + 0xe3, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, + 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, + 0x67, 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, + 0x3b, 0x0a, 0x04, 0x67, 0x70, 0x75, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x47, 0x70, 0x75, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x67, 0x70, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, + 0x47, 0x70, 0x75, 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, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x33, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xa9, 0x02, 0x0a, 0x15, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2a, 0x0a, + 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x55, 0x72, 0x6c, 0x12, 0x32, 0x0a, 0x15, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x30, 0x0a, 0x14, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x27, 0x0a, + 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x52, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, + 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x40, 0x0a, 0x15, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xb6, 0x02, 0x0a, + 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, + 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, + 0x65, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, + 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 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, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 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, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x65, 0x0a, 0x12, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, + 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x22, 0x33, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x64, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, + 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, + 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x24, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x0a, 0x12, + 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x22, 0x64, 0x0a, + 0x13, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x24, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x0a, 0x12, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, + 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x49, 0x64, 0x22, 0x64, 0x0a, 0x13, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, + 0x65, 0x6e, 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, - 0x72, 0x4d, 0x73, 0x67, 0x12, 0x24, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x0a, 0x12, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x13, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x72, 0x4d, 0x73, 0x67, 0x22, 0x83, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, + 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x72, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x72, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x69, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x22, 0x4b, 0x0a, 0x0e, 0x47, 0x65, + 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, + 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, + 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x14, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x67, 0x0a, + 0x13, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x27, 0x0a, + 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x07, 0x77, + 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x22, 0x32, 0x0a, 0x13, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, + 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3f, 0x0a, 0x14, 0x43, 0x6f, + 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x83, 0x01, 0x0a, 0x0d, - 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, - 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x75, - 0x72, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, - 0x72, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x65, - 0x6c, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x53, 0x68, 0x65, 0x6c, - 0x6c, 0x22, 0x4b, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x10, 0x0a, 0x03, - 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x14, - 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x67, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, - 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, - 0x72, 0x4d, 0x73, 0x67, 0x12, 0x27, 0x0a, 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x65, 0x72, 0x52, 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x22, 0x32, 0x0a, - 0x13, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x34, 0x0a, 0x15, 0x55, + 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, - 0x64, 0x22, 0x3f, 0x0a, 0x14, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, - 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, - 0x73, 0x67, 0x22, 0x34, 0x0a, 0x15, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, - 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, - 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x22, 0x41, 0x0a, 0x16, 0x55, 0x6e, 0x63, 0x6f, - 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x31, 0x0a, 0x12, 0x44, - 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3e, - 0x0a, 0x13, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x1e, - 0x0a, 0x1c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc6, - 0x02, 0x0a, 0x1d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, 0x74, 0x70, - 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x6f, 0x72, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, 0x54, - 0x6c, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, - 0x70, 0x63, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2a, - 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x70, - 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, - 0x63, 0x54, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0xae, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, - 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x15, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x41, 0x74, - 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x22, 0x4a, 0x0a, 0x1f, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, + 0x64, 0x22, 0x41, 0x0a, 0x16, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, + 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, - 0x72, 0x4d, 0x73, 0x67, 0x2a, 0x43, 0x0a, 0x1f, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x57, 0x52, 0x49, 0x54, 0x45, - 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, 0x12, 0x09, - 0x0a, 0x05, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x02, 0x32, 0x95, 0x3d, 0x0a, 0x0e, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x09, - 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0f, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, - 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x12, 0x5f, 0x0a, 0x0b, 0x53, 0x69, 0x67, - 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x72, 0x4d, 0x73, 0x67, 0x22, 0x31, 0x0a, 0x12, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, + 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, + 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x13, 0x44, 0x72, 0x61, 0x69, 0x6e, + 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, + 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x1e, 0x0a, 0x1c, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc6, 0x02, 0x0a, 0x1d, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, + 0x70, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, 0x74, + 0x70, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, 0x54, 0x6c, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x68, 0x6f, 0x73, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, + 0x72, 0x70, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x50, + 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, + 0x72, 0x70, 0x63, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x54, 0x6c, 0x73, 0x12, 0x21, 0x0a, + 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, + 0x22, 0xae, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x31, + 0x0a, 0x15, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x75, 0x6e, + 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x41, 0x74, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, + 0x6f, 0x22, 0x4a, 0x0a, 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x2a, 0x43, 0x0a, + 0x1f, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x09, 0x0a, 0x05, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x44, + 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x4f, 0x56, 0x45, 0x44, + 0x10, 0x02, 0x32, 0x95, 0x3d, 0x0a, 0x0e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x65, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x11, 0x22, 0x0f, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x65, 0x12, 0x5f, 0x0a, 0x0b, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x69, 0x67, 0x6e, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x73, + 0x69, 0x67, 0x6e, 0x12, 0x5e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x48, 0x65, 0x61, 0x64, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x68, 0x61, + 0x73, 0x68, 0x7d, 0x12, 0x60, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x12, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x4c, 0x0a, 0x0f, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x75, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x28, 0x01, 0x12, 0x62, 0x0a, 0x13, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, + 0x77, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x22, 0x1f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x54, 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x22, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x54, + 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x53, 0x0a, 0x07, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x6e, 0x64, 0x54, 0x61, + 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, - 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x5e, 0x0a, 0x0a, 0x48, 0x65, - 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x48, - 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x68, 0x61, 0x73, 0x68, 0x7d, 0x12, 0x60, 0x0a, 0x0c, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1c, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, - 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x4c, 0x0a, 0x0f, - 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, - 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x62, 0x0a, 0x13, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x12, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, - 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, - 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x77, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x22, 0x1f, - 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, - 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x54, 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x22, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x54, 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, - 0x5b, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, - 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x53, 0x0a, 0x07, - 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x18, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x6e, 0x64, 0x54, 0x61, - 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2f, 0x65, 0x6e, - 0x64, 0x12, 0x5a, 0x0a, 0x09, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x19, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, - 0x22, 0x0b, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x52, 0x0a, - 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x74, 0x61, 0x73, 0x6b, - 0x73, 0x12, 0x67, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x53, 0x74, 0x75, 0x62, 0x12, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, - 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, - 0x01, 0x2a, 0x22, 0x06, 0x2f, 0x73, 0x74, 0x75, 0x62, 0x73, 0x12, 0x5f, 0x0a, 0x0a, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x73, - 0x74, 0x75, 0x62, 0x73, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x57, 0x0a, 0x06, 0x47, - 0x65, 0x74, 0x55, 0x52, 0x4c, 0x12, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, - 0x2f, 0x73, 0x74, 0x75, 0x62, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x75, 0x72, 0x6c, 0x12, 0x6a, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, - 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, - 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x16, 0x2f, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, - 0x74, 0x6f, 0x70, 0x12, 0x75, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x70, 0x6c, + 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2f, 0x65, 0x6e, 0x64, 0x12, 0x5a, 0x0a, 0x09, 0x53, 0x74, + 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x52, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x08, 0x12, 0x06, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x67, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x12, 0x1f, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, 0x2f, 0x73, 0x74, + 0x75, 0x62, 0x73, 0x12, 0x5f, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, + 0x62, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, + 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x73, 0x74, 0x75, 0x62, 0x73, 0x2f, 0x64, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x57, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x12, 0x16, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x73, 0x74, 0x75, 0x62, 0x73, 0x2f, + 0x7b, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x72, 0x6c, 0x12, 0x6a, 0x0a, + 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x6f, + 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x22, 0x16, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x75, 0x0a, 0x0f, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x22, 0x17, 0x2f, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x12, 0x78, 0x0a, 0x0f, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x19, 0x22, 0x17, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x78, 0x0a, 0x0f, 0x53, 0x63, - 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1f, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, - 0x63, 0x61, 0x6c, 0x65, 0x12, 0x72, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x2a, 0x11, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x52, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, - 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x6b, 0x0a, 0x0e, - 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x12, 0x1e, + 0x79, 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x72, 0x0a, + 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x2a, 0x11, + 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, + 0x7d, 0x12, 0x52, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, - 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, - 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x70, 0x6f, 0x6f, - 0x6c, 0x73, 0x3a, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x12, 0x77, 0x0a, 0x12, 0x4c, 0x61, 0x75, - 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, - 0x22, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, - 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x61, - 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, + 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x6b, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, + 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, - 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x3a, 0x6c, 0x61, 0x75, 0x6e, - 0x63, 0x68, 0x12, 0x6f, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, - 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x12, 0x69, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, - 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, - 0x2a, 0x22, 0x0b, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x62, 0x79, 0x6f, 0x63, 0x12, 0x69, - 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1b, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, - 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, - 0x12, 0x17, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x62, 0x79, 0x6f, 0x63, 0x12, 0x78, 0x0a, 0x0d, 0x53, 0x63, 0x61, - 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, - 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, - 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, - 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x62, 0x79, 0x6f, 0x63, 0x2f, 0x73, 0x63, - 0x61, 0x6c, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, + 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x3a, 0x6f, 0x66, 0x66, 0x65, + 0x72, 0x73, 0x12, 0x77, 0x0a, 0x12, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, + 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, + 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x70, + 0x6f, 0x6f, 0x6c, 0x73, 0x3a, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x12, 0x6f, 0x0a, 0x10, 0x4c, + 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, + 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x70, + 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x69, 0x0a, 0x0e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1e, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, + 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, + 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x70, 0x6f, 0x6f, + 0x6c, 0x73, 0x2f, 0x62, 0x79, 0x6f, 0x63, 0x12, 0x69, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x42, 0x59, + 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x47, 0x65, 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, + 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, + 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x62, 0x79, + 0x6f, 0x63, 0x12, 0x78, 0x0a, 0x0d, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, + 0x6f, 0x6f, 0x6c, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, + 0x61, 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, + 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x2f, 0x62, 0x79, 0x6f, 0x63, 0x2f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x91, 0x01, 0x0a, + 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x9e, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x12, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, - 0x22, 0x15, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x9e, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x9b, 0x01, 0x0a, 0x18, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x29, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x24, 0x2a, 0x22, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x8b, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, 0x2f, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, + 0x7d, 0x12, 0x9b, 0x01, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x28, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, + 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x2a, 0x22, 0x2f, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x12, + 0x8b, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0xae, 0x01, + 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x29, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, + 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x3a, 0x01, 0x2a, 0x22, 0x2f, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0xae, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x12, 0x29, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x34, 0x3a, 0x01, 0x2a, 0x22, 0x2f, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x83, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x12, - 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, + 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x83, + 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x13, - 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, - 0x66, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, - 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x8d, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, + 0x13, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6f, 0x66, + 0x66, 0x65, 0x72, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, + 0x20, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6f, 0x66, + 0x66, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, + 0x7d, 0x12, 0x8d, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, - 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, - 0x61, 0x6c, 0x73, 0x12, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, - 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, - 0x6c, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x27, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, + 0x73, 0x12, 0x87, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x12, 0x26, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, + 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x17, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x2a, 0x20, 0x2f, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x2f, - 0x7b, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x97, 0x01, 0x0a, 0x14, - 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, - 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6e, 0x74, 0x61, - 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, - 0x6c, 0x73, 0x2f, 0x7b, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, - 0x61, 0x75, 0x6e, 0x63, 0x68, 0x12, 0xa1, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x73, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, + 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x22, 0x2a, 0x20, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x2f, 0x7b, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, + 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x97, 0x01, 0x0a, 0x14, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, + 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x24, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, + 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x61, + 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x2f, 0x7b, 0x72, 0x65, 0x6e, + 0x74, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x12, 0xa1, + 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x12, 0x2b, 0x2f, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x15, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, + 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x12, 0x2b, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x12, 0x33, 0x2f, 0x70, 0x6f, 0x6f, - 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, - 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1a, 0x2e, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x35, 0x12, 0x33, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, + 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, + 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, 0x2f, 0x70, 0x6f, 0x6f, + 0x6c, 0x73, 0x12, 0x5c, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, + 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, + 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0f, 0x2a, 0x0d, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, + 0x12, 0x7e, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x70, 0x6f, 0x6f, + 0x6c, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, + 0x12, 0x8b, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, + 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, + 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, - 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, - 0x2a, 0x22, 0x06, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x5c, 0x0a, 0x0a, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x2a, 0x0d, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, - 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x7e, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x22, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, - 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, - 0x2a, 0x22, 0x14, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, - 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x12, 0x8b, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, - 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x86, 0x01, 0x0a, 0x13, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, - 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, - 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x76, - 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, - 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, - 0x2d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x12, 0x89, - 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x22, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x22, 0x1f, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, - 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, - 0x69, 0x6e, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x7c, 0x0a, 0x10, 0x4c, 0x69, - 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x20, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, - 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x70, 0x6f, - 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, - 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x5a, 0x0a, 0x09, 0x4a, 0x6f, 0x69, 0x6e, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, - 0x6a, 0x6f, 0x69, 0x6e, 0x12, 0xac, 0x01, 0x0a, 0x1f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x72, - 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x2f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x12, 0x73, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x72, 0x6f, 0x75, - 0x74, 0x65, 0x73, 0x3a, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x8a, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, - 0x14, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2f, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, - 0x79, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, + 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, + 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x86, + 0x01, 0x0a, 0x13, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, + 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, + 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x70, + 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, + 0x2f, 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x12, 0x89, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x50, + 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x22, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, 0x6c, + 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, + 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, + 0x01, 0x2a, 0x22, 0x1f, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x12, 0x7c, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, + 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x73, 0x12, 0x5a, 0x0a, 0x09, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, + 0x22, 0x0b, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x12, 0xac, 0x01, + 0x0a, 0x1f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, + 0x6c, 0x12, 0x2f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, + 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, + 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, + 0x1b, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, + 0x74, 0x2d, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x73, 0x0a, 0x0f, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, + 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x3a, 0x6c, 0x69, 0x73, + 0x74, 0x12, 0x8a, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x26, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x8c, + 0x01, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, - 0x13, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x12, 0x4a, 0x0a, 0x0b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, - 0x12, 0x59, 0x0a, 0x14, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, - 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x0c, 0x4c, - 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, - 0x12, 0x09, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x64, 0x0a, 0x0d, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0e, 0x3a, 0x01, 0x2a, 0x22, 0x09, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x73, 0x12, 0x6e, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x6d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, - 0x7d, 0x12, 0x56, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, - 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, - 0x12, 0x07, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x0b, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x22, 0x07, 0x2f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x6b, 0x0a, 0x0b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, - 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, - 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x19, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, - 0x7b, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x74, 0x6f, 0x67, 0x67, 0x6c, - 0x65, 0x12, 0x64, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, 0x7b, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x5a, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x77, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x73, 0x12, 0x70, 0x0a, 0x0c, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, - 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x64, - 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x1b, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, - 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x12, 0x78, 0x0a, 0x0e, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, - 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, - 0x22, 0x1d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x12, - 0x6c, 0x0a, 0x0b, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1b, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, - 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1c, 0x22, 0x1a, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x12, 0x81, 0x01, - 0x0a, 0x15, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x4a, 0x0a, + 0x0b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x59, 0x0a, 0x14, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, + 0x79, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x73, 0x12, 0x64, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x3a, 0x01, 0x2a, 0x22, + 0x09, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x6e, 0x0a, 0x0d, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x56, 0x0a, 0x0a, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x09, 0x22, 0x07, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x6b, 0x0a, + 0x0b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, + 0x19, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, 0x7b, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x12, 0x64, 0x0a, 0x0b, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, 0x7b, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x7d, + 0x12, 0x5a, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, + 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x70, 0x0a, 0x0c, + 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, + 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1d, 0x22, 0x1b, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, + 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x12, 0x78, + 0x0a, 0x0e, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, + 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x6e, 0x63, 0x6f, 0x72, + 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x6e, 0x63, 0x6f, 0x72, + 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, + 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x75, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x12, 0x6c, 0x0a, 0x0b, 0x44, 0x72, 0x61, 0x69, + 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, + 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x22, 0x1a, 0x2f, 0x77, 0x6f, 0x72, + 0x6b, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x12, 0x81, 0x01, 0x0a, 0x15, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, - 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x42, 0x23, 0x5a, 0x21, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x62, 0x65, 0x61, 0x6d, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x62, 0x65, 0x74, 0x61, 0x39, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x23, 0x5a, 0x21, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x65, 0x61, 0x6d, 0x2d, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x2f, 0x62, 0x65, 0x74, 0x61, 0x39, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/types.pb.go b/proto/types.pb.go index 70d2bb033..fbb38cc08 100644 --- a/proto/types.pb.go +++ b/proto/types.pb.go @@ -3,7 +3,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.25.1 +// protoc v3.21.12 // source: types.proto package proto @@ -698,6 +698,7 @@ type ContainerRequest struct { MachineId string `protobuf:"bytes,34,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` CheckpointTrigger *CheckpointTrigger `protobuf:"bytes,35,opt,name=checkpoint_trigger,json=checkpointTrigger,proto3" json:"checkpoint_trigger,omitempty"` TaskId string `protobuf:"bytes,36,opt,name=task_id,json=taskId,proto3" json:"task_id,omitempty"` + GpuVirtualized bool `protobuf:"varint,37,opt,name=gpu_virtualized,json=gpuVirtualized,proto3" json:"gpu_virtualized,omitempty"` } func (x *ContainerRequest) Reset() { @@ -984,6 +985,13 @@ func (x *ContainerRequest) GetTaskId() string { return "" } +func (x *ContainerRequest) GetGpuVirtualized() bool { + if x != nil { + return x.GpuVirtualized + } + return false +} + type ContainerState struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2919,7 +2927,7 @@ var file_types_proto_rawDesc = []byte{ 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xd3, 0x0a, 0x0a, 0x10, 0x43, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xfc, 0x0a, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, @@ -3005,308 +3013,310 @@ var file_types_proto_rawDesc = []byte{ 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x22, 0xde, 0x02, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, - 0x03, 0x67, 0x70, 0x75, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, - 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x63, 0x70, 0x75, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, - 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, - 0x64, 0x22, 0x78, 0x0a, 0x16, 0x44, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x6b, - 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, - 0x69, 0x7a, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x22, 0xda, 0x01, 0x0a, 0x08, - 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, - 0x69, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, - 0x44, 0x69, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, - 0x6f, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, - 0x6f, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x70, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x59, 0x0a, 0x0f, 0x46, 0x69, 0x6c, 0x65, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x2c, 0x0a, 0x05, 0x72, - 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x22, 0x40, 0x0a, 0x12, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0x6f, 0x0a, 0x0f, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x12, 0x27, 0x0a, 0x0f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x64, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x67, 0x70, 0x75, 0x56, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x22, 0xde, 0x02, 0x0a, 0x0e, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x22, 0x78, 0x0a, 0x16, 0x44, 0x75, + 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x6b, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1e, 0x0a, 0x0a, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x0a, 0x06, + 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x22, 0xda, 0x01, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x44, 0x69, 0x72, 0x12, 0x12, 0x0a, 0x04, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, + 0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x59, 0x0a, 0x0f, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x12, 0x2c, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x05, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x40, 0x0a, 0x12, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2b, 0x0a, 0x03, 0x65, 0x6e, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x46, - 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x58, 0x0a, 0x10, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x30, - 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, - 0x22, 0xa7, 0x02, 0x0a, 0x05, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x69, 0x6e, 0x6b, - 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x69, 0x6e, - 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, - 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, - 0x6c, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x45, 0x0a, 0x12, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x40, 0x0a, 0x0c, 0x64, 0x75, 0x72, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, - 0x73, 0x6b, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x64, - 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x6b, 0x22, 0xf3, 0x01, 0x0a, 0x10, 0x4d, - 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, - 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, - 0x0a, 0x0c, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x72, - 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, - 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, - 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, - 0x70, 0x61, 0x74, 0x68, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x53, 0x74, 0x79, 0x6c, 0x65, - 0x22, 0x50, 0x0a, 0x08, 0x4e, 0x75, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x04, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 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, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x22, 0xbf, 0x01, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, - 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, - 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x77, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 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, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x22, 0xb0, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, - 0x5f, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6d, - 0x61, 0x78, 0x49, 0x6e, 0x46, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, - 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x6f, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x6f, 0x73, - 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x0b, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x38, 0x0a, - 0x19, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x64, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x15, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, - 0x67, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, - 0x70, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x6d, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x63, 0x6d, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x77, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x63, 0x77, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x69, - 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, - 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x83, 0x03, 0x0a, 0x04, 0x53, 0x74, 0x75, 0x62, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x0a, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0xa7, 0x01, 0x0a, - 0x0f, 0x53, 0x74, 0x75, 0x62, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, - 0x12, 0x1f, 0x0a, 0x04, 0x73, 0x74, 0x75, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x75, 0x62, 0x52, 0x04, 0x73, 0x74, 0x75, - 0x62, 0x12, 0x2e, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x25, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1c, 0x0a, 0x03, 0x61, 0x70, 0x70, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x70, - 0x70, 0x52, 0x03, 0x61, 0x70, 0x70, 0x22, 0x8a, 0x05, 0x0a, 0x06, 0x57, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x72, 0x65, 0x65, 0x43, 0x70, 0x75, 0x12, 0x1f, 0x0a, 0x0b, - 0x66, 0x72, 0x65, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0a, 0x66, 0x72, 0x65, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x24, 0x0a, - 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, - 0x64, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, - 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x72, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x20, - 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x11, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x52, 0x10, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x23, - 0x0a, 0x0d, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, - 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x22, 0xe6, 0x03, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x50, 0x6f, - 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x2d, 0x0a, 0x12, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x61, - 0x74, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x19, - 0x0a, 0x08, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x07, 0x66, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x72, 0x65, - 0x65, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x72, 0x65, - 0x65, 0x43, 0x70, 0x75, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x66, 0x72, 0x65, 0x65, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, - 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x2b, - 0x0a, 0x11, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x70, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x72, - 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x8f, 0x04, 0x0a, - 0x09, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0x6f, + 0x0a, 0x0f, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x12, 0x2b, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, + 0x58, 0x0a, 0x10, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x30, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x22, 0xa7, 0x02, 0x0a, 0x05, 0x4d, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, + 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x69, 0x6e, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1b, + 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x45, 0x0a, 0x12, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, + 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x10, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x40, 0x0a, 0x0c, 0x64, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x69, 0x73, + 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x44, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x6b, 0x4d, 0x6f, 0x75, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x64, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, + 0x69, 0x73, 0x6b, 0x22, 0xf3, 0x01, 0x0a, 0x10, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x69, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, + 0x28, 0x0a, 0x10, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x22, 0x50, 0x0a, 0x08, 0x4e, 0x75, 0x6c, + 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 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, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, - 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x47, 0x70, 0x75, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x49, 0x64, 0x12, 0x44, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x07, 0x73, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x22, 0xd3, - 0x02, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0xbf, 0x01, 0x0a, 0x06, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, + 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x06, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xb0, 0x01, + 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x22, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x5f, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x46, 0x6c, 0x69, + 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x73, 0x74, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x74, + 0x61, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x63, 0x6f, 0x73, 0x74, 0x50, + 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x38, 0x0a, 0x19, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, + 0x65, 0x72, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x73, 0x74, 0x50, + 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x73, + 0x22, 0x8c, 0x01, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, + 0x63, 0x6d, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x63, 0x6d, 0x64, 0x12, 0x10, + 0x0a, 0x03, 0x63, 0x77, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x63, 0x77, 0x64, + 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, + 0x6e, 0x76, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x22, + 0x83, 0x03, 0x0a, 0x04, 0x53, 0x74, 0x75, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, + 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, + 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, + 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x15, + 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0xa7, 0x01, 0x0a, 0x0f, 0x53, 0x74, 0x75, 0x62, 0x57, 0x69, + 0x74, 0x68, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x04, 0x73, 0x74, 0x75, + 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x53, 0x74, 0x75, 0x62, 0x52, 0x04, 0x73, 0x74, 0x75, 0x62, 0x12, 0x2e, 0x0a, 0x09, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x12, 0x1c, 0x0a, 0x03, 0x61, 0x70, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x52, 0x03, 0x61, 0x70, 0x70, 0x22, + 0x8a, 0x05, 0x0a, 0x06, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x12, + 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x67, 0x70, 0x75, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x72, + 0x65, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x72, + 0x65, 0x65, 0x43, 0x70, 0x75, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x66, 0x72, 0x65, 0x65, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, + 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, + 0x66, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x67, 0x70, 0x75, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, + 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x73, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x50, + 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, + 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, + 0x65, 0x65, 0x6d, 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3d, + 0x0a, 0x11, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x10, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x70, 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xe6, 0x03, 0x0a, + 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, + 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x72, 0x65, 0x65, 0x5f, + 0x67, 0x70, 0x75, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x66, 0x72, 0x65, 0x65, 0x47, + 0x70, 0x75, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x72, 0x65, 0x65, 0x43, 0x70, 0x75, 0x12, 0x1f, 0x0a, + 0x0b, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0a, 0x66, 0x72, 0x65, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x27, + 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x10, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x11, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x11, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x12, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x70, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x25, + 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x8f, 0x04, 0x0a, 0x09, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x39, - 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 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, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 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, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x42, 0x23, 0x5a, 0x21, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x62, 0x65, 0x61, 0x6d, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x62, 0x65, - 0x74, 0x61, 0x39, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x61, 0x6c, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x05, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, + 0x30, 0x0a, 0x14, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x47, 0x70, 0x75, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, + 0x14, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6e, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x49, 0x64, 0x12, + 0x44, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x07, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x22, 0xd3, 0x02, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, + 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, + 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x72, 0x6c, 0x12, + 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x09, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x23, 0x5a, + 0x21, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x65, 0x61, 0x6d, + 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x62, 0x65, 0x74, 0x61, 0x39, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/sdk/src/beta9/abstractions/base/runner.py b/sdk/src/beta9/abstractions/base/runner.py index 66095aa71..e6efef089 100644 --- a/sdk/src/beta9/abstractions/base/runner.py +++ b/sdk/src/beta9/abstractions/base/runner.py @@ -104,6 +104,7 @@ def __init__( gpu: Union[GpuTypeAlias, List[GpuTypeAlias]] = GpuType.NoGPU, gpu_count: int = 0, image: Image = Image(), + gpu_virtualized: bool = False, workers: int = 1, concurrent_requests: int = 1, keep_warm_seconds: float = 0.0, @@ -193,6 +194,7 @@ def __init__( self.checkpoint_readiness_timeout = checkpoint_readiness_timeout self.checkpoint_readiness_interval = checkpoint_readiness_interval self.docker_enabled = docker_enabled + self.gpu_virtualized = gpu_virtualized self.allow_marketplace = allow_marketplace self.is_service = False self.serving = ServingConfig.from_options( @@ -694,6 +696,7 @@ def _stub_request( memory=self.memory, gpu=self.gpu, gpu_count=self.gpu_count, + gpu_virtualized=self.gpu_virtualized, handler=self.handler, on_start=self.on_start, on_deploy=self.on_deploy.parent.handler if self.on_deploy else "", diff --git a/sdk/src/beta9/abstractions/pod.py b/sdk/src/beta9/abstractions/pod.py index a8e67175f..b538bc0fb 100644 --- a/sdk/src/beta9/abstractions/pod.py +++ b/sdk/src/beta9/abstractions/pod.py @@ -92,6 +92,9 @@ class Pod(RunnerAbstraction, DeployableMixin): gpu_count (int): The number of GPUs allocated to the pod. Default is 0. If a GPU is specified but this value is set to 0, it will be automatically updated to 1. + gpu_virtualized (bool): + If true, preserve GPU scheduling and image selection but do not expose physical GPU devices + inside the container. Default is False. image (Union[Image, dict]): The container image used for the task execution. Default is [Image](#image). volumes (Optional[List[Union[Volume, CloudBucket]]]): @@ -132,6 +135,7 @@ def __init__( gpu: Union[GpuTypeAlias, List[GpuTypeAlias]] = GpuType.NoGPU, gpu_count: int = 0, image: Image = Image(), + gpu_virtualized: bool = False, volumes: Optional[List[Union[Volume, CloudBucket]]] = None, disks: Optional[List[DurableDisk]] = None, secrets: Optional[List[str]] = None, @@ -159,6 +163,7 @@ def __init__( memory=memory, gpu=gpu, gpu_count=gpu_count, + gpu_virtualized=gpu_virtualized, image=image, volumes=volumes, disks=disks, diff --git a/sdk/src/beta9/abstractions/sandbox.py b/sdk/src/beta9/abstractions/sandbox.py index 3c424c55c..77420e1a0 100644 --- a/sdk/src/beta9/abstractions/sandbox.py +++ b/sdk/src/beta9/abstractions/sandbox.py @@ -150,6 +150,9 @@ class Sandbox(Pod): applicable or no GPU required, leave it empty. Default is [GpuType.NoGPU](#gputype). gpu_count (int): The number of GPUs to allocate. Default is 0. + gpu_virtualized (bool): + If true, preserve GPU scheduling and image selection but do not expose physical GPU devices + inside the sandbox. Default is False. image (Union[Image, dict]): The container image used for the task execution. Whatever you pass here will have an additional `add_python_packages` call with `["fastapi", "vllm", "huggingface_hub"]` added to it to ensure that we can run vLLM in the container. @@ -234,6 +237,7 @@ def __init__( gpu: Union[GpuTypeAlias, List[GpuTypeAlias]] = GpuType.NoGPU, gpu_count: int = 0, image: Image = Image(python_version="python3.11"), + gpu_virtualized: bool = False, keep_warm_seconds: int = 600, authorized: bool = False, name: Optional[str] = None, @@ -260,6 +264,7 @@ def __init__( memory=memory, gpu=gpu, gpu_count=gpu_count, + gpu_virtualized=gpu_virtualized, image=image, keep_warm_seconds=keep_warm_seconds, authorized=authorized, diff --git a/sdk/src/beta9/clients/gateway/__init__.py b/sdk/src/beta9/clients/gateway/__init__.py index 0ef709df2..6cde1673b 100644 --- a/sdk/src/beta9/clients/gateway/__init__.py +++ b/sdk/src/beta9/clients/gateway/__init__.py @@ -400,6 +400,7 @@ class GetOrCreateStubRequest(betterproto.Message): disks: List["DurableDisk"] = betterproto.message_field(44) allow_marketplace: bool = betterproto.bool_field(45) checkpoint_trigger: "_types__.CheckpointTrigger" = betterproto.message_field(46) + gpu_virtualized: bool = betterproto.bool_field(47) @dataclass(eq=False, repr=False) diff --git a/sdk/src/beta9/clients/types/__init__.py b/sdk/src/beta9/clients/types/__init__.py index 3076147ea..b680eb291 100644 --- a/sdk/src/beta9/clients/types/__init__.py +++ b/sdk/src/beta9/clients/types/__init__.py @@ -122,6 +122,7 @@ class ContainerRequest(betterproto.Message): machine_id: str = betterproto.string_field(34) checkpoint_trigger: "CheckpointTrigger" = betterproto.message_field(35) task_id: str = betterproto.string_field(36) + gpu_virtualized: bool = betterproto.bool_field(37) @dataclass(eq=False, repr=False) From ffdde92a5e8fd3ac1e9a07752b06465b24c13c87 Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Thu, 16 Jul 2026 04:21:26 +0000 Subject: [PATCH 02/26] added GPU mount gate for virtual GPUs --- pkg/worker/events.go | 2 +- pkg/worker/gpu_integration_test.go | 5 +- pkg/worker/lifecycle.go | 59 +++-- pkg/worker/nvidia.go | 23 +- pkg/worker/nvidia_test.go | 17 +- pkg/worker/thunder.go | 355 +++++++++++++++++++++++++++++ pkg/worker/thunder_test.go | 196 ++++++++++++++++ pkg/worker/worker.go | 9 + 8 files changed, 626 insertions(+), 40 deletions(-) create mode 100644 pkg/worker/thunder.go create mode 100644 pkg/worker/thunder_test.go diff --git a/pkg/worker/events.go b/pkg/worker/events.go index 34a1de5a2..2f430fb19 100644 --- a/pkg/worker/events.go +++ b/pkg/worker/events.go @@ -15,7 +15,7 @@ func (w *Worker) collectAndSendContainerMetrics(ctx context.Context, request *ty ticker := time.NewTicker(w.config.Monitoring.ContainerMetricsInterval) defer ticker.Stop() - monitor := NewProcessMonitor(containerPid, spec.Linux.Resources.Devices, w.containerGPUManager.GetContainerGPUDevices(request.ContainerId)) + monitor := NewProcessMonitor(containerPid, spec.Linux.Resources.Devices, w.gpuManagerForRequest(request).GetContainerGPUDevices(request.ContainerId)) monitor.Prime() lastCollectedAt := time.Now() diff --git a/pkg/worker/gpu_integration_test.go b/pkg/worker/gpu_integration_test.go index 380f0aca4..84326e00d 100644 --- a/pkg/worker/gpu_integration_test.go +++ b/pkg/worker/gpu_integration_test.go @@ -7,6 +7,7 @@ import ( "testing" common "github.com/beam-cloud/beta9/pkg/common" + "github.com/beam-cloud/beta9/pkg/types" "gvisor.dev/gvisor/pkg/sync" ) @@ -70,7 +71,7 @@ func TestIntegrationGPUIsolation(t *testing.T) { resolvedVisibleDevices: resolved, } - assigned, err := manager.AssignGPUDevices("test-container-1", 1) + assigned, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "test-container-1", GpuCount: 1}) if err != nil { t.Fatalf("AssignGPUDevices() failed: %v", err) } @@ -81,7 +82,7 @@ func TestIntegrationGPUIsolation(t *testing.T) { } // Step 7: Verify second allocation FAILS (only 1 GPU per worker) - _, err = manager.AssignGPUDevices("test-container-2", 1) + _, err = manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "test-container-2", GpuCount: 1}) if err == nil { t.Fatal("Second allocation should fail — only 1 GPU per worker") } diff --git a/pkg/worker/lifecycle.go b/pkg/worker/lifecycle.go index 6969857e0..d48d36bd0 100644 --- a/pkg/worker/lifecycle.go +++ b/pkg/worker/lifecycle.go @@ -166,8 +166,8 @@ func (s *Worker) clearContainer(containerId string, request *types.ContainerRequ s.containerLock.Lock() // De-allocate GPU devices so they are available for new containers - if request.Gpu != "" { - s.containerGPUManager.UnassignGPUDevices(containerId) + if request != nil && request.RequiresGPU() { + s.gpuManagerForRequest(request).UnassignGPUDevices(containerId) } // Tear down container network components - best effort @@ -273,7 +273,7 @@ func (s *Worker) RunContainer(ctx context.Context, request *types.ContainerReque caps := s.runtime.Capabilities() - if request.RequiresGPU() && !caps.GPU { + if request.RequiresPhysicalGPU() && !caps.GPU { return fmt.Errorf("runtime %s does not support GPU workloads", s.runtime.Name()) } @@ -761,8 +761,8 @@ func (s *Worker) specFromRequest(request *types.ContainerRequest, options *Conta } env := s.getContainerEnvironment(request, options) - if request.Gpu != "" { - env = s.containerGPUManager.InjectEnvVars(env) + if request.RequiresGPU() { + env = s.gpuManagerForRequest(request).InjectEnvVars(env) } env = s.applyRuntimeEnvironmentOverrides(env, request, spec.Process.Args) @@ -847,6 +847,10 @@ func (s *Worker) specFromRequest(request *types.ContainerRequest, options *Conta } } + if request.RequiresGPU() { + spec.Mounts = s.gpuManagerForRequest(request).InjectMounts(spec.Mounts) + } + return spec, nil } @@ -1090,11 +1094,13 @@ func (s *Worker) spawn(request *types.ContainerRequest, spec *specs.Spec, output return } - // Only inject GPU devices if runtime supports GPU - if request.RequiresGPU() && s.runtime.Capabilities().GPU { - // Assign n-number of GPUs to a container + // Virtualized GPU requests register with Thunder but never receive physical + // device mounts, CDI devices, or NVIDIA_VISIBLE_DEVICES pinning. + if request.RequiresGPU() && (request.GpuVirtualized || s.runtime.Capabilities().GPU) { + gpuManager := s.gpuManagerForRequest(request) + phaseStart = time.Now() - assignedDevices, err := s.containerGPUManager.AssignGPUDevices(request.ContainerId, request.GpuCount) + assignedDevices, err := gpuManager.AssignGPUDevices(request) metrics.RecordWorkerStartupPhase("gpu_assignment", time.Since(phaseStart), request, map[string]string{"success": fmt.Sprintf("%t", err == nil)}) s.recordStartupLifecycle(ctx, request, types.ContainerLifecycleGPUAssignment, phaseStart, err == nil, map[string]string{"gpu_count": fmt.Sprintf("%d", request.GpuCount)}) if err != nil { @@ -1102,25 +1108,30 @@ func (s *Worker) spawn(request *types.ContainerRequest, spec *specs.Spec, output return } - // Only use CDI if runtime supports it - if s.runtime.Capabilities().CDI { - cdiCache := cdi.GetDefaultCache() - devicesToInject := s.containerGPUManager.CDIDevices(assignedDevices) + if err := gpuManager.PrepareContainerFilesystem(request, spec.Root.Path); err != nil { + log.Error().Str("container_id", request.ContainerId).Msgf("failed to prepare GPU container filesystem: %v", err) + return + } - unresolvable, err := cdiCache.InjectDevices(spec, devicesToInject...) - if err != nil { - log.Error().Str("container_id", request.ContainerId).Msgf("failed to inject devices: %v", err) - return - } - if len(unresolvable) > 0 { - log.Error().Str("container_id", request.ContainerId).Msgf("unresolvable devices: %v", unresolvable) - return + if request.RequiresPhysicalGPU() { + // Only use CDI if runtime supports it + if s.runtime.Capabilities().CDI { + cdiCache := cdi.GetDefaultCache() + devicesToInject := gpuManager.CDIDevices(assignedDevices) + + unresolvable, err := cdiCache.InjectDevices(spec, devicesToInject...) + if err != nil { + log.Error().Str("container_id", request.ContainerId).Msgf("failed to inject devices: %v", err) + return + } + if len(unresolvable) > 0 { + log.Error().Str("container_id", request.ContainerId).Msgf("unresolvable devices: %v", unresolvable) + return + } } } - // Pin env vars to the assigned devices regardless of CDI support; for - // non-CDI runtimes this is the only thing scoping the container's GPUs. - spec.Process.Env = s.containerGPUManager.InjectAssignedEnvVars(spec.Process.Env, assignedDevices) + spec.Process.Env = gpuManager.InjectAssignedEnvVars(spec.Process.Env, assignedDevices) } // Expose the bind ports diff --git a/pkg/worker/nvidia.go b/pkg/worker/nvidia.go index dce87edfb..7dc57aa92 100644 --- a/pkg/worker/nvidia.go +++ b/pkg/worker/nvidia.go @@ -47,13 +47,14 @@ var ( ) type GPUManager interface { - AssignGPUDevices(containerId string, gpuCount uint32) ([]int, error) + AssignGPUDevices(request *types.ContainerRequest) ([]int, error) GetContainerGPUDevices(containerId string) []int UnassignGPUDevices(containerId string) CDIDevices(assignedDevices []int) []string InjectEnvVars(env []string) []string InjectAssignedEnvVars(env []string, assignedDevices []int) []string InjectMounts(mounts []specs.Mount) []specs.Mount + PrepareContainerFilesystem(request *types.ContainerRequest, rootPath string) error } type ContainerNvidiaManager struct { @@ -215,8 +216,8 @@ func (c *ContainerNvidiaManager) UnassignGPUDevices(containerId string) { c.gpuAllocationMap.Delete(containerId) } -func (c *ContainerNvidiaManager) AssignGPUDevices(containerId string, gpuCount uint32) ([]int, error) { - gpuIds, err := c.chooseDevices(containerId, gpuCount) +func (c *ContainerNvidiaManager) AssignGPUDevices(request *types.ContainerRequest) ([]int, error) { + gpuIds, err := c.chooseDevices(request.ContainerId, request.GpuCount) if err != nil { return nil, err } @@ -354,7 +355,7 @@ func upsertEnvVars(env []string, updates []string) []string { return env } -func (c *ContainerNvidiaManager) InjectEnvVars(env []string) []string { +func injectCudaEnvVars(env []string) []string { cudaEnvVarDefaults := map[string]string{ "NVIDIA_DRIVER_CAPABILITIES": "compute,utility,graphics,ngx,video", "NVIDIA_REQUIRE_CUDA": "", @@ -418,6 +419,10 @@ func (c *ContainerNvidiaManager) InjectEnvVars(env []string) []string { return modifiedEnv } +func (c *ContainerNvidiaManager) InjectEnvVars(env []string) []string { + return injectCudaEnvVars(env) +} + func mergePaths(pathName string, initEnv map[string]string, mergeIn []string) { if initEnv[pathName] == "" { initEnv[pathName] = strings.Join(mergeIn, ":") @@ -437,7 +442,7 @@ func mergePaths(pathName string, initEnv map[string]string, mergeIn []string) { initEnv[pathName] = strings.Join(pathMembers, ":") } -func (c *ContainerNvidiaManager) InjectMounts(mounts []specs.Mount) []specs.Mount { +func injectCudaMounts(mounts []specs.Mount) []specs.Mount { cudaPaths := []string{fmt.Sprintf("/usr/local/cuda-%s", defaultContainerCudaVersion), "/usr/local/nvidia/lib64"} for _, path := range cudaPaths { @@ -463,3 +468,11 @@ func (c *ContainerNvidiaManager) InjectMounts(mounts []specs.Mount) []specs.Moun return mounts } + +func (c *ContainerNvidiaManager) InjectMounts(mounts []specs.Mount) []specs.Mount { + return injectCudaMounts(mounts) +} + +func (c *ContainerNvidiaManager) PrepareContainerFilesystem(request *types.ContainerRequest, rootPath string) error { + return nil +} diff --git a/pkg/worker/nvidia_test.go b/pkg/worker/nvidia_test.go index 4ef59e308..9a7cbef6e 100644 --- a/pkg/worker/nvidia_test.go +++ b/pkg/worker/nvidia_test.go @@ -14,6 +14,7 @@ import ( "time" common "github.com/beam-cloud/beta9/pkg/common" + "github.com/beam-cloud/beta9/pkg/types" "github.com/opencontainers/runtime-spec/specs-go" "github.com/tj/assert" @@ -384,7 +385,7 @@ func TestAssignAndUnassignGPUDevices(t *testing.T) { // Assign 2 GPUs to a container gpuCount := 2 - assignedDevices, err := manager.AssignGPUDevices("container1", uint32(gpuCount)) + assignedDevices, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container1", GpuCount: uint32(gpuCount)}) if err != nil { t.Fatalf("Failed to assign GPU devices: %v", err) } @@ -402,7 +403,7 @@ func TestAssignAndUnassignGPUDevices(t *testing.T) { manager.UnassignGPUDevices("container1") // Try to assign 4 GPUs to another container, should succeed since the first 2 are unassigned - _, err = manager.AssignGPUDevices("container2", 4) + _, err = manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container2", GpuCount: 4}) if err != nil { t.Errorf("Failed to assign GPU devices to container2 after unassigning from container1: %v", err) } @@ -411,7 +412,7 @@ func TestAssignAndUnassignGPUDevices(t *testing.T) { func TestAssignEightGPUDevices(t *testing.T) { manager := NewContainerNvidiaManagerForTest(8) - assignedDevices, err := manager.AssignGPUDevices("container1", 8) + assignedDevices, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container1", GpuCount: 8}) if err != nil { t.Fatalf("AssignGPUDevices() error = %v", err) } @@ -430,7 +431,7 @@ func TestAssignMoreGPUsThanAvailable(t *testing.T) { // manager.statFunc = mockStat // Attempt to assign 5 GPUs to a container, which exceeds the available count - _, err := manager.AssignGPUDevices("container1", 5) + _, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container1", GpuCount: 5}) if err == nil { t.Errorf("Expected an error when requesting more GPUs than available, but got none") } @@ -526,19 +527,19 @@ func TestAssignGPUsToMultipleContainers(t *testing.T) { manager := NewContainerNvidiaManagerForTest(4) // Assume a machine with 4 GPUs // Assign 2 GPUs to the first container - _, err := manager.AssignGPUDevices("container1", 2) + _, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container1", GpuCount: 2}) if err != nil { t.Fatalf("Failed to assign GPUs to container1: %v", err) } // Attempt to assign 2 more GPUs to a second container - _, err = manager.AssignGPUDevices("container2", 2) + _, err = manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container2", GpuCount: 2}) if err != nil { t.Errorf("Failed to assign GPUs to container2: %v", err) } // Attempt to assign 1 more GPU to a third container, should fail - _, err = manager.AssignGPUDevices("container3", 1) + _, err = manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container3", GpuCount: 1}) if err == nil { t.Errorf("Expected failure when assigning GPUs to container3, but got none") } @@ -577,7 +578,7 @@ func TestConcurrentlyAssignGPUDevices(t *testing.T) { var err error for { - assignedDevices, err := manager.AssignGPUDevices(id, uint32(gpusPerContainer)) + assignedDevices, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: id, GpuCount: uint32(gpusPerContainer)}) if err != nil { attempt++ diff --git a/pkg/worker/thunder.go b/pkg/worker/thunder.go new file mode 100644 index 000000000..6649e5006 --- /dev/null +++ b/pkg/worker/thunder.go @@ -0,0 +1,355 @@ +package worker + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "os" + "path/filepath" + "strings" + "time" + + common "github.com/beam-cloud/beta9/pkg/common" + "github.com/beam-cloud/beta9/pkg/types" + "github.com/opencontainers/runtime-spec/specs-go" + "github.com/rs/zerolog/log" +) + +const ( + thunderAPIURLEnv = "THUNDER_API_URL" + thunderAPITokenEnv = "THUNDER_API_TOKEN" + thunderRegisterClientPath = "/register-client" + thunderDeleteClientPath = "/delete-client" + thunderLibraryAssetPath = "/assets/libthunder.so" + thunderRequestAttempts = 3 + thunderRetryDelay = time.Second +) + +const ( + thunderConfigPath = "/etc/thunder/config.json" + thunderTokenPath = "/etc/thunder/token" + thunderLibraryPath = "/etc/thunder/libthunder.so" +) + +type ContainerThunderManager struct { + apiURL string + apiToken string + client *http.Client + allocations *common.SafeMap[thunderAllocation] +} + +type thunderAllocation struct { + Token string +} + +type thunderRegisterClientRequest struct { + DeviceID string `json:"deviceId"` + GPUType string `json:"gpuType"` + GPUCount int `json:"gpuCount"` +} + +type thunderRegisterClientResponse struct { + Token string `json:"token"` +} + +type thunderDeleteClientRequest struct { + DeviceID string `json:"deviceId"` + Token string `json:"token"` +} + +type thunderConfigFile struct { + DeviceID string `json:"deviceId"` + EnableGRPCTLS bool `json:"enableGrpcTls"` + EnvironmentType string `json:"environmentType"` + GPUCount int `json:"gpuCount"` + GPUType string `json:"gpuType"` + ManagerAddress string `json:"managerAddress"` + OtelCollector string `json:"otelCollector"` + UVM bool `json:"uvm"` +} + +func NewContainerThunderManagerFromEnv() GPUManager { + return NewContainerThunderManager(os.Getenv(thunderAPIURLEnv), os.Getenv(thunderAPITokenEnv), nil) +} + +func NewContainerThunderManager(apiURL, apiToken string, client *http.Client) *ContainerThunderManager { + if client == nil { + client = &http.Client{Timeout: 10 * time.Second} + } + return &ContainerThunderManager{ + apiURL: strings.TrimRight(apiURL, "/"), + apiToken: apiToken, + client: client, + allocations: common.NewSafeMap[thunderAllocation](), + } +} + +func (c *ContainerThunderManager) AssignGPUDevices(request *types.ContainerRequest) ([]int, error) { + if request == nil { + return nil, fmt.Errorf("missing container request") + } + if c.apiURL == "" { + return nil, fmt.Errorf("%s is required for virtualized GPU requests", thunderAPIURLEnv) + } + if c.apiToken == "" { + return nil, fmt.Errorf("%s is required for virtualized GPU requests", thunderAPITokenEnv) + } + + payload := thunderRegisterClientRequest{ + DeviceID: request.ContainerId, + GPUType: thunderGPUType(request), + GPUCount: int(thunderGPUCount(request)), + } + + var response thunderRegisterClientResponse + if err := c.doThunderRequest(http.MethodPost, thunderRegisterClientPath, payload, &response); err != nil { + return nil, err + } + + c.allocations.Set(request.ContainerId, thunderAllocation{Token: response.Token}) + return []int{}, nil +} + +func (c *ContainerThunderManager) GetContainerGPUDevices(containerId string) []int { + return []int{} +} + +func (c *ContainerThunderManager) UnassignGPUDevices(containerId string) { + allocation, ok := c.allocations.Get(containerId) + if !ok { + return + } + + payload := thunderDeleteClientRequest{DeviceID: containerId, Token: allocation.Token} + if err := c.doThunderRequest(http.MethodPost, thunderDeleteClientPath, payload, nil); err != nil { + log.Error().Str("container_id", containerId).Err(err).Msg("failed to unregister Thunder virtual GPU client") + } + c.allocations.Delete(containerId) +} + +func (c *ContainerThunderManager) CDIDevices(assignedDevices []int) []string { + return []string{} +} + +func (c *ContainerThunderManager) InjectEnvVars(env []string) []string { + return injectCudaEnvVars(env) +} + +func (c *ContainerThunderManager) InjectAssignedEnvVars(env []string, assignedDevices []int) []string { + return env +} + +func (c *ContainerThunderManager) InjectMounts(mounts []specs.Mount) []specs.Mount { + return injectCudaMounts(mounts) +} + +func (c *ContainerThunderManager) doThunderRequest(method, path string, payload any, response any) error { + endpoint, err := c.thunderEndpoint(path) + if err != nil { + return err + } + + body, err := json.Marshal(payload) + if err != nil { + return err + } + + var lastErr error + for attempt := 1; attempt <= thunderRequestAttempts; attempt++ { + req, err := http.NewRequest(method, endpoint, bytes.NewReader(body)) + if err != nil { + return err + } + req.Header.Set("Authorization", "Bearer "+c.apiToken) + req.Header.Set("Content-Type", "application/json") + + resp, err := c.client.Do(req) + if err == nil && resp != nil { + if resp.StatusCode >= 200 && resp.StatusCode < 300 { + defer resp.Body.Close() + if response == nil { + return nil + } + return json.NewDecoder(resp.Body).Decode(response) + } + resp.Body.Close() + lastErr = fmt.Errorf("Thunder API %s %s returned status %d", method, path, resp.StatusCode) + } else if err != nil { + lastErr = err + } + + if attempt < thunderRequestAttempts { + time.Sleep(thunderRetryDelay) + } + } + + return lastErr +} + +func (c *ContainerThunderManager) thunderEndpoint(path string) (string, error) { + if !strings.HasPrefix(path, "/") { + path = "/" + path + } + return c.apiURL + path, nil +} + +func thunderGPUType(request *types.ContainerRequest) string { + if request == nil { + return "" + } + if request.Gpu != "" && request.Gpu != string(types.NO_GPU) { + return request.Gpu + } + for _, gpu := range request.GpuRequest { + if gpu != "" && gpu != string(types.NO_GPU) { + return gpu + } + } + return request.Gpu +} + +func thunderGPUCount(request *types.ContainerRequest) uint32 { + if request == nil { + return 0 + } + if request.GpuCount > 0 { + return request.GpuCount + } + if request.RequiresGPU() { + return 1 + } + return 0 +} + +func (c *ContainerThunderManager) PrepareContainerFilesystem(request *types.ContainerRequest, rootPath string) error { + return c.InjectThunderFiles(request, rootPath) +} + +func (c *ContainerThunderManager) InjectThunderFiles(request *types.ContainerRequest, rootPath string) error { + if request == nil { + return fmt.Errorf("missing container request") + } + if rootPath == "" { + return fmt.Errorf("missing container root path") + } + + allocation, err := c.thunderAllocationForRequest(request) + if err != nil { + return err + } + + if err := c.createThunderLibrary(rootPath); err != nil { + return err + } + if err := createThunderToken(rootPath, allocation.Token); err != nil { + return err + } + if err := createThunderConfig(rootPath, request); err != nil { + return err + } + return nil +} + +func (c *ContainerThunderManager) thunderAllocationForRequest(request *types.ContainerRequest) (thunderAllocation, error) { + allocation, ok := c.allocations.Get(request.ContainerId) + if ok { + return allocation, nil + } + + if _, err := c.AssignGPUDevices(request); err != nil { + return thunderAllocation{}, err + } + allocation, ok = c.allocations.Get(request.ContainerId) + if !ok { + return thunderAllocation{}, fmt.Errorf("missing Thunder allocation for container %s", request.ContainerId) + } + return allocation, nil +} + +func (c *ContainerThunderManager) createThunderLibrary(rootPath string) error { + contents, err := c.downloadThunderAsset(thunderLibraryAssetPath) + if err != nil { + return err + } + return writeThunderFile(rootPath, thunderLibraryPath, contents, 0644) +} + +func createThunderToken(rootPath string, token string) error { + return writeThunderFile(rootPath, thunderTokenPath, []byte(token), 0644) +} + +func createThunderConfig(rootPath string, request *types.ContainerRequest) error { + config := thunderConfigFile{ + DeviceID: request.ContainerId, + EnableGRPCTLS: false, + EnvironmentType: "production", + GPUCount: int(thunderGPUCount(request)), + GPUType: thunderGPUType(request), + ManagerAddress: "", + OtelCollector: "", + UVM: false, + } + + contents, err := json.Marshal(config) + if err != nil { + return err + } + return writeThunderFile(rootPath, thunderConfigPath, contents, 0644) +} + +func writeThunderFile(rootPath string, containerPath string, contents []byte, perm os.FileMode) error { + targetPath := thunderHostPath(rootPath, containerPath) + if err := os.MkdirAll(filepath.Dir(targetPath), 0755); err != nil { + return err + } + return os.WriteFile(targetPath, contents, perm) +} + +func thunderHostPath(rootPath string, containerPath string) string { + cleanPath := filepath.Clean(containerPath) + cleanPath = strings.TrimPrefix(cleanPath, string(os.PathSeparator)) + return filepath.Join(rootPath, cleanPath) +} + +func (c *ContainerThunderManager) downloadThunderAsset(path string) ([]byte, error) { + if c.apiURL == "" { + return nil, fmt.Errorf("%s is required for Thunder asset download", thunderAPIURLEnv) + } + + endpoint, err := c.thunderEndpoint(path) + if err != nil { + return nil, err + } + + var lastErr error + for attempt := 1; attempt <= thunderRequestAttempts; attempt++ { + req, err := http.NewRequest(http.MethodGet, endpoint, nil) + if err != nil { + return nil, err + } + + resp, err := c.client.Do(req) + if err == nil && resp != nil { + if resp.StatusCode >= 200 && resp.StatusCode < 300 { + contents, readErr := io.ReadAll(resp.Body) + resp.Body.Close() + if readErr != nil { + return nil, readErr + } + return contents, nil + } + resp.Body.Close() + lastErr = fmt.Errorf("Thunder asset GET %s returned status %d", path, resp.StatusCode) + } else if err != nil { + lastErr = err + } + + if attempt < thunderRequestAttempts { + time.Sleep(thunderRetryDelay) + } + } + + return nil, lastErr +} diff --git a/pkg/worker/thunder_test.go b/pkg/worker/thunder_test.go new file mode 100644 index 000000000..971242663 --- /dev/null +++ b/pkg/worker/thunder_test.go @@ -0,0 +1,196 @@ +package worker + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "os" + "sync/atomic" + "testing" + + "github.com/beam-cloud/beta9/pkg/types" + "github.com/tj/assert" +) + +func TestThunderAssignRegistersClientAndLeavesAssignedEnvUnchanged(t *testing.T) { + var registerPayload thunderRegisterClientRequest + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != thunderRegisterClientPath { + t.Fatalf("path = %s, want %s", r.URL.Path, thunderRegisterClientPath) + } + if r.Method != http.MethodPost { + t.Fatalf("method = %s, want POST", r.Method) + } + if r.Header.Get("Authorization") != "Bearer central-token" { + t.Fatalf("authorization header = %q", r.Header.Get("Authorization")) + } + if err := json.NewDecoder(r.Body).Decode(®isterPayload); err != nil { + t.Fatal(err) + } + _ = json.NewEncoder(w).Encode(thunderRegisterClientResponse{Token: "client-token"}) + })) + defer server.Close() + + manager := NewContainerThunderManager(server.URL, "central-token", server.Client()) + request := &types.ContainerRequest{ + ContainerId: "container-123", + Gpu: "A100", + GpuCount: 2, + GpuVirtualized: true, + } + + assigned, err := manager.AssignGPUDevices(request) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, []int{}, assigned) + assert.Equal(t, thunderRegisterClientRequest{DeviceID: "container-123", GPUType: "A100", GPUCount: 2}, registerPayload) + + env := manager.InjectAssignedEnvVars([]string{"A=1", "NVIDIA_VISIBLE_DEVICES=void", "WORKER_GPU_DEVICES=0"}, assigned) + assert.Equal(t, []string{"A=1", "NVIDIA_VISIBLE_DEVICES=void", "WORKER_GPU_DEVICES=0"}, env) +} + +func TestThunderUnassignUsesPostDeleteClient(t *testing.T) { + var deletePayload thunderDeleteClientRequest + var sawDelete bool + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case thunderRegisterClientPath: + _ = json.NewEncoder(w).Encode(thunderRegisterClientResponse{Token: "client-token"}) + case thunderDeleteClientPath: + sawDelete = true + if r.Method != http.MethodPost { + t.Fatalf("method = %s, want POST", r.Method) + } + if r.Header.Get("Authorization") != "Bearer central-token" { + t.Fatalf("authorization header = %q", r.Header.Get("Authorization")) + } + if err := json.NewDecoder(r.Body).Decode(&deletePayload); err != nil { + t.Fatal(err) + } + _ = json.NewEncoder(w).Encode(map[string]bool{"success": true}) + default: + t.Fatalf("unexpected path %s", r.URL.Path) + } + })) + defer server.Close() + + manager := NewContainerThunderManager(server.URL, "central-token", server.Client()) + request := &types.ContainerRequest{ContainerId: "container-123", Gpu: "H100", GpuCount: 1, GpuVirtualized: true} + _, err := manager.AssignGPUDevices(request) + if err != nil { + t.Fatal(err) + } + manager.UnassignGPUDevices(request.ContainerId) + + if !sawDelete { + t.Fatal("delete-client was not called") + } + assert.Equal(t, thunderDeleteClientRequest{DeviceID: "container-123", Token: "client-token"}, deletePayload) +} + +func TestThunderAssignRetriesUnsuccessfulStatus(t *testing.T) { + var attempts int32 + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + attempt := atomic.AddInt32(&attempts, 1) + if attempt < 3 { + w.WriteHeader(http.StatusInternalServerError) + return + } + _ = json.NewEncoder(w).Encode(thunderRegisterClientResponse{Token: "client-token"}) + })) + defer server.Close() + + manager := NewContainerThunderManager(server.URL, "central-token", server.Client()) + _, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container-123", GpuRequest: []string{"H100"}, GpuVirtualized: true}) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, int32(3), atomic.LoadInt32(&attempts)) +} + +func TestThunderAssignRequiresWorkerEnv(t *testing.T) { + manager := NewContainerThunderManager("", "", nil) + _, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container-123", Gpu: "A100", GpuVirtualized: true}) + if err == nil { + t.Fatal("expected missing Thunder configuration error") + } +} + +func TestThunderPrepareContainerFilesystemWritesThunderFiles(t *testing.T) { + const libraryContents = "libthunder-bytes" + var registerPayload thunderRegisterClientRequest + var assetRequested bool + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case thunderRegisterClientPath: + if r.Method != http.MethodPost { + t.Fatalf("register method = %s, want POST", r.Method) + } + if r.Header.Get("Authorization") != "Bearer central-token" { + t.Fatalf("authorization header = %q", r.Header.Get("Authorization")) + } + if err := json.NewDecoder(r.Body).Decode(®isterPayload); err != nil { + t.Fatal(err) + } + _ = json.NewEncoder(w).Encode(thunderRegisterClientResponse{Token: "client-token"}) + case thunderLibraryAssetPath: + assetRequested = true + if r.Method != http.MethodGet { + t.Fatalf("asset method = %s, want GET", r.Method) + } + _, _ = w.Write([]byte(libraryContents)) + default: + t.Fatalf("unexpected path %s", r.URL.Path) + } + })) + defer server.Close() + + manager := NewContainerThunderManager(server.URL, "central-token", server.Client()) + request := &types.ContainerRequest{ + ContainerId: "container-123", + Gpu: "A100", + GpuCount: 2, + GpuVirtualized: true, + } + rootPath := t.TempDir() + + if err := manager.PrepareContainerFilesystem(request, rootPath); err != nil { + t.Fatal(err) + } + + assert.Equal(t, thunderRegisterClientRequest{DeviceID: "container-123", GPUType: "A100", GPUCount: 2}, registerPayload) + assert.True(t, assetRequested) + + library, err := os.ReadFile(thunderHostPath(rootPath, thunderLibraryPath)) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, libraryContents, string(library)) + + token, err := os.ReadFile(thunderHostPath(rootPath, thunderTokenPath)) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, "client-token", string(token)) + + configBytes, err := os.ReadFile(thunderHostPath(rootPath, thunderConfigPath)) + if err != nil { + t.Fatal(err) + } + var config thunderConfigFile + if err := json.Unmarshal(configBytes, &config); err != nil { + t.Fatal(err) + } + assert.Equal(t, thunderConfigFile{ + DeviceID: "container-123", + EnableGRPCTLS: false, + EnvironmentType: "production", + GPUCount: 2, + GPUType: "A100", + ManagerAddress: "", + OtelCollector: "", + UVM: false, + }, config) +} diff --git a/pkg/worker/worker.go b/pkg/worker/worker.go index a10ff9bfe..0ca394482 100644 --- a/pkg/worker/worker.go +++ b/pkg/worker/worker.go @@ -77,6 +77,7 @@ type Worker struct { criuManager CRIUManager containerNetworkManager ContainerNetwork containerGPUManager GPUManager + containerThunderManager GPUManager containerMountManager *ContainerMountManager imageClient *ImageClient containerInstances *common.SafeMap[*ContainerInstance] @@ -103,6 +104,13 @@ type Worker struct { config types.AppConfig } +func (w *Worker) gpuManagerForRequest(request *types.ContainerRequest) GPUManager { + if request != nil && request.GpuVirtualized { + return w.containerThunderManager + } + return w.containerGPUManager +} + type ContainerInstance struct { Id string StubId string @@ -386,6 +394,7 @@ func NewWorker() (_ *Worker, err error) { storageManager: storageManager, fileCacheManager: fileCacheManager, containerGPUManager: NewContainerNvidiaManager(uint32(gpuCount), defaultRuntime.Name()), + containerThunderManager: NewContainerThunderManagerFromEnv(), containerNetworkManager: containerNetworkManager, containerMountManager: NewContainerMountManager(config, poolConfig), podAddr: podAddr, From bf714d42ecb5304b475fd39cd97b517782ac666a Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Thu, 16 Jul 2026 04:22:08 +0000 Subject: [PATCH 03/26] added thunder deployments files --- .gitignore | 14 + thunder_deployment/README.md | 118 + .../client_workload/.beamignore | 28 + thunder_deployment/client_workload/beam.py | 1 + .../client_workload/client_setup.py | 71 + thunder_deployment/client_workload/main.py | 60 + .../client_workload/requirements.txt | 49 + thunder_deployment/go.mod | 3 + thunder_deployment/infra/beta9/.helmignore | 23 + thunder_deployment/infra/beta9/Chart.lock | 27 + thunder_deployment/infra/beta9/Chart.yaml | 41 + .../charts/beam-blobcache-chart/.helmignore | 23 + .../charts/beam-blobcache-chart/Chart.lock | 6 + .../charts/beam-blobcache-chart/Chart.yaml | 11 + .../charts/common/.helmignore | 28 + .../charts/common/Chart.yaml | 33 + .../charts/common/README.md | 234 ++ .../common/templates/classes/_configmap.tpl | 32 + .../common/templates/classes/_cronjob.tpl | 61 + .../common/templates/classes/_daemonset.tpl | 40 + .../common/templates/classes/_deployment.tpl | 60 + .../common/templates/classes/_ingress.tpl | 85 + .../charts/common/templates/classes/_job.tpl | 46 + .../templates/classes/_networkpolicy.tpl | 49 + .../charts/common/templates/classes/_pvc.tpl | 53 + .../common/templates/classes/_route.tpl | 86 + .../common/templates/classes/_secret.tpl | 39 + .../common/templates/classes/_service.tpl | 104 + .../templates/classes/_serviceAccount.tpl | 30 + .../templates/classes/_serviceMonitor.tpl | 37 + .../common/templates/classes/_statefulset.tpl | 56 + .../lib/chart/_getMapItemsWithKey.tpl | 17 + .../common/templates/lib/chart/_kahn.tpl | 35 + .../common/templates/lib/chart/_names.tpl | 35 + .../lib/configMap/_getByIdentifier.tpl | 12 + .../templates/lib/configMap/_validate.tpl | 7 + .../lib/configMap/_valuesToObject.tpl | 24 + .../common/templates/lib/container/_spec.tpl | 54 + .../templates/lib/container/_validate.tpl | 20 + .../lib/container/_valuesToObject.tpl | 27 + .../templates/lib/container/fields/_args.tpl | 26 + .../lib/container/fields/_command.tpl | 26 + .../templates/lib/container/fields/_env.tpl | 82 + .../lib/container/fields/_envFrom.tpl | 58 + .../templates/lib/container/fields/_image.tpl | 15 + .../templates/lib/container/fields/_name.tpl | 24 + .../lib/container/fields/_probes.tpl | 83 + .../lib/container/fields/_volumeMounts.tpl | 115 + .../lib/controller/_enabled_containers.tpl | 24 + .../templates/lib/controller/_metadata.tpl | 25 + .../templates/lib/controller/_validate.tpl | 18 + .../lib/controller/_valuesToObject.tpl | 41 + .../templates/lib/cronjob/_validate.tpl | 11 + .../templates/lib/cronjob/_valuesToObject.tpl | 18 + .../templates/lib/daemonset/_validate.tpl | 7 + .../lib/daemonset/_valuesToObject.tpl | 11 + .../templates/lib/deployment/_validate.tpl | 11 + .../lib/deployment/_valuesToObject.tpl | 14 + .../common/templates/lib/ingress/_primary.tpl | 21 + .../templates/lib/ingress/_validate.tpl | 15 + .../templates/lib/ingress/_valuesToObject.tpl | 24 + .../common/templates/lib/job/_validate.tpl | 12 + .../templates/lib/job/_valuesToObject.tpl | 14 + .../templates/lib/metadata/_allLabels.tpl | 10 + .../lib/metadata/_globalAnnotations.tpl | 10 + .../templates/lib/metadata/_globalLabels.tpl | 9 + .../lib/metadata/_selectorLabels.tpl | 5 + .../templates/lib/networkpolicy/_validate.tpl | 22 + .../lib/networkpolicy/_valuesToObject.tpl | 24 + .../common/templates/lib/pod/_getOption.tpl | 34 + .../charts/common/templates/lib/pod/_spec.tpl | 67 + .../templates/lib/pod/fields/_containers.tpl | 71 + .../templates/lib/pod/fields/_dnsPolicy.tpl | 25 + .../lib/pod/fields/_initContainers.tpl | 78 + .../lib/pod/fields/_serviceAccountName.tpl | 11 + .../templates/lib/pod/fields/_volumes.tpl | 125 + .../lib/pod/metadata/_annotations.tpl | 56 + .../templates/lib/pod/metadata/_labels.tpl | 36 + .../common/templates/lib/pvc/_validate.tpl | 7 + .../templates/lib/pvc/_valuesToObject.tpl | 24 + .../common/templates/lib/routes/_primary.tpl | 21 + .../common/templates/lib/routes/_validate.tpl | 25 + .../templates/lib/routes/_valuesToObject.tpl | 24 + .../templates/lib/secret/_getByIdentifier.tpl | 12 + .../common/templates/lib/secret/_validate.tpl | 7 + .../templates/lib/secret/_valuesToObject.tpl | 24 + .../templates/lib/service/_enabled_ports.tpl | 22 + .../lib/service/_enabled_services.tpl | 23 + .../lib/service/_getByIdentifier.tpl | 13 + .../lib/service/_getPortNumberByName.tpl | 17 + .../lib/service/_primaryForController.tpl | 30 + .../templates/lib/service/_primary_port.tpl | 25 + .../templates/lib/service/_validate.tpl | 37 + .../templates/lib/service/_valuesToObject.tpl | 24 + .../lib/serviceAccount/_validate.tpl | 7 + .../lib/serviceAccount/_valuesToObject.tpl | 23 + .../lib/serviceMonitor/_validate.tpl | 11 + .../lib/serviceMonitor/_valuesToObject.tpl | 24 + .../templates/lib/statefulset/_validate.tpl | 23 + .../lib/statefulset/_valuesToObject.tpl | 14 + .../lib/statefulset/_volumeClaimTemplates.tpl | 51 + .../charts/common/templates/loader/_all.tpl | 10 + .../common/templates/loader/_generate.tpl | 16 + .../charts/common/templates/loader/_init.tpl | 4 + .../common/templates/render/_configmaps.tpl | 26 + .../common/templates/render/_controllers.tpl | 45 + .../common/templates/render/_ingresses.tpl | 26 + .../templates/render/_networkpolicies.tpl | 26 + .../charts/common/templates/render/_pvcs.tpl | 26 + .../common/templates/render/_routes.tpl | 24 + .../common/templates/render/_secrets.tpl | 26 + .../templates/render/_serviceMonitors.tpl | 26 + .../templates/render/_serviceaccount.tpl | 20 + .../common/templates/render/_services.tpl | 19 + .../charts/common/templates/values/_init.tpl | 11 + .../charts/common/values.yaml | 740 ++++++ .../templates/_helpers.tpl | 23 + .../templates/common.yaml | 6 + .../charts/beam-blobcache-chart/values.yaml | 60 + .../infra/beta9/charts/common/.helmignore | 28 + .../infra/beta9/charts/common/Chart.yaml | 33 + .../infra/beta9/charts/common/README.md | 234 ++ .../common/templates/classes/_configmap.tpl | 32 + .../common/templates/classes/_cronjob.tpl | 61 + .../common/templates/classes/_daemonset.tpl | 40 + .../common/templates/classes/_deployment.tpl | 60 + .../common/templates/classes/_ingress.tpl | 85 + .../charts/common/templates/classes/_job.tpl | 46 + .../templates/classes/_networkpolicy.tpl | 49 + .../charts/common/templates/classes/_pvc.tpl | 53 + .../common/templates/classes/_route.tpl | 86 + .../common/templates/classes/_secret.tpl | 39 + .../common/templates/classes/_service.tpl | 104 + .../templates/classes/_serviceAccount.tpl | 30 + .../templates/classes/_serviceMonitor.tpl | 37 + .../common/templates/classes/_statefulset.tpl | 56 + .../lib/chart/_getMapItemsWithKey.tpl | 17 + .../common/templates/lib/chart/_kahn.tpl | 35 + .../common/templates/lib/chart/_names.tpl | 35 + .../lib/configMap/_getByIdentifier.tpl | 12 + .../templates/lib/configMap/_validate.tpl | 7 + .../lib/configMap/_valuesToObject.tpl | 24 + .../common/templates/lib/container/_spec.tpl | 54 + .../templates/lib/container/_validate.tpl | 20 + .../lib/container/_valuesToObject.tpl | 27 + .../templates/lib/container/fields/_args.tpl | 26 + .../lib/container/fields/_command.tpl | 26 + .../templates/lib/container/fields/_env.tpl | 82 + .../lib/container/fields/_envFrom.tpl | 58 + .../templates/lib/container/fields/_image.tpl | 15 + .../templates/lib/container/fields/_name.tpl | 24 + .../lib/container/fields/_probes.tpl | 83 + .../lib/container/fields/_volumeMounts.tpl | 115 + .../lib/controller/_enabled_containers.tpl | 24 + .../templates/lib/controller/_metadata.tpl | 25 + .../templates/lib/controller/_validate.tpl | 18 + .../lib/controller/_valuesToObject.tpl | 41 + .../templates/lib/cronjob/_validate.tpl | 11 + .../templates/lib/cronjob/_valuesToObject.tpl | 18 + .../templates/lib/daemonset/_validate.tpl | 7 + .../lib/daemonset/_valuesToObject.tpl | 11 + .../templates/lib/deployment/_validate.tpl | 11 + .../lib/deployment/_valuesToObject.tpl | 14 + .../common/templates/lib/ingress/_primary.tpl | 21 + .../templates/lib/ingress/_validate.tpl | 15 + .../templates/lib/ingress/_valuesToObject.tpl | 24 + .../common/templates/lib/job/_validate.tpl | 12 + .../templates/lib/job/_valuesToObject.tpl | 14 + .../templates/lib/metadata/_allLabels.tpl | 10 + .../lib/metadata/_globalAnnotations.tpl | 10 + .../templates/lib/metadata/_globalLabels.tpl | 9 + .../lib/metadata/_selectorLabels.tpl | 5 + .../templates/lib/networkpolicy/_validate.tpl | 22 + .../lib/networkpolicy/_valuesToObject.tpl | 24 + .../common/templates/lib/pod/_getOption.tpl | 34 + .../charts/common/templates/lib/pod/_spec.tpl | 67 + .../templates/lib/pod/fields/_containers.tpl | 71 + .../templates/lib/pod/fields/_dnsPolicy.tpl | 25 + .../lib/pod/fields/_initContainers.tpl | 78 + .../lib/pod/fields/_serviceAccountName.tpl | 11 + .../templates/lib/pod/fields/_volumes.tpl | 125 + .../lib/pod/metadata/_annotations.tpl | 56 + .../templates/lib/pod/metadata/_labels.tpl | 36 + .../common/templates/lib/pvc/_validate.tpl | 7 + .../templates/lib/pvc/_valuesToObject.tpl | 24 + .../common/templates/lib/routes/_primary.tpl | 21 + .../common/templates/lib/routes/_validate.tpl | 25 + .../templates/lib/routes/_valuesToObject.tpl | 24 + .../templates/lib/secret/_getByIdentifier.tpl | 12 + .../common/templates/lib/secret/_validate.tpl | 7 + .../templates/lib/secret/_valuesToObject.tpl | 24 + .../templates/lib/service/_enabled_ports.tpl | 22 + .../lib/service/_enabled_services.tpl | 23 + .../lib/service/_getByIdentifier.tpl | 13 + .../lib/service/_getPortNumberByName.tpl | 17 + .../lib/service/_primaryForController.tpl | 30 + .../templates/lib/service/_primary_port.tpl | 25 + .../templates/lib/service/_validate.tpl | 37 + .../templates/lib/service/_valuesToObject.tpl | 24 + .../lib/serviceAccount/_validate.tpl | 7 + .../lib/serviceAccount/_valuesToObject.tpl | 23 + .../lib/serviceMonitor/_validate.tpl | 11 + .../lib/serviceMonitor/_valuesToObject.tpl | 24 + .../templates/lib/statefulset/_validate.tpl | 23 + .../lib/statefulset/_valuesToObject.tpl | 14 + .../lib/statefulset/_volumeClaimTemplates.tpl | 51 + .../charts/common/templates/loader/_all.tpl | 10 + .../common/templates/loader/_generate.tpl | 16 + .../charts/common/templates/loader/_init.tpl | 4 + .../common/templates/render/_configmaps.tpl | 26 + .../common/templates/render/_controllers.tpl | 45 + .../common/templates/render/_ingresses.tpl | 26 + .../templates/render/_networkpolicies.tpl | 26 + .../charts/common/templates/render/_pvcs.tpl | 26 + .../common/templates/render/_routes.tpl | 24 + .../common/templates/render/_secrets.tpl | 26 + .../templates/render/_serviceMonitors.tpl | 26 + .../templates/render/_serviceaccount.tpl | 20 + .../common/templates/render/_services.tpl | 19 + .../charts/common/templates/values/_init.tpl | 11 + .../infra/beta9/charts/common/values.yaml | 740 ++++++ .../infra/beta9/charts/grafana/.helmignore | 23 + .../infra/beta9/charts/grafana/Chart.yaml | 33 + .../infra/beta9/charts/grafana/README.md | 769 +++++++ .../charts/grafana/ci/default-values.yaml | 1 + .../grafana/ci/with-affinity-values.yaml | 16 + .../ci/with-dashboard-json-values.yaml | 53 + .../grafana/ci/with-dashboard-values.yaml | 19 + .../ci/with-extraconfigmapmounts-values.yaml | 7 + .../ci/with-image-renderer-values.yaml | 19 + .../charts/grafana/ci/with-persistence.yaml | 3 + .../grafana/dashboards/custom-dashboard.json | 1 + .../beta9/charts/grafana/templates/NOTES.txt | 55 + .../charts/grafana/templates/_config.tpl | 171 ++ .../charts/grafana/templates/_helpers.tpl | 278 +++ .../beta9/charts/grafana/templates/_pod.tpl | 1296 +++++++++++ .../charts/grafana/templates/clusterrole.yaml | 25 + .../grafana/templates/clusterrolebinding.yaml | 24 + .../grafana/templates/configSecret.yaml | 43 + .../configmap-dashboard-provider.yaml | 15 + .../charts/grafana/templates/configmap.yaml | 15 + .../templates/dashboards-json-configmap.yaml | 38 + .../charts/grafana/templates/deployment.yaml | 53 + .../grafana/templates/extra-manifests.yaml | 4 + .../grafana/templates/headless-service.yaml | 22 + .../beta9/charts/grafana/templates/hpa.yaml | 52 + .../templates/image-renderer-deployment.yaml | 131 ++ .../grafana/templates/image-renderer-hpa.yaml | 47 + .../image-renderer-network-policy.yaml | 79 + .../templates/image-renderer-service.yaml | 31 + .../image-renderer-servicemonitor.yaml | 48 + .../charts/grafana/templates/ingress.yaml | 78 + .../grafana/templates/networkpolicy.yaml | 61 + .../templates/poddisruptionbudget.yaml | 22 + .../grafana/templates/podsecuritypolicy.yaml | 49 + .../beta9/charts/grafana/templates/pvc.yaml | 36 + .../beta9/charts/grafana/templates/role.yaml | 32 + .../charts/grafana/templates/rolebinding.yaml | 25 + .../charts/grafana/templates/secret-env.yaml | 14 + .../charts/grafana/templates/secret.yaml | 16 + .../charts/grafana/templates/service.yaml | 61 + .../grafana/templates/serviceaccount.yaml | 17 + .../grafana/templates/servicemonitor.yaml | 52 + .../charts/grafana/templates/statefulset.yaml | 56 + .../templates/tests/test-configmap.yaml | 20 + .../tests/test-podsecuritypolicy.yaml | 32 + .../grafana/templates/tests/test-role.yaml | 17 + .../templates/tests/test-rolebinding.yaml | 20 + .../templates/tests/test-serviceaccount.yaml | 12 + .../charts/grafana/templates/tests/test.yaml | 49 + .../infra/beta9/charts/grafana/values.yaml | 1315 +++++++++++ .../infra/beta9/charts/postgresql/.helmignore | 23 + .../infra/beta9/charts/postgresql/Chart.lock | 6 + .../infra/beta9/charts/postgresql/Chart.yaml | 37 + .../infra/beta9/charts/postgresql/README.md | 998 ++++++++ .../postgresql/charts/common/.helmignore | 22 + .../postgresql/charts/common/Chart.yaml | 23 + .../charts/postgresql/charts/common/README.md | 235 ++ .../charts/common/templates/_affinities.tpl | 139 ++ .../charts/common/templates/_capabilities.tpl | 229 ++ .../charts/common/templates/_errors.tpl | 28 + .../charts/common/templates/_images.tpl | 117 + .../charts/common/templates/_ingress.tpl | 73 + .../charts/common/templates/_labels.tpl | 46 + .../charts/common/templates/_names.tpl | 71 + .../charts/common/templates/_secrets.tpl | 182 ++ .../charts/common/templates/_storage.tpl | 28 + .../charts/common/templates/_tplvalues.tpl | 38 + .../charts/common/templates/_utils.tpl | 77 + .../charts/common/templates/_warnings.tpl | 19 + .../templates/validations/_cassandra.tpl | 77 + .../common/templates/validations/_mariadb.tpl | 108 + .../common/templates/validations/_mongodb.tpl | 113 + .../common/templates/validations/_mysql.tpl | 108 + .../templates/validations/_postgresql.tpl | 134 ++ .../common/templates/validations/_redis.tpl | 81 + .../templates/validations/_validations.tpl | 51 + .../postgresql/charts/common/values.yaml | 8 + .../charts/postgresql/templates/NOTES.txt | 115 + .../charts/postgresql/templates/_helpers.tpl | 406 ++++ .../postgresql/templates/backup/cronjob.yaml | 114 + .../postgresql/templates/backup/pvc.yaml | 34 + .../postgresql/templates/extra-list.yaml | 9 + .../templates/networkpolicy-egress.yaml | 34 + .../templates/primary/configmap.yaml | 26 + .../templates/primary/extended-configmap.yaml | 20 + .../primary/initialization-configmap.yaml | 17 + .../templates/primary/metrics-configmap.yaml | 18 + .../templates/primary/metrics-svc.yaml | 31 + .../templates/primary/networkpolicy.yaml | 61 + .../templates/primary/servicemonitor.yaml | 46 + .../templates/primary/statefulset.yaml | 662 ++++++ .../templates/primary/svc-headless.yaml | 36 + .../postgresql/templates/primary/svc.yaml | 51 + .../postgresql/templates/prometheusrule.yaml | 22 + .../charts/postgresql/templates/psp.yaml | 42 + .../templates/read/extended-configmap.yaml | 20 + .../templates/read/metrics-configmap.yaml | 18 + .../templates/read/metrics-svc.yaml | 31 + .../templates/read/networkpolicy.yaml | 39 + .../templates/read/servicemonitor.yaml | 46 + .../templates/read/statefulset.yaml | 553 +++++ .../templates/read/svc-headless.yaml | 38 + .../charts/postgresql/templates/read/svc.yaml | 53 + .../charts/postgresql/templates/role.yaml | 32 + .../postgresql/templates/rolebinding.yaml | 24 + .../charts/postgresql/templates/secrets.yaml | 99 + .../postgresql/templates/serviceaccount.yaml | 18 + .../postgresql/templates/tls-secrets.yaml | 30 + .../charts/postgresql/values.schema.json | 156 ++ .../infra/beta9/charts/postgresql/values.yaml | 1647 ++++++++++++++ .../infra/beta9/charts/redis/.helmignore | 23 + .../infra/beta9/charts/redis/Chart.lock | 6 + .../infra/beta9/charts/redis/Chart.yaml | 36 + .../infra/beta9/charts/redis/README.md | 1223 ++++++++++ .../charts/redis/charts/common/.helmignore | 22 + .../charts/redis/charts/common/Chart.yaml | 23 + .../charts/redis/charts/common/README.md | 235 ++ .../charts/common/templates/_affinities.tpl | 139 ++ .../charts/common/templates/_capabilities.tpl | 229 ++ .../redis/charts/common/templates/_errors.tpl | 28 + .../redis/charts/common/templates/_images.tpl | 117 + .../charts/common/templates/_ingress.tpl | 73 + .../redis/charts/common/templates/_labels.tpl | 46 + .../redis/charts/common/templates/_names.tpl | 71 + .../charts/common/templates/_secrets.tpl | 182 ++ .../charts/common/templates/_storage.tpl | 28 + .../charts/common/templates/_tplvalues.tpl | 38 + .../redis/charts/common/templates/_utils.tpl | 77 + .../charts/common/templates/_warnings.tpl | 19 + .../templates/validations/_cassandra.tpl | 77 + .../common/templates/validations/_mariadb.tpl | 108 + .../common/templates/validations/_mongodb.tpl | 113 + .../common/templates/validations/_mysql.tpl | 108 + .../templates/validations/_postgresql.tpl | 134 ++ .../common/templates/validations/_redis.tpl | 81 + .../templates/validations/_validations.tpl | 51 + .../charts/redis/charts/common/values.yaml | 8 + .../beta9/charts/redis/templates/NOTES.txt | 191 ++ .../beta9/charts/redis/templates/_helpers.tpl | 328 +++ .../charts/redis/templates/configmap.yaml | 61 + .../charts/redis/templates/extra-list.yaml | 9 + .../charts/redis/templates/headless-svc.yaml | 33 + .../redis/templates/health-configmap.yaml | 194 ++ .../redis/templates/master/application.yaml | 532 +++++ .../charts/redis/templates/master/psp.yaml | 47 + .../charts/redis/templates/master/pvc.yaml | 33 + .../redis/templates/master/service.yaml | 62 + .../templates/master/serviceaccount.yaml | 18 + .../charts/redis/templates/metrics-svc.yaml | 44 + .../charts/redis/templates/networkpolicy.yaml | 105 + .../beta9/charts/redis/templates/pdb.yaml | 25 + .../charts/redis/templates/podmonitor.yaml | 69 + .../redis/templates/prometheusrule.yaml | 23 + .../redis/templates/replicas/application.yaml | 533 +++++ .../charts/redis/templates/replicas/hpa.yaml | 49 + .../redis/templates/replicas/service.yaml | 59 + .../templates/replicas/serviceaccount.yaml | 18 + .../beta9/charts/redis/templates/role.yaml | 29 + .../charts/redis/templates/rolebinding.yaml | 23 + .../redis/templates/scripts-configmap.yaml | 757 +++++++ .../redis/templates/secret-svcbind.yaml | 37 + .../beta9/charts/redis/templates/secret.yaml | 25 + .../charts/redis/templates/sentinel/hpa.yaml | 49 + .../templates/sentinel/node-services.yaml | 67 + .../templates/sentinel/ports-configmap.yaml | 102 + .../redis/templates/sentinel/service.yaml | 104 + .../redis/templates/sentinel/statefulset.yaml | 785 +++++++ .../redis/templates/serviceaccount.yaml | 18 + .../redis/templates/servicemonitor.yaml | 70 + .../charts/redis/templates/tls-secret.yaml | 31 + .../beta9/charts/redis/values.schema.json | 163 ++ .../infra/beta9/charts/redis/values.yaml | 2006 +++++++++++++++++ .../charts/victoria-metrics-agent/.helmignore | 23 + .../victoria-metrics-agent/CHANGELOG.md | 163 ++ .../charts/victoria-metrics-agent/Chart.yaml | 33 + .../charts/victoria-metrics-agent/README.md | 358 +++ .../victoria-metrics-agent/README.md.gotmpl | 97 + .../victoria-metrics-agent/RELEASE_NOTES.md | 9 + .../templates/_helpers.tpl | 148 ++ .../templates/clusterrole.yaml | 50 + .../templates/clusterrolebinding.yaml | 27 + .../templates/configmap.yaml | 17 + .../templates/deployment.yaml | 203 ++ .../templates/extra-objects.yaml | 4 + .../templates/ingress.yaml | 50 + .../victoria-metrics-agent/templates/pdb.yaml | 26 + .../templates/podsecuritypolicy.yaml | 42 + .../victoria-metrics-agent/templates/pvc.yaml | 32 + .../templates/service-monitor.yaml | 44 + .../templates/service.yaml | 92 + .../templates/serviceaccount.yaml | 13 + .../templates/statefulset.yaml | 246 ++ .../charts/victoria-metrics-agent/values.yaml | 593 +++++ .../victoria-metrics-single/.helmignore | 22 + .../victoria-metrics-single/CHANGELOG.md | 154 ++ .../charts/victoria-metrics-single/Chart.yaml | 31 + .../charts/victoria-metrics-single/README.md | 240 ++ .../victoria-metrics-single/README.md.gotmpl | 103 + .../victoria-metrics-single/RELEASE_NOTES.md | 9 + .../templates/NOTES.txt | 51 + .../templates/_helpers.tpl | 227 ++ .../templates/clusterrole.yaml | 50 + .../templates/clusterrolebinding.yaml | 23 + .../templates/extra-objects.yaml | 4 + .../templates/pdb.yaml | 26 + .../templates/podsecuritypolicy.yaml | 42 + .../templates/role.yaml | 23 + .../templates/rolebinding.yaml | 26 + .../templates/scrape-configmap.yaml | 17 + .../templates/server-deployment.yaml | 251 +++ .../templates/server-ingress.yaml | 50 + .../templates/server-pvc.yaml | 33 + .../templates/server-service-headless.yaml | 72 + .../templates/server-service-monitor.yaml | 44 + .../templates/server-service.yaml | 91 + .../templates/server-statefulset.yaml | 282 +++ .../templates/serviceaccount.yaml | 16 + .../victoria-metrics-single/values.yaml | 696 ++++++ .../infra/beta9/templates/_helpers.tpl | 120 + .../templates/cache-server-daemonset.yaml | 111 + .../infra/beta9/templates/clusterrole.yaml | 29 + .../infra/beta9/templates/common.yaml | 6 + .../infra/beta9/templates/manifests.yaml | 9 + .../infra/beta9/templates/registry.yaml | 83 + .../infra/beta9/templates/secret.yaml | 11 + thunder_deployment/infra/beta9/values.yaml | 475 ++++ thunder_deployment/infra/gpu-node-labels.yaml | 9 + .../infra/nvidia-runtimeclass/Chart.yaml | 6 + .../templates/_helpers.tpl | 49 + .../nvidia-ctk-installer-daemonset.yaml | 66 + .../nvidia-device-plugin-daemonset.yaml | 54 + .../templates/nvidia-runtimeclass.yaml | 12 + .../infra/nvidia-runtimeclass/values.yaml | 75 + thunder_deployment/provision/main.go | 302 +++ .../scripts/00-host-baseline.sh | 67 + thunder_deployment/scripts/01-tailscale.sh | 55 + thunder_deployment/scripts/02-k3s-server.sh | 129 ++ thunder_deployment/scripts/03-k3s-agent.sh | 137 ++ .../scripts/04-container-runtime.sh | 43 + thunder_deployment/scripts/05-nvidia.sh | 54 + .../scripts/06-k8s-gpu-device-plugin.sh | 71 + .../scripts/07-registry-access.sh | 28 + .../scripts/08-beta9-readiness.sh | 65 + thunder_deployment/scripts/common.sh | 164 ++ thunder_deployment/scripts/run.sh | 39 + 466 files changed, 38884 insertions(+) create mode 100644 thunder_deployment/README.md create mode 100644 thunder_deployment/client_workload/.beamignore create mode 100644 thunder_deployment/client_workload/beam.py create mode 100644 thunder_deployment/client_workload/client_setup.py create mode 100644 thunder_deployment/client_workload/main.py create mode 100644 thunder_deployment/client_workload/requirements.txt create mode 100644 thunder_deployment/go.mod create mode 100644 thunder_deployment/infra/beta9/.helmignore create mode 100644 thunder_deployment/infra/beta9/Chart.lock create mode 100644 thunder_deployment/infra/beta9/Chart.yaml create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/.helmignore create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/Chart.lock create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/Chart.yaml create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/.helmignore create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/Chart.yaml create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/README.md create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_configmap.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_cronjob.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_daemonset.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_deployment.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_ingress.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_job.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_networkpolicy.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_pvc.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_route.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_secret.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_service.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_serviceAccount.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_serviceMonitor.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_statefulset.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_getMapItemsWithKey.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_kahn.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_names.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_getByIdentifier.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_spec.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_args.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_command.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_env.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_envFrom.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_image.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_name.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_probes.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_volumeMounts.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_enabled_containers.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_metadata.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/cronjob/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/cronjob/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/daemonset/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/daemonset/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/deployment/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/deployment/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_primary.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/job/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/job/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_allLabels.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_globalAnnotations.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_globalLabels.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_selectorLabels.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/networkpolicy/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/networkpolicy/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/_getOption.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/_spec.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_containers.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_dnsPolicy.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_initContainers.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_serviceAccountName.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_volumes.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/metadata/_annotations.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/metadata/_labels.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pvc/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pvc/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_primary.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_getByIdentifier.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_enabled_ports.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_enabled_services.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_getByIdentifier.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_getPortNumberByName.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_primaryForController.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_primary_port.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceAccount/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceAccount/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceMonitor/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceMonitor/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_volumeClaimTemplates.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_all.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_generate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_init.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_configmaps.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_controllers.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_ingresses.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_networkpolicies.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_pvcs.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_routes.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_secrets.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_serviceMonitors.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_serviceaccount.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_services.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/values/_init.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/values.yaml create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/templates/_helpers.tpl create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/templates/common.yaml create mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/values.yaml create mode 100644 thunder_deployment/infra/beta9/charts/common/.helmignore create mode 100644 thunder_deployment/infra/beta9/charts/common/Chart.yaml create mode 100644 thunder_deployment/infra/beta9/charts/common/README.md create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_configmap.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_cronjob.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_daemonset.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_deployment.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_ingress.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_job.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_networkpolicy.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_pvc.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_route.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_secret.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_service.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_serviceAccount.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_serviceMonitor.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_statefulset.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_getMapItemsWithKey.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_kahn.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_names.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_getByIdentifier.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/_spec.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_args.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_command.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_env.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_envFrom.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_image.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_name.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_probes.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_volumeMounts.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_enabled_containers.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_metadata.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/cronjob/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/cronjob/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/daemonset/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/daemonset/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/deployment/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/deployment/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_primary.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/job/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/job/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_allLabels.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_globalAnnotations.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_globalLabels.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_selectorLabels.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/networkpolicy/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/networkpolicy/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pod/_getOption.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pod/_spec.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_containers.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_dnsPolicy.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_initContainers.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_serviceAccountName.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_volumes.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pod/metadata/_annotations.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pod/metadata/_labels.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pvc/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pvc/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_primary.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_getByIdentifier.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/service/_enabled_ports.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/service/_enabled_services.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/service/_getByIdentifier.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/service/_getPortNumberByName.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/service/_primaryForController.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/service/_primary_port.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/service/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/service/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/serviceAccount/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/serviceAccount/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/serviceMonitor/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/serviceMonitor/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_validate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_valuesToObject.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_volumeClaimTemplates.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/loader/_all.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/loader/_generate.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/loader/_init.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_configmaps.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_controllers.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_ingresses.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_networkpolicies.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_pvcs.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_routes.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_secrets.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_serviceMonitors.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_serviceaccount.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_services.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/templates/values/_init.tpl create mode 100644 thunder_deployment/infra/beta9/charts/common/values.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/.helmignore create mode 100644 thunder_deployment/infra/beta9/charts/grafana/Chart.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/README.md create mode 100644 thunder_deployment/infra/beta9/charts/grafana/ci/default-values.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/ci/with-affinity-values.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/ci/with-dashboard-json-values.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/ci/with-dashboard-values.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/ci/with-extraconfigmapmounts-values.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/ci/with-image-renderer-values.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/ci/with-persistence.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/dashboards/custom-dashboard.json create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/NOTES.txt create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/_config.tpl create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/_helpers.tpl create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/_pod.tpl create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/clusterrole.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/clusterrolebinding.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/configSecret.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/configmap-dashboard-provider.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/configmap.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/dashboards-json-configmap.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/deployment.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/extra-manifests.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/headless-service.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/hpa.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-deployment.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-hpa.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-network-policy.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-service.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-servicemonitor.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/ingress.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/networkpolicy.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/poddisruptionbudget.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/podsecuritypolicy.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/pvc.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/role.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/rolebinding.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/secret-env.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/secret.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/service.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/serviceaccount.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/servicemonitor.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/statefulset.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-configmap.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-podsecuritypolicy.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-role.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-rolebinding.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-serviceaccount.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/tests/test.yaml create mode 100644 thunder_deployment/infra/beta9/charts/grafana/values.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/.helmignore create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/Chart.lock create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/Chart.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/README.md create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/.helmignore create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/Chart.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/README.md create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_affinities.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_capabilities.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_errors.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_images.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_ingress.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_labels.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_names.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_secrets.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_storage.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_tplvalues.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_utils.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_warnings.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_cassandra.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mariadb.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mongodb.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mysql.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_postgresql.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_redis.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_validations.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/values.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/NOTES.txt create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/_helpers.tpl create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/backup/cronjob.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/backup/pvc.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/extra-list.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/networkpolicy-egress.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/configmap.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/extended-configmap.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/initialization-configmap.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/metrics-configmap.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/metrics-svc.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/networkpolicy.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/servicemonitor.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/statefulset.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/svc-headless.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/svc.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/prometheusrule.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/psp.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/read/extended-configmap.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/read/metrics-configmap.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/read/metrics-svc.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/read/networkpolicy.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/read/servicemonitor.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/read/statefulset.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/read/svc-headless.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/read/svc.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/role.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/rolebinding.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/secrets.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/serviceaccount.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/tls-secrets.yaml create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/values.schema.json create mode 100644 thunder_deployment/infra/beta9/charts/postgresql/values.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/.helmignore create mode 100644 thunder_deployment/infra/beta9/charts/redis/Chart.lock create mode 100644 thunder_deployment/infra/beta9/charts/redis/Chart.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/README.md create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/.helmignore create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/Chart.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/README.md create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_affinities.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_capabilities.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_errors.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_images.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_ingress.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_labels.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_names.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_secrets.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_storage.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_tplvalues.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_utils.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_warnings.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_cassandra.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mariadb.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mongodb.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mysql.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_postgresql.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_redis.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_validations.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/values.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/NOTES.txt create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/_helpers.tpl create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/configmap.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/extra-list.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/headless-svc.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/health-configmap.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/master/application.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/master/psp.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/master/pvc.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/master/service.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/master/serviceaccount.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/metrics-svc.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/networkpolicy.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/pdb.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/podmonitor.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/prometheusrule.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/replicas/application.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/replicas/hpa.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/replicas/service.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/replicas/serviceaccount.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/role.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/rolebinding.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/scripts-configmap.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/secret-svcbind.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/secret.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/sentinel/hpa.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/sentinel/node-services.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/sentinel/ports-configmap.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/sentinel/service.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/sentinel/statefulset.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/serviceaccount.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/servicemonitor.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/tls-secret.yaml create mode 100644 thunder_deployment/infra/beta9/charts/redis/values.schema.json create mode 100644 thunder_deployment/infra/beta9/charts/redis/values.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/.helmignore create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/CHANGELOG.md create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/Chart.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/README.md create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/README.md.gotmpl create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/RELEASE_NOTES.md create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/_helpers.tpl create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/clusterrole.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/clusterrolebinding.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/configmap.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/deployment.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/extra-objects.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/ingress.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/pdb.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/podsecuritypolicy.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/pvc.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/service-monitor.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/service.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/serviceaccount.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/statefulset.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/values.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/.helmignore create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/CHANGELOG.md create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/Chart.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/README.md create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/README.md.gotmpl create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/RELEASE_NOTES.md create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/NOTES.txt create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/_helpers.tpl create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/clusterrole.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/clusterrolebinding.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/extra-objects.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/pdb.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/podsecuritypolicy.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/role.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/rolebinding.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/scrape-configmap.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-deployment.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-ingress.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-pvc.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service-headless.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service-monitor.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-statefulset.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/serviceaccount.yaml create mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/values.yaml create mode 100644 thunder_deployment/infra/beta9/templates/_helpers.tpl create mode 100644 thunder_deployment/infra/beta9/templates/cache-server-daemonset.yaml create mode 100644 thunder_deployment/infra/beta9/templates/clusterrole.yaml create mode 100644 thunder_deployment/infra/beta9/templates/common.yaml create mode 100644 thunder_deployment/infra/beta9/templates/manifests.yaml create mode 100644 thunder_deployment/infra/beta9/templates/registry.yaml create mode 100644 thunder_deployment/infra/beta9/templates/secret.yaml create mode 100644 thunder_deployment/infra/beta9/values.yaml create mode 100644 thunder_deployment/infra/gpu-node-labels.yaml create mode 100644 thunder_deployment/infra/nvidia-runtimeclass/Chart.yaml create mode 100644 thunder_deployment/infra/nvidia-runtimeclass/templates/_helpers.tpl create mode 100644 thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-ctk-installer-daemonset.yaml create mode 100644 thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-device-plugin-daemonset.yaml create mode 100644 thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-runtimeclass.yaml create mode 100644 thunder_deployment/infra/nvidia-runtimeclass/values.yaml create mode 100644 thunder_deployment/provision/main.go create mode 100755 thunder_deployment/scripts/00-host-baseline.sh create mode 100755 thunder_deployment/scripts/01-tailscale.sh create mode 100755 thunder_deployment/scripts/02-k3s-server.sh create mode 100755 thunder_deployment/scripts/03-k3s-agent.sh create mode 100755 thunder_deployment/scripts/04-container-runtime.sh create mode 100755 thunder_deployment/scripts/05-nvidia.sh create mode 100755 thunder_deployment/scripts/06-k8s-gpu-device-plugin.sh create mode 100755 thunder_deployment/scripts/07-registry-access.sh create mode 100755 thunder_deployment/scripts/08-beta9-readiness.sh create mode 100755 thunder_deployment/scripts/common.sh create mode 100755 thunder_deployment/scripts/run.sh diff --git a/.gitignore b/.gitignore index 76fcf8705..2e5f062b0 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,17 @@ docs/*.md # Riptide artifacts (cloud-synced) .humanlayer/tasks/ + +# Thunder deployment local artifacts +/thunder_deployment/**/*.env +/thunder_deployment/**/.env +/thunder_deployment/**/.venv/ +/thunder_deployment/**/venv/ +/thunder_deployment/**/env/ +/thunder_deployment/**/*.tar +/thunder_deployment/**/*.tar.gz +/thunder_deployment/**/*.tgz +/thunder_deployment/**/*.zip +/thunder_deployment/provision.exe +/thunder_deployment/beam-admin-token +/thunder_deployment/client_workload/__pycache__/ diff --git a/thunder_deployment/README.md b/thunder_deployment/README.md new file mode 100644 index 000000000..18adcedb5 --- /dev/null +++ b/thunder_deployment/README.md @@ -0,0 +1,118 @@ +# Beam deployment notes + +## beta0 setep + +This deployment runs the open-source Beta9/Beam components from public sources and public container images. No private Beam registry access was needed. + +Versions used: + +- Gateway source release: `gateway-0.1.714` + - `https://github.com/beam-cloud/beta9/archive/refs/tags/gateway-0.1.714.tar.gz` + - image: `public.ecr.aws/n4e0e1y0/beta9-gateway:0.1.714` +- Worker source release: `worker-0.1.682` + - `https://github.com/beam-cloud/beta9/archive/refs/tags/worker-0.1.682.tar.gz` + - image: `public.ecr.aws/n4e0e1y0/beta9-worker:0.1.682` +- Helm chart: `infra/beta9`, chart/app version `0.1.714` +- Runner/base image registry: `public.ecr.aws/n4e0e1y0` + +Useful release checks: + +```bash +curl -fsSL -o /tmp/beta9-gateway-0.1.714.tar.gz \ + https://github.com/beam-cloud/beta9/archive/refs/tags/gateway-0.1.714.tar.gz +curl -fsSL -o /tmp/beta9-worker-0.1.682.tar.gz \ + https://github.com/beam-cloud/beta9/archive/refs/tags/worker-0.1.682.tar.gz +``` + +Install/update the chart from the master node path: + +```bash +helm dependency build infra/beta9 +helm upgrade --install beta9 infra/beta9 \ + --namespace beta9 \ + --create-namespace \ + --wait \ + --timeout 15m +``` + +The local deployment values expose the gateway on the master Tailscale IP using NodePorts: + +- gRPC: `100.73.254.107:31993` +- HTTP: `http://100.73.254.107:31994` + +Worker image storage is node-local hostPath (`/var/lib/beta9/images`) rather than a local-path PVC. A local-path PVC is pinned to the node where it was provisioned and blocks GPU worker pods from scheduling on a separate GPU node. + +## node setup + +This setup used one k3s master and one A6000 GPU worker: + +- master: `beam-master-1`, Tailscale IP `100.73.254.107` +- worker: `worker-a6000-1`, Tailscale IP `100.92.182.92` +- GPU shape: `A6000`, 8 GPUs on the node, 1 GPU per A6000 worker pod + +Provision the master: + +```bash +./provision.exe \ + --host 100.73.254.107 \ + --role master \ + --mode install \ + --key ~/.ssh/hyperstack_staging.pem \ + --node-name beam-master-1 \ + --node-ip 100.73.254.107 \ + --k3s-tls-san 100.73.254.107 \ + --flannel-iface tailscale0 \ + --flannel-backend wireguard-native +``` + +Get the k3s join token from the master: + +```bash +K3S_TOKEN="$(ssh -i ~/.ssh/hyperstack_staging.pem ubuntu@100.73.254.107 \ + 'sudo cat /var/lib/rancher/k3s/server/node-token')" +``` + +Provision the A6000 worker: + +```bash +./provision.exe \ + --host 100.92.182.92 \ + --role gpu \ + --mode install \ + --key ~/.ssh/master.pem \ + --node-name worker-a6000-1 \ + --node-ip 100.92.182.92 \ + --k3s-url https://100.73.254.107:6443 \ + --k3s-token "$K3S_TOKEN" \ + --flannel-iface tailscale0 \ + --gpu-type A6000 \ + --gpu-count 8 +``` + +Important node details captured in the scripts: + +- k3s node IPs are pinned to Tailscale IPs with `--node-ip`. +- flannel uses `tailscale0` and `wireguard-native`; plain VXLAN and host-gw were not sufficient in this mixed-network setup. +- reused nodes may contain stale RKE2/Cilium state. The GPU node provisioning path moves stale Cilium CNI configs aside, restores the k3s flannel CNI config, and ensures k3s CNI plugins are present under `/opt/cni/bin`. +- GPU nodes are labeled during join: `beta9.node-role=gpu`, `beta9.gpu=true`, `beta9.gpu-type=`, `beta9.gpu-count=`. + +Validation commands: + +```bash +kubectl get nodes -o wide +kubectl get node worker-a6000-1 \ + -o jsonpath='alloc_gpu={.status.allocatable.nvidia\.com/gpu} cap_gpu={.status.capacity.nvidia\.com/gpu}{"\n"}' +kubectl -n beta9 get pods -o wide +kubectl -n kube-system get pods -o wide | grep -E 'nvidia|coredns' +``` + +Expected final state for this setup: + +- both nodes Ready +- `worker-a6000-1` advertises `nvidia.com/gpu=8` +- NVIDIA device plugin pod Running on `worker-a6000-1` +- Beta9 gateway Running on `beam-master-1` +- A6000 worker Running on `worker-a6000-1` + +## thunder setup + diff --git a/thunder_deployment/client_workload/.beamignore b/thunder_deployment/client_workload/.beamignore new file mode 100644 index 000000000..6aa392d4a --- /dev/null +++ b/thunder_deployment/client_workload/.beamignore @@ -0,0 +1,28 @@ +# Generated by Beam SDK +.beamignore +.git +.idea +.python-version +.vscode +.venv +venv +__pycache__ +.DS_Store +.config +drive/MyDrive +.coverage +.pytest_cache +.ipynb +.ruff_cache +.dockerignore +.ipynb_checkpoints +.env.local +.env +.envrc +**/__pycache__/ +**/.pytest_cache/ +**/node_modules/ +**/.venv/ +*.pyc +.next/ +.circleci diff --git a/thunder_deployment/client_workload/beam.py b/thunder_deployment/client_workload/beam.py new file mode 100644 index 000000000..bc9c1d9cd --- /dev/null +++ b/thunder_deployment/client_workload/beam.py @@ -0,0 +1 @@ +from beta9 import * # noqa: F403 diff --git a/thunder_deployment/client_workload/client_setup.py b/thunder_deployment/client_workload/client_setup.py new file mode 100644 index 000000000..812a72a7c --- /dev/null +++ b/thunder_deployment/client_workload/client_setup.py @@ -0,0 +1,71 @@ +import os +from pathlib import Path + +from beta9 import config as beta9_config + + +ENV_PATH = Path(__file__).with_name(".env") + + +def load_env(path: Path = ENV_PATH) -> None: + if not path.exists(): + return + + for raw_line in path.read_text().splitlines(): + line = raw_line.strip() + if not line or line.startswith("#"): + continue + if line.startswith("export "): + line = line[len("export "):].strip() + if "=" not in line: + continue + + key, value = line.split("=", 1) + key = key.strip() + value = value.strip() + + if len(value) >= 2 and value[0] == value[-1] and value[0] in {"'", '"'}: + value = value[1:-1] + + os.environ[key] = value + + +def resolve_env_path(name: str) -> None: + value = os.environ.get(name) + if not value: + return + + path = Path(value).expanduser() + if not path.is_absolute(): + path = ENV_PATH.parent / path + os.environ[name] = str(path) + + +def normalize_beam_env() -> None: + token = os.environ.get("BEAM_TOKEN") or os.environ.get("BETA9_TOKEN") + gateway_host = os.environ.get("GATEWAY_HOST") or os.environ.get("BETA9_GATEWAY_HOST") + gateway_port = os.environ.get("GATEWAY_PORT") or os.environ.get("BETA9_GATEWAY_PORT") + + if token: + os.environ["BEAM_TOKEN"] = token + os.environ["BETA9_TOKEN"] = token + if gateway_host: + os.environ["GATEWAY_HOST"] = gateway_host + os.environ["BETA9_GATEWAY_HOST"] = gateway_host + if gateway_port: + os.environ["GATEWAY_PORT"] = gateway_port + os.environ["BETA9_GATEWAY_PORT"] = gateway_port + + resolve_env_path("CONFIG_PATH") + + CONFIG_PATH = os.environ.get("CONFIG_PATH") + if CONFIG_PATH: + beta9_config.get_settings().config_path = Path(CONFIG_PATH).expanduser() + + +def required_env(name: str) -> str: + value = os.environ.get(name) + if not value: + raise RuntimeError(f"Missing required environment variable: {name}") + return value + diff --git a/thunder_deployment/client_workload/main.py b/thunder_deployment/client_workload/main.py new file mode 100644 index 000000000..e9510919f --- /dev/null +++ b/thunder_deployment/client_workload/main.py @@ -0,0 +1,60 @@ +import os +import sys +import threading +from client_setup import load_env, normalize_beam_env + +from beam import Image, Sandbox, GpuType + +NUM_WORKERS = 4 + + +def worker(index: int): + sandbox = Sandbox( + image=Image(), + gpu=GpuType.A6000, + gpu_count=1, + gpu_virtualized=True, + ).create() + proc = None + try: + proc = sandbox.process.exec('nvidia-smi') + except Exception as e: + print(f'sandbox worker: {index}; received error: {e}') + finally: + if proc is not None: + proc.wait() + print(f'sandbox worker: {index}; result: {proc.stdout.read()}') + if sandbox.terminate(): + print(f'sandbox worker {index} terminated') + +if __name__ == "__main__": + exit_code = 0 + load_env() + normalize_beam_env() + try: + threaded = False + if len(sys.argv) > 1: + for index, arg in enumerate(sys.argv): + if arg == "--mode" and index < len(sys.argv) - 1 and sys.argv[index + 1] == "threaded": + threaded = True + + if threaded: + threads = [] + for index in range(NUM_WORKERS): + thread = threading.Thread(target=worker, args=(index,)) + thread.start() + threads.append(thread) + for thread in threads: + thread.join() + else: + for index in range(NUM_WORKERS): + worker(index) + except BaseException: + exit_code = 1 + import traceback + + traceback.print_exc() + finally: + sys.stdout.flush() + sys.stderr.flush() + os._exit(exit_code) diff --git a/thunder_deployment/client_workload/requirements.txt b/thunder_deployment/client_workload/requirements.txt new file mode 100644 index 000000000..c984e50a0 --- /dev/null +++ b/thunder_deployment/client_workload/requirements.txt @@ -0,0 +1,49 @@ +annotated-doc==0.0.4 +annotated-types==0.7.0 +anyio==4.14.2 +asgiref==3.12.1 +bcrypt==5.0.0 +-e file:///home/ubuntu/beam_demo/beta9/sdk +betterproto-beta9==2.0.1 +certifi==2026.6.17 +cffi==2.1.0 +charset-normalizer==3.4.9 +click==8.4.2 +cloudpickle==3.1.2 +croniter==3.0.4 +cryptography==49.0.0 +fastapi==0.139.0 +grpcio==1.82.1 +grpclib==0.4.9 +h11==0.16.0 +h2==4.3.0 +hpack==4.2.0 +hyperframe==6.1.0 +idna==3.18 +markdown-it-py==4.2.0 +mdurl==0.1.2 +multidict==6.7.1 +paramiko==3.5.1 +prompt-toolkit==3.0.52 +protobuf==6.33.6 +pycparser==3.0 +pydantic==2.13.4 +pydantic-core==2.46.4 +pygments==2.20.0 +pynacl==1.6.2 +python-dateutil==2.9.0.post0 +pytz==2026.2 +pyyaml==6.0.3 +requests==2.34.2 +rich==14.3.4 +six==1.17.0 +starlette==1.3.1 +typeguard==4.5.2 +typing-extensions==4.16.0 +typing-inspection==0.4.2 +urllib3==2.7.0 +uvicorn==0.51.0 +watchdog==4.0.2 +wcwidth==0.8.2 +websocket-client==1.9.0 +websockets==15.0.1 diff --git a/thunder_deployment/go.mod b/thunder_deployment/go.mod new file mode 100644 index 000000000..8ec2daa1c --- /dev/null +++ b/thunder_deployment/go.mod @@ -0,0 +1,3 @@ +module thundercompute.com/beam + +go 1.23 diff --git a/thunder_deployment/infra/beta9/.helmignore b/thunder_deployment/infra/beta9/.helmignore new file mode 100644 index 000000000..0e8a0eb36 --- /dev/null +++ b/thunder_deployment/infra/beta9/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/thunder_deployment/infra/beta9/Chart.lock b/thunder_deployment/infra/beta9/Chart.lock new file mode 100644 index 000000000..7c0bb3826 --- /dev/null +++ b/thunder_deployment/infra/beta9/Chart.lock @@ -0,0 +1,27 @@ +dependencies: +- name: common + repository: https://bjw-s-labs.github.io/helm-charts + version: 2.5.0 +- name: beam-blobcache-chart + repository: oci://public.ecr.aws/n4e0e1y0 + version: 0.1.2 +- name: redis + repository: https://charts.bitnami.com/bitnami + version: 18.9.1 +- name: redis + repository: https://charts.bitnami.com/bitnami + version: 18.9.1 +- name: postgresql + repository: https://charts.bitnami.com/bitnami + version: 13.4.3 +- name: grafana + repository: https://grafana.github.io/helm-charts + version: 7.3.0 +- name: victoria-metrics-single + repository: https://victoriametrics.github.io/helm-charts + version: 0.9.15 +- name: victoria-metrics-agent + repository: https://victoriametrics.github.io/helm-charts + version: 0.9.17 +digest: sha256:b4adfbc1a1ddea3a896f3d880468d6e58a88dd4ae769786f77b577b6929c79cd +generated: "2026-05-27T13:39:46.548822-04:00" diff --git a/thunder_deployment/infra/beta9/Chart.yaml b/thunder_deployment/infra/beta9/Chart.yaml new file mode 100644 index 000000000..bd59984f9 --- /dev/null +++ b/thunder_deployment/infra/beta9/Chart.yaml @@ -0,0 +1,41 @@ +apiVersion: v2 +name: beta9-chart +description: A Helm chart for Beta9 +type: application +version: 0.1.714 +appVersion: 0.1.714 +home: https://beta9.dev +dependencies: +- name: common + repository: https://bjw-s-labs.github.io/helm-charts + version: 2.5.0 +- alias: blobcache + name: beam-blobcache-chart + version: 0.1.2 + repository: oci://public.ecr.aws/n4e0e1y0 + condition: blobcache.enabled +- name: redis + version: 18.9.1 + repository: https://charts.bitnami.com/bitnami + condition: redis.enabled +- alias: juicefs-redis + name: redis + version: 18.9.1 + repository: https://charts.bitnami.com/bitnami + condition: juicefs-redis.enabled +- name: postgresql + version: 13.4.3 + repository: https://charts.bitnami.com/bitnami + condition: postgresql.enabled +- name: grafana + version: 7.3.0 + repository: https://grafana.github.io/helm-charts + condition: metrics.enabled +- name: victoria-metrics-single + version: 0.9.15 + repository: https://victoriametrics.github.io/helm-charts + condition: metrics.enabled +- name: victoria-metrics-agent + version: 0.9.17 + repository: https://victoriametrics.github.io/helm-charts + condition: metrics.enabled diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/.helmignore b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/.helmignore new file mode 100644 index 000000000..0e8a0eb36 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/Chart.lock b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/Chart.lock new file mode 100644 index 000000000..3289cbd0b --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://bjw-s.github.io/helm-charts + version: 2.5.0 +digest: sha256:d40f33f9bf7747337babf6efd9561f1fadc0e2dea867b3146201ca3a8eb70e7a +generated: "2024-02-08T17:59:12.280543-05:00" diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/Chart.yaml b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/Chart.yaml new file mode 100644 index 000000000..9cdb9b04f --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/Chart.yaml @@ -0,0 +1,11 @@ +apiVersion: v2 +appVersion: 0.1.1 +dependencies: +- name: common + repository: https://bjw-s.github.io/helm-charts + version: 2.5.0 +description: A Helm chart for Blobcache +home: https://beam.cloud +name: beam-blobcache-chart +type: application +version: 0.1.2 diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/.helmignore b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/.helmignore new file mode 100644 index 000000000..c62cbf857 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/.helmignore @@ -0,0 +1,28 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ +# OWNERS file for Kubernetes +OWNERS +# helm-docs templates +*.gotmpl +# Test files +tests/ diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/Chart.yaml b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/Chart.yaml new file mode 100644 index 000000000..442854507 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/Chart.yaml @@ -0,0 +1,33 @@ +annotations: + artifacthub.io/changes: |- + - kind: fixed + description: |- + PersistentVolumeClaims now properly created based on `persistence.x.enabled` value + - kind: added + description: |- + Support suspending CronJobs + - kind: added + description: |- + Add support for targetLabels in ServiceMonitor + - kind: added + description: |- + Re-add support for setting mountPropagation on volumemounts + - kind: added + description: |- + Support `envFrom` identifiers and name templates for Secrets and ConfigMaps + - kind: added + description: |- + Support the `job` controller type to generate one-off jobs. +apiVersion: v2 +description: Function library for Helm charts +home: https://github.com/bjw-s/helm-charts/tree/main/charts/library/common +keywords: +- common +- library +kubeVersion: '>=1.22.0-0' +maintainers: +- email: me@bjw-s.dev + name: bjw-s +name: common +type: library +version: 2.5.0 diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/README.md b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/README.md new file mode 100644 index 000000000..76cef450e --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/README.md @@ -0,0 +1,234 @@ +# common + +![Version: 2.5.0](https://img.shields.io/badge/Version-2.5.0-informational?style=flat-square) ![Type: library](https://img.shields.io/badge/Type-library-informational?style=flat-square) + +Function library for Helm charts + +## Requirements + +Kubernetes: `>=1.22.0-0` + +## Dependencies + +| Repository | Name | Version | +|------------|------|---------| + +## Installing the Chart + +This is a [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm). + +**🚨 WARNING: THIS CHART IS NOT MEANT TO BE INSTALLED DIRECTLY** + +## Using this library + +Include this chart as a dependency in your `Chart.yaml` e.g. + +```yaml +# Chart.yaml +dependencies: + - name: common + version: 2.5.0 + repository: https://bjw-s.github.io/helm-charts/ +``` + +For more information, take a look at the [Docs](http://bjw-s.github.io/helm-charts/docs/common-library/introduction/). + +## Configuration + +Read through the [values.yaml](./values.yaml) file. It has several commented out suggested values. + +## Values + +**Important**: When deploying an application Helm chart you can add more values from the common library chart [here](https://github.com/bjw-s/helm-charts/tree/main/charts/library/common) + +The following table contains an overview of available values and their descriptions / default values. + +
+Expand + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| configMaps | object | See below | Configure configMaps for the chart here. Additional configMaps can be added by adding a dictionary key similar to the 'config' object. | +| configMaps.config.annotations | object | `{}` | Annotations to add to the configMap | +| configMaps.config.data | object | `{}` | configMap data content. Helm template enabled. | +| configMaps.config.enabled | bool | `false` | Enables or disables the configMap | +| configMaps.config.labels | object | `{}` | Labels to add to the configMap | +| controllers.main.annotations | object | `{}` | Set annotations on the deployment/statefulset/daemonset/cronjob/job | +| controllers.main.containers.main.args | list | `[]` | Override the args for the default container | +| controllers.main.containers.main.command | list | `[]` | Override the command(s) for the default container | +| controllers.main.containers.main.dependsOn | list | `[]` | Specify if this container depends on any other containers This is used to determine the order in which the containers are rendered. The use of "dependsOn" completely disables the "order" field within the controller. | +| controllers.main.containers.main.env | string | `nil` | Environment variables. Template enabled. Syntax options: A) TZ: UTC B) PASSWD: '{{ .Release.Name }}' B) TZ: value: UTC dependsOn: otherVar D) PASSWD: configMapKeyRef: name: config-map-name key: key-name E) PASSWD: dependsOn: - otherVar1 - otherVar2 valueFrom: secretKeyRef: name: secret-name key: key-name ... F) - name: TZ value: UTC G) - name: TZ value: '{{ .Release.Name }}' | +| controllers.main.containers.main.envFrom | list | `[]` | Secrets and/or ConfigMaps that will be loaded as environment variables. Syntax options: A) Pass an app-template configMap identifier: - config: config B) Pass any configMap name that is not also an identifier (Template enabled): - config: random-configmap-name C) Pass an app-template configMap identifier, explicit syntax: - configMapRef: identifier: config D) Pass any configMap name, explicit syntax (Template enabled): - configMapRef: name: "{{ .Release.Name }}-config" E) Pass an app-template secret identifier: - secret: secret F) Pass any secret name that is not also an identifier (Template enabled): - secret: random-secret-name G) Pass an app-template secret identifier, explicit syntax: - secretRef: identifier: secret H) Pass any secret name, explicit syntax (Template enabled): - secretRef: name: "{{ .Release.Name }}-secret" | +| controllers.main.containers.main.image.pullPolicy | string | `nil` | image pull policy | +| controllers.main.containers.main.image.repository | string | `nil` | image repository | +| controllers.main.containers.main.image.tag | string | `nil` | image tag | +| controllers.main.containers.main.lifecycle | object | `{}` | [[ref](https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/)] | +| controllers.main.containers.main.nameOverride | string | `nil` | Override the container name | +| controllers.main.containers.main.order | int | 99 | Override the default container order Containers get sorted alphanumerically by the `-` combination. | +| controllers.main.containers.main.probes | object | See below | [[ref]](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) | +| controllers.main.containers.main.probes.liveness | object | See below | Liveness probe configuration | +| controllers.main.containers.main.probes.liveness.custom | bool | `false` | Set this to `true` if you wish to specify your own livenessProbe | +| controllers.main.containers.main.probes.liveness.enabled | bool | `true` | Enable the liveness probe | +| controllers.main.containers.main.probes.liveness.spec | object | See below | The spec field contains the values for the default livenessProbe. If you selected `custom: true`, this field holds the definition of the livenessProbe. | +| controllers.main.containers.main.probes.liveness.type | string | "TCP" | sets the probe type when not using a custom probe | +| controllers.main.containers.main.probes.readiness | object | See below | Redainess probe configuration | +| controllers.main.containers.main.probes.readiness.custom | bool | `false` | Set this to `true` if you wish to specify your own readinessProbe | +| controllers.main.containers.main.probes.readiness.enabled | bool | `true` | Enable the readiness probe | +| controllers.main.containers.main.probes.readiness.spec | object | See below | The spec field contains the values for the default readinessProbe. If you selected `custom: true`, this field holds the definition of the readinessProbe. | +| controllers.main.containers.main.probes.readiness.type | string | "TCP" | sets the probe type when not using a custom probe | +| controllers.main.containers.main.probes.startup | object | See below | Startup probe configuration | +| controllers.main.containers.main.probes.startup.custom | bool | `false` | Set this to `true` if you wish to specify your own startupProbe | +| controllers.main.containers.main.probes.startup.enabled | bool | `true` | Enable the startup probe | +| controllers.main.containers.main.probes.startup.spec | object | See below | The spec field contains the values for the default startupProbe. If you selected `custom: true`, this field holds the definition of the startupProbe. | +| controllers.main.containers.main.probes.startup.type | string | "TCP" | sets the probe type when not using a custom probe | +| controllers.main.containers.main.resources | object | `{}` | Set the resource requests / limits for the container. | +| controllers.main.containers.main.securityContext | object | `{}` | Configure the Security Context for the container | +| controllers.main.containers.main.terminationMessagePath | string | `nil` | [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle-1)] | +| controllers.main.containers.main.terminationMessagePolicy | string | `nil` | [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle-1)] | +| controllers.main.containers.main.workingDir | string | `nil` | Override the working directory for the default container | +| controllers.main.cronjob | object | See below | CronJob configuration. Required only when using `controller.type: cronjob`. | +| controllers.main.cronjob.backoffLimit | int | `6` | Limits the number of times a failed job will be retried | +| controllers.main.cronjob.concurrencyPolicy | string | `"Forbid"` | Specifies how to treat concurrent executions of a job that is created by this cron job valid values are Allow, Forbid or Replace | +| controllers.main.cronjob.failedJobsHistory | int | `1` | The number of failed Jobs to keep | +| controllers.main.cronjob.schedule | string | `"*/20 * * * *"` | Sets the CronJob time when to execute your jobs | +| controllers.main.cronjob.startingDeadlineSeconds | int | `30` | The deadline in seconds for starting the job if it misses its scheduled time for any reason | +| controllers.main.cronjob.successfulJobsHistory | int | `1` | The number of succesful Jobs to keep | +| controllers.main.cronjob.suspend | string | false | Suspends the CronJob [[ref]](https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#schedule-suspension) | +| controllers.main.cronjob.timeZone | string | `nil` | Sets the CronJob timezone (only works in Kubernetes >= 1.27) | +| controllers.main.cronjob.ttlSecondsAfterFinished | string | `nil` | If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to be automatically deleted. | +| controllers.main.enabled | bool | `true` | enable the controller. | +| controllers.main.initContainers | object | `{}` | Specify any initContainers here as dictionary items. Each initContainer should have its own key initContainers get sorted alphanumerically by the `-` combination if no order or dependsOn has been configured for them. | +| controllers.main.job | object | See below | Job configuration. Required only when using `controller.type: job`. | +| controllers.main.job.backoffLimit | int | `6` | Limits the number of times a failed job will be retried | +| controllers.main.job.suspend | string | false | Suspends the Job [[ref]](https://kubernetes.io/docs/concepts/workloads/controllers/job/#suspending-a-job) | +| controllers.main.job.ttlSecondsAfterFinished | string | `nil` | If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to be automatically deleted. | +| controllers.main.labels | object | `{}` | Set labels on the deployment/statefulset/daemonset/cronjob/job | +| controllers.main.pod | object | `{}` | | +| controllers.main.replicas | int | `1` | Number of desired pods. When using a HorizontalPodAutoscaler, set this to `null`. | +| controllers.main.revisionHistoryLimit | int | `3` | ReplicaSet revision history limit | +| controllers.main.rollingUpdate.partition | string | `nil` | Set statefulset RollingUpdate partition | +| controllers.main.rollingUpdate.surge | string | `nil` | Set deployment RollingUpdate max surge | +| controllers.main.rollingUpdate.unavailable | string | `nil` | Set deployment RollingUpdate max unavailable | +| controllers.main.statefulset | object | `{"podManagementPolicy":null,"volumeClaimTemplates":[]}` | StatefulSet configuration. Required only when using `controller.type: statefulset`. | +| controllers.main.statefulset.podManagementPolicy | string | `nil` | Set podManagementPolicy, valid values are Parallel and OrderedReady (default). | +| controllers.main.statefulset.volumeClaimTemplates | list | `[]` | Used to create individual disks for each instance. | +| controllers.main.strategy | string | `nil` | Set the controller upgrade strategy For Deployments, valid values are Recreate (default) and RollingUpdate. For StatefulSets, valid values are OnDelete and RollingUpdate (default). DaemonSets/CronJobs/Jobs ignore this. | +| controllers.main.type | string | `"deployment"` | Set the controller type. Valid options are deployment, daemonset, statefulset, cronjob or job | +| defaultPodOptions | object | `{"affinity":{},"annotations":{},"automountServiceAccountToken":true,"dnsConfig":{},"dnsPolicy":null,"enableServiceLinks":true,"hostAliases":[],"hostIPC":false,"hostNetwork":false,"hostPID":false,"hostname":null,"imagePullSecrets":[],"labels":{},"nodeSelector":{},"priorityClassName":null,"restartPolicy":null,"runtimeClassName":null,"schedulerName":null,"securityContext":{},"terminationGracePeriodSeconds":null,"tolerations":[],"topologySpreadConstraints":[]}` | Set default options for all controllers / pods here Each of these options can be overridden on a Controller level | +| defaultPodOptions.affinity | object | `{}` | Defines affinity constraint rules. [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity) | +| defaultPodOptions.annotations | object | `{}` | Set annotations on the Pod. Pod-specific values will be merged with this. | +| defaultPodOptions.automountServiceAccountToken | bool | `true` | Specifies whether a service account token should be automatically mounted. | +| defaultPodOptions.dnsConfig | object | `{}` | Configuring the ndots option may resolve nslookup issues on some Kubernetes setups. | +| defaultPodOptions.dnsPolicy | string | `nil` | Defaults to "ClusterFirst" if hostNetwork is false and "ClusterFirstWithHostNet" if hostNetwork is true. | +| defaultPodOptions.enableServiceLinks | bool | `true` | Enable/disable the generation of environment variables for services. [[ref]](https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#accessing-the-service) | +| defaultPodOptions.hostAliases | list | `[]` | Use hostAliases to add custom entries to /etc/hosts - mapping IP addresses to hostnames. [[ref]](https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/) | +| defaultPodOptions.hostIPC | bool | `false` | Use the host's ipc namespace | +| defaultPodOptions.hostNetwork | bool | `false` | When using hostNetwork make sure you set dnsPolicy to `ClusterFirstWithHostNet` | +| defaultPodOptions.hostPID | bool | `false` | Use the host's pid namespace | +| defaultPodOptions.hostname | string | `nil` | Allows specifying explicit hostname setting | +| defaultPodOptions.imagePullSecrets | list | `[]` | Set image pull secrets | +| defaultPodOptions.labels | object | `{}` | Set labels on the Pod. Pod-specific values will be merged with this. | +| defaultPodOptions.nodeSelector | object | `{}` | Node selection constraint [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector) | +| defaultPodOptions.priorityClassName | string | `nil` | Custom priority class for different treatment by the scheduler | +| defaultPodOptions.restartPolicy | string | `Always`. When `controller.type` is `cronjob` it defaults to `Never`. | Set Container restart policy. | +| defaultPodOptions.runtimeClassName | string | `nil` | Allow specifying a runtimeClassName other than the default one (ie: nvidia) | +| defaultPodOptions.schedulerName | string | `nil` | Allows specifying a custom scheduler name | +| defaultPodOptions.securityContext | object | `{}` | Configure the Security Context for the Pod | +| defaultPodOptions.terminationGracePeriodSeconds | string | `nil` | [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle)] | +| defaultPodOptions.tolerations | list | `[]` | Specify taint tolerations [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) | +| defaultPodOptions.topologySpreadConstraints | list | `[]` | Defines topologySpreadConstraint rules. [[ref]](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) | +| global.annotations | object | `{}` | Set additional global annotations. Helm templates can be used. | +| global.fullnameOverride | string | `nil` | Set the entire name definition | +| global.labels | object | `{}` | Set additional global labels. Helm templates can be used. | +| global.nameOverride | string | `nil` | Set an override for the prefix of the fullname | +| ingress | object | See below | Configure the ingresses for the chart here. Additional ingresses can be added by adding a dictionary key similar to the 'main' ingress. | +| ingress.main.annotations | object | `{}` | Provide additional annotations which may be required. | +| ingress.main.className | string | `nil` | Set the ingressClass that is used for this ingress. | +| ingress.main.defaultBackend | string | `nil` | Configure the defaultBackend for this ingress. This will disable any other rules for the ingress. | +| ingress.main.enabled | bool | `false` | Enables or disables the ingress | +| ingress.main.hosts[0].host | string | `"chart-example.local"` | Host address. Helm template can be passed. | +| ingress.main.hosts[0].paths[0].path | string | `"/"` | Path. Helm template can be passed. | +| ingress.main.hosts[0].paths[0].service.name | string | `"main"` | Overrides the service name reference for this path This can be an actual service name, or reference a service identifier from this values.yaml | +| ingress.main.hosts[0].paths[0].service.port | string | `nil` | Overrides the service port number reference for this path | +| ingress.main.labels | object | `{}` | Provide additional labels which may be required. | +| ingress.main.nameOverride | string | `nil` | Override the name suffix that is used for this ingress. | +| ingress.main.primary | bool | `true` | Make this the primary ingress (used in probes, notes, etc...). If there is more than 1 ingress, make sure that only 1 ingress is marked as primary. | +| ingress.main.tls | list | `[]` | Configure TLS for the ingress. Both secretName and hosts can process a Helm template. | +| networkpolicies | object | See below | Configure the networkPolicies for the chart here. Additional networkPolicies can be added by adding a dictionary key similar to the 'main' networkPolicy. | +| networkpolicies.main.controller | string | `"main"` | Configure which controller this networkPolicy should target | +| networkpolicies.main.enabled | bool | `false` | Enables or disables the networkPolicy item. Defaults to true | +| networkpolicies.main.policyTypes | list | `["Ingress","Egress"]` | The policyTypes for this networkPolicy | +| networkpolicies.main.rules | object | `{"egress":[{}],"ingress":[{}]}` | The rulesets for this networkPolicy [[ref]](https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource) | +| networkpolicies.main.rules.egress | list | `[{}]` | The egress rules for this networkPolicy. Allows all egress traffic by default. | +| networkpolicies.main.rules.ingress | list | `[{}]` | The ingress rules for this networkPolicy. Allows all ingress traffic by default. | +| persistence | object | See below | Configure persistence for the chart here. Additional items can be added by adding a dictionary key similar to the 'config' key. [[ref]](https://bjw-s.github.io/helm-charts/docs/common-library/common-library-storage) | +| persistence.config.accessMode | string | `"ReadWriteOnce"` | AccessMode for the persistent volume. Make sure to select an access mode that is supported by your storage provider! [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes) | +| persistence.config.advancedMounts | object | `{}` | Explicitly configure mounts for specific controllers and containers. Example: advancedMounts: main: # the controller with the "main" identifier main: # the container with the "main" identifier - path: /data/config.yaml readOnly: true mountPropagation: None subPath: config.yaml second-container: # the container with the "second-container" identifier - path: /appdata/config readOnly: true second-controller: # the controller with the "second-controller" identifier main: # the container with the "main" identifier - path: /data/config.yaml readOnly: false subPath: config.yaml | +| persistence.config.dataSource | object | `{}` | The optional data source for the persistentVolumeClaim. [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-populators-and-data-sources) | +| persistence.config.dataSourceRef | object | `{}` | The optional volume populator for the persistentVolumeClaim. [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-populators-and-data-sources) | +| persistence.config.enabled | bool | `false` | Enables or disables the persistence item. Defaults to true | +| persistence.config.existingClaim | string | `nil` | If you want to reuse an existing claim, the name of the existing PVC can be passed here. | +| persistence.config.globalMounts | list | `[]` | Configure mounts to all controllers and containers. By default the persistence item will be mounted to `/`. Example: globalMounts: - path: /config readOnly: false | +| persistence.config.retain | bool | `false` | Set to true to retain the PVC upon `helm uninstall` | +| persistence.config.size | string | `"1Gi"` | The amount of storage that is requested for the persistent volume. | +| persistence.config.storageClass | string | `nil` | Storage Class for the config volume. If set to `-`, dynamic provisioning is disabled. If set to something else, the given storageClass is used. If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. | +| persistence.config.type | string | `"persistentVolumeClaim"` | Sets the persistence type Valid options are persistentVolumeClaim, emptyDir, nfs, hostPath, secret, configMap or custom | +| route | object | See below | Configure the gateway routes for the chart here. Additional routes can be added by adding a dictionary key similar to the 'main' route. [[ref]](https://gateway-api.sigs.k8s.io/references/spec/) | +| route.main.annotations | object | `{}` | Provide additional annotations which may be required. | +| route.main.enabled | bool | `false` | Enables or disables the route | +| route.main.hostnames | list | `[]` | Host addresses. Helm template can be passed. | +| route.main.kind | string | `"HTTPRoute"` | Set the route kind Valid options are GRPCRoute, HTTPRoute, TCPRoute, TLSRoute, UDPRoute | +| route.main.labels | object | `{}` | Provide additional labels which may be required. | +| route.main.nameOverride | string | `nil` | Override the name suffix that is used for this route. | +| route.main.parentRefs | list | `[{"group":"gateway.networking.k8s.io","kind":"Gateway","name":null,"namespace":null,"sectionName":null}]` | Configure the resource the route attaches to. | +| route.main.rules | list | `[{"backendRefs":[],"filters":[],"matches":[{"path":{"type":"PathPrefix","value":"/"}}],"timeouts":{}}]` | Configure rules for routing. Defaults to the primary service. | +| route.main.rules[0].backendRefs | list | `[]` | Configure backends where matching requests should be sent. | +| secrets | object | See below | Use this to populate secrets with the values you specify. Be aware that these values are not encrypted by default, and could therefore visible to anybody with access to the values.yaml file. Additional Secrets can be added by adding a dictionary key similar to the 'secret' object. | +| secrets.secret.annotations | object | `{}` | Annotations to add to the Secret | +| secrets.secret.enabled | bool | `false` | Enables or disables the Secret | +| secrets.secret.labels | object | `{}` | Labels to add to the Secret | +| secrets.secret.stringData | object | `{}` | Secret stringData content. Helm template enabled. | +| service | object | See below | Configure the services for the chart here. Additional services can be added by adding a dictionary key similar to the 'main' service. | +| service.main.annotations | object | `{}` | Provide additional annotations which may be required. | +| service.main.controller | string | `"main"` | Configure which controller this service should target | +| service.main.enabled | bool | `true` | Enables or disables the service | +| service.main.externalTrafficPolicy | string | `nil` | [[ref](https://kubernetes.io/docs/tutorials/services/source-ip/)] | +| service.main.extraSelectorLabels | object | `{}` | Allow adding additional match labels | +| service.main.ipFamilies | list | `[]` | The ip families that should be used. Options: IPv4, IPv6 | +| service.main.ipFamilyPolicy | string | `nil` | Specify the ip policy. Options: SingleStack, PreferDualStack, RequireDualStack | +| service.main.labels | object | `{}` | Provide additional labels which may be required. | +| service.main.nameOverride | string | `nil` | Override the name suffix that is used for this service | +| service.main.ports | object | See below | Configure the Service port information here. Additional ports can be added by adding a dictionary key similar to the 'http' service. | +| service.main.ports.http.appProtocol | string | `nil` | Specify the appProtocol value for the Service. [[ref]](https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol) | +| service.main.ports.http.enabled | bool | `true` | Enables or disables the port | +| service.main.ports.http.nodePort | string | `nil` | Specify the nodePort value for the LoadBalancer and NodePort service types. [[ref]](https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport) | +| service.main.ports.http.port | string | `nil` | The port number | +| service.main.ports.http.primary | bool | `true` | Make this the primary port (used in probes, notes, etc...) If there is more than 1 service, make sure that only 1 port is marked as primary. | +| service.main.ports.http.protocol | string | `"HTTP"` | Port protocol. Support values are `HTTP`, `HTTPS`, `TCP` and `UDP`. HTTP and HTTPS spawn a TCP service and get used for internal URL and name generation | +| service.main.ports.http.targetPort | string | `nil` | Specify a service targetPort if you wish to differ the service port from the application port. If `targetPort` is specified, this port number is used in the container definition instead of the `port` value. Therefore named ports are not supported for this field. | +| service.main.primary | bool | `true` | Make this the primary service for this controller (used in probes, notes, etc...). If there is more than 1 service targeting the controller, make sure that only 1 service is marked as primary. | +| service.main.type | string | `"ClusterIP"` | Set the service type | +| serviceAccount.annotations | object | `{}` | Annotations to add to the service account | +| serviceAccount.create | bool | `false` | Specifies whether a service account should be created | +| serviceAccount.labels | object | `{}` | Labels to add to the service account | +| serviceAccount.name | string | `""` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template | +| serviceMonitor | object | See below | Configure the ServiceMonitors for the chart here. Additional ServiceMonitors can be added by adding a dictionary key similar to the 'main' ServiceMonitors. | +| serviceMonitor.main.annotations | object | `{}` | Provide additional annotations which may be required. | +| serviceMonitor.main.enabled | bool | `false` | Enables or disables the serviceMonitor. | +| serviceMonitor.main.endpoints | list | See values.yaml | Configures the endpoints for the serviceMonitor. | +| serviceMonitor.main.labels | object | `{}` | Provide additional labels which may be required. | +| serviceMonitor.main.nameOverride | string | `nil` | Override the name suffix that is used for this serviceMonitor. | +| serviceMonitor.main.selector | object | `{}` | Configures a custom selector for the serviceMonitor, this takes precedence over specifying a service name. Helm templates can be used. | +| serviceMonitor.main.serviceName | string | `"{{ include \"bjw-s.common.lib.chart.names.fullname\" $ }}"` | Configures the target Service for the serviceMonitor. Helm templates can be used. | +| serviceMonitor.main.targetLabels | list | `[]` | Configures custom targetLabels for the serviceMonitor. (All collected meterics will have these labels, taking the value from the target service) [[ref]](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#servicemonitorspec/) | + +
+ +## Support + +- See the [Docs](http://bjw-s.github.io/helm-charts/docs/) +- Open an [issue](https://github.com/bjw-s/helm-charts/issues/new/choose) +- Join the k8s-at-home [Discord](https://discord.gg/k8s-at-home) community + +---------------------------------------------- +Autogenerated from chart metadata using [helm-docs v1.11.3](https://github.com/norwoodj/helm-docs/releases/v1.11.3) diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_configmap.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_configmap.tpl new file mode 100644 index 000000000..3aa492e62 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_configmap.tpl @@ -0,0 +1,32 @@ +{{/* +This template serves as a blueprint for all configMap objects that are created +within the common library. +*/}} +{{- define "bjw-s.common.class.configMap" -}} + {{- $rootContext := .rootContext -}} + {{- $configMapObject := .object -}} + + {{- $labels := merge + ($configMapObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($configMapObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ $configMapObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +data: + {{- with $configMapObject.data }} + {{- tpl (toYaml .) $rootContext | nindent 2 }} + {{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_cronjob.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_cronjob.tpl new file mode 100644 index 000000000..829f54fc0 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_cronjob.tpl @@ -0,0 +1,61 @@ +{{/* +This template serves as a blueprint for Cronjob objects that are created +using the common library. +*/}} +{{- define "bjw-s.common.class.cronjob" -}} + {{- $rootContext := .rootContext -}} + {{- $cronjobObject := .object -}} + + {{- $timeZone := "" -}} + {{- if ge (int $rootContext.Capabilities.KubeVersion.Minor) 27 }} + {{- $timeZone = dig "cronjob" "timeZone" "" $cronjobObject -}} + {{- end -}} + + {{- $labels := merge + (dict "app.kubernetes.io/component" $cronjobObject.identifier) + ($cronjobObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($cronjobObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: batch/v1 +kind: CronJob +metadata: + name: {{ $cronjobObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + {{- with $cronjobObject.cronjob.suspend }} + suspend: {{ ternary "true" "false" . }} + {{- end }} + concurrencyPolicy: "{{ $cronjobObject.cronjob.concurrencyPolicy }}" + startingDeadlineSeconds: {{ $cronjobObject.cronjob.startingDeadlineSeconds }} + {{- with $timeZone }} + timeZone: "{{ . }}" + {{- end }} + schedule: "{{ $cronjobObject.cronjob.schedule }}" + successfulJobsHistoryLimit: {{ $cronjobObject.cronjob.successfulJobsHistory }} + failedJobsHistoryLimit: {{ $cronjobObject.cronjob.failedJobsHistory }} + jobTemplate: + spec: + {{- with $cronjobObject.cronjob.ttlSecondsAfterFinished }} + ttlSecondsAfterFinished: {{ . }} + {{- end }} + backoffLimit: {{ $cronjobObject.cronjob.backoffLimit }} + template: + metadata: + {{- with (include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $cronjobObject)) }} + annotations: {{ . | nindent 12 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $cronjobObject)) }} + labels: {{ . | nindent 12 }} + {{- end }} + spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $cronjobObject) | nindent 10 }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_daemonset.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_daemonset.tpl new file mode 100644 index 000000000..cdb26fb84 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_daemonset.tpl @@ -0,0 +1,40 @@ +{{/* +This template serves as the blueprint for the DaemonSet objects that are created +within the common library. +*/}} +{{- define "bjw-s.common.class.daemonset" -}} + {{- $rootContext := .rootContext -}} + {{- $daemonsetObject := .object -}} + + {{- $labels := merge + (dict "app.kubernetes.io/component" $daemonsetObject.identifier) + ($daemonsetObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($daemonsetObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: {{ $daemonsetObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + revisionHistoryLimit: {{ $daemonsetObject.revisionHistoryLimit }} + selector: + matchLabels: + app.kubernetes.io/component: {{ $daemonsetObject.identifier }} + {{- include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | nindent 6 }} + template: + metadata: + annotations: {{ include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $daemonsetObject) | nindent 8 }} + labels: {{ include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $daemonsetObject) | nindent 8 }} + spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $daemonsetObject) | nindent 6 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_deployment.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_deployment.tpl new file mode 100644 index 000000000..ee0a829c4 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_deployment.tpl @@ -0,0 +1,60 @@ +{{/* +This template serves as a blueprint for Deployment objects that are created +using the common library. +*/}} +{{- define "bjw-s.common.class.deployment" -}} + {{- $rootContext := .rootContext -}} + {{- $deploymentObject := .object -}} + + {{- $labels := merge + (dict "app.kubernetes.io/component" $deploymentObject.identifier) + ($deploymentObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($deploymentObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ $deploymentObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + revisionHistoryLimit: {{ $deploymentObject.revisionHistoryLimit }} + {{- if not (eq $deploymentObject.replicas nil) }} + replicas: {{ $deploymentObject.replicas }} + {{- end }} + strategy: + type: {{ $deploymentObject.strategy }} + {{- with $deploymentObject.rollingUpdate }} + {{- if and (eq $deploymentObject.strategy "RollingUpdate") (or .surge .unavailable) }} + rollingUpdate: + {{- with .unavailable }} + maxUnavailable: {{ . }} + {{- end }} + {{- with .surge }} + maxSurge: {{ . }} + {{- end }} + {{- end }} + {{- end }} + selector: + matchLabels: + app.kubernetes.io/component: {{ $deploymentObject.identifier }} + {{- include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | nindent 6 }} + template: + metadata: + {{- with (include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $deploymentObject)) }} + annotations: {{ . | nindent 8 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $deploymentObject)) }} + labels: {{ . | nindent 8 }} + {{- end }} + spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $deploymentObject) | nindent 6 }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_ingress.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_ingress.tpl new file mode 100644 index 000000000..841cd33e2 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_ingress.tpl @@ -0,0 +1,85 @@ +{{/* +This template serves as a blueprint for all Ingress objects that are created +within the common library. +*/}} + +{{- define "bjw-s.common.class.ingress" -}} + {{- $rootContext := .rootContext -}} + {{- $ingressObject := .object -}} + + {{- $labels := merge + ($ingressObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($ingressObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ $ingressObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + {{- if $ingressObject.className }} + ingressClassName: {{ $ingressObject.className }} + {{- end }} + {{- if $ingressObject.tls }} + tls: + {{- range $ingressObject.tls }} + - hosts: + {{- range .hosts }} + - {{ tpl . $rootContext | quote }} + {{- end }} + {{- $secretName := tpl (default "" .secretName) $rootContext }} + {{- if $secretName }} + secretName: {{ $secretName | quote}} + {{- end }} + {{- end }} + {{- end }} + {{- if $ingressObject.defaultBackend }} + defaultBackend: {{ $ingressObject.defaultBackend }} + {{- else }} + rules: + {{- range $ingressObject.hosts }} + - host: {{ tpl .host $rootContext | quote }} + http: + paths: + {{- range .paths }} + - path: {{ tpl .path $rootContext | quote }} + pathType: {{ default "Prefix" .pathType }} + backend: + service: + {{ $service := include "bjw-s.common.lib.service.getByIdentifier" (dict "rootContext" $rootContext "id" .service.name) | fromYaml -}} + {{ $servicePort := 0 -}} + + {{ if empty (dig "port" nil .service) -}} + {{/* Default to the Service primary port if no port has been specified */ -}} + {{ if $service -}} + {{ $defaultServicePort := include "bjw-s.common.lib.service.primaryPort" (dict "rootContext" $rootContext "serviceObject" $service) | fromYaml -}} + {{ if $defaultServicePort -}} + {{ $servicePort = $defaultServicePort.port -}} + {{ end -}} + {{ end -}} + {{ else -}} + {{/* If a port number is given, use that */ -}} + {{ if kindIs "float64" .service.port -}} + {{ $servicePort = .service.port -}} + {{ else if kindIs "string" .service.port -}} + {{/* If a port name is given, try to resolve to a number */ -}} + {{ $servicePort = include "bjw-s.common.lib.service.getPortNumberByName" (dict "rootContext" $rootContext "serviceID" .service.name "portName" .service.port) -}} + {{ end -}} + {{ end -}} + name: {{ default .service.name $service.name }} + port: + number: {{ $servicePort }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_job.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_job.tpl new file mode 100644 index 000000000..9c8a99ece --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_job.tpl @@ -0,0 +1,46 @@ +{{/* +This template serves as the blueprint for the job objects that are created +within the common library. +*/}} +{{- define "bjw-s.common.class.job" -}} + {{- $rootContext := .rootContext -}} + {{- $jobObject := .object -}} + + {{- $labels := merge + (dict "app.kubernetes.io/component" $jobObject.identifier) + ($jobObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($jobObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ $jobObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + {{- with $jobObject.job.suspend }} + suspend: {{ ternary "true" "false" . }} + {{- end }} + {{- with $jobObject.job.ttlSecondsAfterFinished }} + ttlSecondsAfterFinished: {{ . }} + {{- end }} + backoffLimit: {{ $jobObject.job.backoffLimit }} + template: + metadata: + {{- with (include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $jobObject)) }} + annotations: {{ . | nindent 8 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $jobObject)) }} + labels: {{ . | nindent 8 }} + {{- end }} + spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $jobObject) | nindent 6 }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_networkpolicy.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_networkpolicy.tpl new file mode 100644 index 000000000..0854d145e --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_networkpolicy.tpl @@ -0,0 +1,49 @@ +{{/* +This template serves as a blueprint for all networkPolicy objects that are created +within the common library. +*/}} +{{- define "bjw-s.common.class.networkpolicy" -}} + {{- $rootContext := .rootContext -}} + {{- $networkPolicyObject := .object -}} + + {{- $labels := merge + ($networkPolicyObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($networkPolicyObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} + {{- $podSelector := dict -}} + {{- if (hasKey $networkPolicyObject "podSelector") -}} + {{- $podSelector = $networkPolicyObject.podSelector -}} + {{- else -}} + {{- $podSelector = dict "matchLabels" (merge + ($networkPolicyObject.extraSelectorLabels | default dict) + (dict "app.kubernetes.io/component" $networkPolicyObject.controller) + (include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | fromYaml) + ) -}} + {{- end -}} +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: {{ $networkPolicyObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + podSelector: {{- toYaml $podSelector | nindent 4 }} + {{- with $networkPolicyObject.policyTypes }} + policyTypes: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $networkPolicyObject.rules.ingress }} + ingress: {{- tpl (toYaml .) $rootContext | nindent 4 -}} + {{- end }} + {{- with $networkPolicyObject.rules.egress }} + egress: {{- tpl (toYaml .) $rootContext | nindent 4 -}} + {{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_pvc.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_pvc.tpl new file mode 100644 index 000000000..1c6ee9c17 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_pvc.tpl @@ -0,0 +1,53 @@ +{{/* +This template serves as a blueprint for all PersistentVolumeClaim objects that are created +within the common library. +*/}} +{{- define "bjw-s.common.class.pvc" -}} + {{- $rootContext := .rootContext -}} + {{- $pvcObject := .object -}} + + {{- $labels := merge + ($pvcObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($pvcObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} + {{- if $pvcObject.retain }} + {{- $annotations = merge + (dict "helm.sh/resource-policy" "keep") + $annotations + -}} + {{- end -}} + +--- +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: {{ $pvcObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + accessModes: + - {{ required (printf "accessMode is required for PVC %v" $pvcObject.name) $pvcObject.accessMode | quote }} + resources: + requests: + storage: {{ required (printf "size is required for PVC %v" $pvcObject.name) $pvcObject.size | quote }} + {{- if $pvcObject.storageClass }} + storageClassName: {{ if (eq "-" $pvcObject.storageClass) }}""{{- else }}{{ $pvcObject.storageClass | quote }}{{- end }} + {{- end }} + {{- if $pvcObject.volumeName }} + volumeName: {{ $pvcObject.volumeName | quote }} + {{- end }} + {{- with $pvcObject.dataSource }} + dataSource: {{- tpl (toYaml .) $rootContext | nindent 10 }} + {{- end }} + {{- with $pvcObject.dataSourceRef }} + dataSourceRef: {{- tpl (toYaml .) $rootContext | nindent 10 }} + {{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_route.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_route.tpl new file mode 100644 index 000000000..123bc5fef --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_route.tpl @@ -0,0 +1,86 @@ +{{/* +This template serves as a blueprint for all Route objects that are created +within the common library. +*/}} +{{- define "bjw-s.common.class.route" -}} + {{- $rootContext := .rootContext -}} + {{- $routeObject := .object -}} + + {{- $routeKind := $routeObject.kind | default "HTTPRoute" -}} + {{- $apiVersion := "gateway.networking.k8s.io/v1alpha2" -}} + {{- if $rootContext.Capabilities.APIVersions.Has (printf "gateway.networking.k8s.io/v1beta1/%s" $routeKind) }} + {{- $apiVersion = "gateway.networking.k8s.io/v1beta1" -}} + {{- end -}} + {{- if $rootContext.Capabilities.APIVersions.Has (printf "gateway.networking.k8s.io/v1/%s" $routeKind) }} + {{- $apiVersion = "gateway.networking.k8s.io/v1" -}} + {{- end -}} + {{- $labels := merge + ($routeObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($routeObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: {{ $apiVersion }} +kind: {{ $routeKind }} +metadata: + name: {{ $routeObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + parentRefs: + {{- range $routeObject.parentRefs }} + - group: {{ default "gateway.networking.k8s.io" .group }} + kind: {{ default "Gateway" .kind }} + name: {{ required (printf "parentRef name is required for %v %v" $routeKind $routeObject.name) .name }} + namespace: {{ required (printf "parentRef namespace is required for %v %v" $routeKind $routeObject.name) .namespace }} + {{- if .sectionName }} + sectionName: {{ .sectionName | quote }} + {{- end }} + {{- end }} + {{- if and (ne $routeKind "TCPRoute") (ne $routeKind "UDPRoute") $routeObject.hostnames }} + hostnames: + {{- range $routeObject.hostnames }} + - {{ tpl . $rootContext | quote }} + {{- end }} + {{- end }} + rules: + {{- range $routeObject.rules }} + - backendRefs: + {{- range .backendRefs }} + {{ $service := include "bjw-s.common.lib.service.getByIdentifier" (dict "rootContext" $rootContext "id" .name) | fromYaml -}} + {{ $servicePrimaryPort := dict -}} + {{ if $service -}} + {{ $servicePrimaryPort = include "bjw-s.common.lib.service.primaryPort" (dict "rootContext" $rootContext "serviceObject" $service) | fromYaml -}} + {{- end }} + - group: {{ default "" .group | quote}} + kind: {{ default "Service" .kind }} + name: {{ default .name $service.name }} + namespace: {{ default $rootContext.Release.Namespace .namespace }} + port: {{ default .port $servicePrimaryPort.port }} + weight: {{ default 1 .weight }} + {{- end }} + {{- if or (eq $routeKind "HTTPRoute") (eq $routeKind "GRPCRoute") }} + {{- with .matches }} + matches: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .filters }} + filters: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- end }} + {{- if (eq $routeKind "HTTPRoute") }} + {{- with .timeouts }} + timeouts: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_secret.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_secret.tpl new file mode 100644 index 000000000..a46fe534d --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_secret.tpl @@ -0,0 +1,39 @@ +{{/* +This template serves as a blueprint for all Secret objects that are created +within the common library. +*/}} +{{- define "bjw-s.common.class.secret" -}} + {{- $rootContext := .rootContext -}} + {{- $secretObject := .object -}} + + {{- $labels := merge + ($secretObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($secretObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} + + {{- $stringData := "" -}} + {{- with $secretObject.stringData -}} + {{- $stringData = (toYaml $secretObject.stringData) | trim -}} + {{- end -}} +--- +apiVersion: v1 +kind: Secret +{{- with $secretObject.type }} +type: {{ . }} +{{- end }} +metadata: + name: {{ $secretObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +{{- with $stringData }} +stringData: {{- tpl $stringData $rootContext | nindent 2 }} +{{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_service.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_service.tpl new file mode 100644 index 000000000..223e82b7f --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_service.tpl @@ -0,0 +1,104 @@ +{{/* +This template serves as a blueprint for all Service objects that are created +within the common library. +*/}} +{{- define "bjw-s.common.class.service" -}} + {{- $rootContext := .rootContext -}} + {{- $serviceObject := .object -}} + + {{- $svcType := $serviceObject.type | default "" -}} + {{- $enabledPorts := include "bjw-s.common.lib.service.enabledPorts" (dict "rootContext" $rootContext "serviceObject" $serviceObject) | fromYaml }} + {{- $labels := merge + (dict "app.kubernetes.io/service" $serviceObject.name) + ($serviceObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($serviceObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ $serviceObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + {{- if (or (eq $svcType "ClusterIP") (empty $svcType)) }} + type: ClusterIP + {{- if $serviceObject.clusterIP }} + clusterIP: {{ $serviceObject.clusterIP }} + {{end}} + {{- else if eq $svcType "LoadBalancer" }} + type: {{ $svcType }} + {{- if $serviceObject.loadBalancerIP }} + loadBalancerIP: {{ $serviceObject.loadBalancerIP }} + {{- end }} + {{- if $serviceObject.loadBalancerSourceRanges }} + loadBalancerSourceRanges: + {{ toYaml $serviceObject.loadBalancerSourceRanges | nindent 4 }} + {{- end -}} + {{- else }} + type: {{ $svcType }} + {{- end }} + {{- if $serviceObject.externalTrafficPolicy }} + externalTrafficPolicy: {{ $serviceObject.externalTrafficPolicy }} + {{- end }} + {{- if hasKey $serviceObject "allocateLoadBalancerNodePorts" }} + allocateLoadBalancerNodePorts: {{ $serviceObject.allocateLoadBalancerNodePorts }} + {{- end }} + {{- if $serviceObject.sessionAffinity }} + sessionAffinity: {{ $serviceObject.sessionAffinity }} + {{- if $serviceObject.sessionAffinityConfig }} + sessionAffinityConfig: + {{ toYaml $serviceObject.sessionAffinityConfig | nindent 4 }} + {{- end -}} + {{- end }} + {{- with $serviceObject.externalIPs }} + externalIPs: + {{- toYaml . | nindent 4 }} + {{- end }} + {{- if $serviceObject.publishNotReadyAddresses }} + publishNotReadyAddresses: {{ $serviceObject.publishNotReadyAddresses }} + {{- end }} + {{- if $serviceObject.ipFamilyPolicy }} + ipFamilyPolicy: {{ $serviceObject.ipFamilyPolicy }} + {{- end }} + {{- with $serviceObject.ipFamilies }} + ipFamilies: + {{ toYaml . | nindent 4 }} + {{- end }} + ports: + {{- range $name, $port := $enabledPorts }} + - port: {{ $port.port }} + targetPort: {{ $port.targetPort | default $port.port }} + {{- if $port.protocol }} + {{- if or ( eq $port.protocol "HTTP" ) ( eq $port.protocol "HTTPS" ) ( eq $port.protocol "TCP" ) }} + protocol: TCP + {{- else }} + protocol: {{ $port.protocol }} + {{- end }} + {{- else }} + protocol: TCP + {{- end }} + name: {{ $name }} + {{- if (and (eq $svcType "NodePort") (not (empty $port.nodePort))) }} + nodePort: {{ $port.nodePort }} + {{ end }} + {{- if (not (empty $port.appProtocol)) }} + appProtocol: {{ $port.appProtocol }} + {{ end }} + {{- end -}} + {{- with (merge + ($serviceObject.extraSelectorLabels | default dict) + (dict "app.kubernetes.io/component" $serviceObject.controller) + (include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | fromYaml) + ) }} + selector: {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_serviceAccount.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_serviceAccount.tpl new file mode 100644 index 000000000..2b109ad0c --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_serviceAccount.tpl @@ -0,0 +1,30 @@ +{{/* +This template serves as a blueprint for ServiceAccount objects that are created +using the common library. +*/}} +{{- define "bjw-s.common.class.serviceAccount" -}} + {{- $rootContext := .rootContext -}} + {{- $serviceAccountObject := .object -}} + + {{- $labels := merge + ($serviceAccountObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($serviceAccountObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ $serviceAccountObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +secrets: + - name: {{ include "bjw-s.common.lib.chart.names.fullname" $rootContext }}-sa-token +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_serviceMonitor.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_serviceMonitor.tpl new file mode 100644 index 000000000..b14186081 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_serviceMonitor.tpl @@ -0,0 +1,37 @@ +{{- define "bjw-s.common.class.serviceMonitor" -}} + {{- $rootContext := .rootContext -}} + {{- $serviceMonitorObject := .object -}} + {{- $labels := merge + ($serviceMonitorObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($serviceMonitorObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ $serviceMonitorObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + selector: + {{- if $serviceMonitorObject.selector -}} + {{- tpl ($serviceMonitorObject.selector | toYaml) $rootContext | nindent 4}} + {{- else }} + matchLabels: + app.kubernetes.io/service: {{ tpl $serviceMonitorObject.serviceName $rootContext }} + {{- include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | nindent 6 }} + {{- end }} + endpoints: {{- toYaml $serviceMonitorObject.endpoints | nindent 4 }} + {{- if not (empty $serviceMonitorObject.targetLabels )}} + targetLabels: + {{- toYaml $serviceMonitorObject.targetLabels | nindent 4 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_statefulset.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_statefulset.tpl new file mode 100644 index 000000000..bdcf48a3f --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_statefulset.tpl @@ -0,0 +1,56 @@ +{{/* +This template serves as the blueprint for the StatefulSet objects that are created +within the common library. +*/}} +{{- define "bjw-s.common.class.statefulset" -}} + {{- $rootContext := .rootContext -}} + {{- $statefulsetObject := .object -}} + + {{- $labels := merge + (dict "app.kubernetes.io/component" $statefulsetObject.identifier) + ($statefulsetObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($statefulsetObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ $statefulsetObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + revisionHistoryLimit: {{ $statefulsetObject.revisionHistoryLimit }} + replicas: {{ $statefulsetObject.replicas }} + podManagementPolicy: {{ dig "statefulset" "podManagementPolicy" "OrderedReady" $statefulsetObject }} + updateStrategy: + type: {{ $statefulsetObject.strategy }} + {{- if and (eq $statefulsetObject.strategy "RollingUpdate") (dig "rollingUpdate" "partition" nil $statefulsetObject) }} + rollingUpdate: + partition: {{ $statefulsetObject.rollingUpdate.partition }} + {{- end }} + selector: + matchLabels: + app.kubernetes.io/component: {{ $statefulsetObject.identifier }} + {{- include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | nindent 6 }} + serviceName: {{ include "bjw-s.common.lib.chart.names.fullname" $rootContext }} + template: + metadata: + {{- with (include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $statefulsetObject)) }} + annotations: {{ . | nindent 8 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $statefulsetObject)) }} + labels: {{ . | nindent 8 }} + {{- end }} + spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $statefulsetObject) | nindent 6 }} + {{- with (include "bjw-s.common.lib.statefulset.volumeclaimtemplates" (dict "rootContext" $rootContext "statefulsetObject" $statefulsetObject)) }} + volumeClaimTemplates: {{ . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_getMapItemsWithKey.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_getMapItemsWithKey.tpl new file mode 100644 index 000000000..0a65d4dc8 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_getMapItemsWithKey.tpl @@ -0,0 +1,17 @@ +{{/* +Returns the items in a map that have a certain key +*/}} +{{- define "bjw-s.common.lib.getMapItemsWithKey" -}} + {{- $map := .map -}} + {{- $keyToFind := .key -}} + {{- $output := dict -}} + + {{- if not (empty $keyToFind) -}} + {{- range $key, $item := $map -}} + {{- if not (empty (dig $keyToFind nil $item)) -}} + {{- $_ := set $output $key $item -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- $output | toYaml -}} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_kahn.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_kahn.tpl new file mode 100644 index 000000000..319a05c87 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_kahn.tpl @@ -0,0 +1,35 @@ +{{/* +Implementation of Kahn's algorithm based on +https://en.wikipedia.org/wiki/Topological_sorting#Kahn's_algorithm + +source: https://github.com/dastrobu/helm-charts/blob/main/environment-variables/templates/_kahn.tpl +*/}} +{{- define "bjw-s.common.lib.kahn" -}} + {{- $graph := .graph -}} + {{- if empty $graph -}} + {{- $_ := set . "out" list -}} + {{- else -}} + {{- $S := list -}} + + {{- range $node, $edges := $graph -}} + {{- if empty $edges -}} + {{- $S = append $S $node -}} + {{- end -}} + {{- end -}} + + {{- if empty $S -}} + {{- fail (printf "graph is cyclic or has bad edge definitions. Remaining graph is:\n%s" ( .graph | toYaml ) ) }} + {{- end -}} + + {{- $n := first $S -}} + {{- $_ := unset $graph $n -}} + + {{- range $node, $edges := $graph -}} + {{- $_ := set $graph $node ( without $edges $n ) -}} + {{- end -}} + + {{- $args := dict "graph" $graph "out" list -}} + {{- include "bjw-s.common.lib.kahn" $args -}} + {{- $_ = set . "out" ( concat ( list $n ) $args.out ) -}} + {{- end -}} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_names.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_names.tpl new file mode 100644 index 000000000..15725e512 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_names.tpl @@ -0,0 +1,35 @@ +{{/* Expand the name of the chart */}} +{{- define "bjw-s.common.lib.chart.names.name" -}} + {{- $globalNameOverride := get .Values.global "nameOverride" -}} + {{- $nameOverride := get .Values "nameOverride" -}} + {{- $name := $globalNameOverride | default $nameOverride | default .Chart.Name -}} + {{- $name | toString | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "bjw-s.common.lib.chart.names.fullname" -}} + {{- $name := include "bjw-s.common.lib.chart.names.name" . -}} + {{- $globalFullNameOverride := get .Values.global "fullnameOverride" -}} + {{- $fullNameOverride := get .Values "fullnameOverride" -}} + + {{- if or $fullNameOverride $globalFullNameOverride -}} + {{- $name = ($globalFullNameOverride | default $fullNameOverride) -}} + {{- else -}} + {{- if contains $name .Release.Name -}} + {{- $name = .Release.Name -}} + {{- else -}} + {{- $name = printf "%s-%s" .Release.Name $name -}} + {{- end -}} + {{- end -}} + + {{- $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* Create chart name and version as used by the chart label */}} +{{- define "bjw-s.common.lib.chart.names.chart" -}} + {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_getByIdentifier.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_getByIdentifier.tpl new file mode 100644 index 000000000..87b10a3b1 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_getByIdentifier.tpl @@ -0,0 +1,12 @@ +{{/* +Return a configMap Object by its Identifier. +*/}} +{{- define "bjw-s.common.lib.configMap.getByIdentifier" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + + {{- $configMapValues := dig $identifier nil $rootContext.Values.configMaps -}} + {{- if not (empty $configMapValues) -}} + {{- include "bjw-s.common.lib.configMap.valuesToObject" (dict "rootContext" $rootContext "id" $identifier "values" $configMapValues) -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_validate.tpl new file mode 100644 index 000000000..c61c70441 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_validate.tpl @@ -0,0 +1,7 @@ +{{/* +Validate configMap values +*/}} +{{- define "bjw-s.common.lib.configMap.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $configMapValues := .object -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_valuesToObject.tpl new file mode 100644 index 000000000..1cad88337 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_valuesToObject.tpl @@ -0,0 +1,24 @@ +{{/* +Convert configMap values to an object +*/}} +{{- define "bjw-s.common.lib.configMap.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Determine and inject the configMap name */ -}} + {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + + {{- if $objectValues.nameOverride -}} + {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} + {{- else -}} + {{- if ne $identifier "main" -}} + {{- $objectName = printf "%s-%s" $objectName $identifier -}} + {{- end -}} + {{- end -}} + {{- $_ := set $objectValues "name" $objectName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Return the configMap object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_spec.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_spec.tpl new file mode 100644 index 000000000..9dfd3d43c --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_spec.tpl @@ -0,0 +1,54 @@ +{{- /* +The container definition included in the Pod. +*/ -}} +{{- define "bjw-s.common.lib.container.spec" -}} + {{- $rootContext := .rootContext -}} + {{- $controllerObject := .controllerObject -}} + {{- $containerObject := .containerObject -}} + {{- $ctx := dict "rootContext" $rootContext "controllerObject" $controllerObject "containerObject" $containerObject -}} + +name: {{ include "bjw-s.common.lib.container.field.name" (dict "ctx" $ctx) | trim }} +image: {{ include "bjw-s.common.lib.container.field.image" (dict "ctx" $ctx) | trim }} + {{- with $containerObject.image.pullPolicy }} +imagePullPolicy: {{ . | trim }} + {{- end -}} + {{- with (include "bjw-s.common.lib.container.field.command" (dict "ctx" $ctx) | trim) }} +command: {{ . | trim | nindent 2 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.container.field.args" (dict "ctx" $ctx) | trim) }} +args: {{ . | trim | nindent 2 }} + {{- end -}} + {{- with $containerObject.workingDir }} +workingDir: {{ . | trim }} + {{- end -}} + {{- with $containerObject.securityContext }} +securityContext: {{ toYaml . | trim | nindent 2 }} + {{- end -}} + {{- with $containerObject.lifecycle }} +lifecycle: {{ toYaml . | trim | nindent 2 }} + {{- end -}} + {{- with $containerObject.terminationMessagePath }} +terminationMessagePath: {{ . | trim }} + {{- end -}} + {{- with $containerObject.terminationMessagePolicy }} +terminationMessagePolicy: {{ . | trim }} + {{- end -}} + {{- with (include "bjw-s.common.lib.container.field.env" (dict "ctx" $ctx) | trim) }} +env: {{ . | trim | nindent 2 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.container.field.envFrom" (dict "ctx" $ctx) | trim) }} +envFrom: {{ . | trim | nindent 2 }} + {{- end -}} + {{- with $containerObject.ports }} +ports: {{ toYaml . | trim | nindent 2 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.container.field.probes" (dict "ctx" $ctx) | trim) }} + {{- . | trim | nindent 0 -}} + {{- end -}} + {{- with $containerObject.resources }} +resources: {{ toYaml . | trim | nindent 2 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.container.field.volumeMounts" (dict "ctx" $ctx) | trim) }} +volumeMounts: {{ . | trim | nindent 2 }} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_validate.tpl new file mode 100644 index 000000000..6b3176bee --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_validate.tpl @@ -0,0 +1,20 @@ +{{/* +Validate container values +*/}} +{{- define "bjw-s.common.lib.container.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $controllerObject := .controllerObject -}} + {{- $containerObject := .containerObject -}} + + {{- if not (kindIs "map" $containerObject.image) -}} + {{- fail (printf "Image required to be a dictionary with repository and tag fields. (controller %s, container %s)" $controllerObject.identifier $containerObject.identifier) }} + {{- end -}} + + {{- if empty (dig "image" "repository" nil $containerObject) -}} + {{- fail (printf "No image repository specified for container. (controller %s, container %s)" $controllerObject.identifier $containerObject.identifier) }} + {{- end -}} + + {{- if empty (dig "image" "tag" nil $containerObject) -}} + {{- fail (printf "No image tag specified for container. (controller %s, container %s)" $controllerObject.identifier $containerObject.identifier) }} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_valuesToObject.tpl new file mode 100644 index 000000000..50b9e2f50 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_valuesToObject.tpl @@ -0,0 +1,27 @@ +{{/* +Convert container values to an object +*/}} +{{- define "bjw-s.common.lib.container.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Process image tags */ -}} + {{- if kindIs "map" $objectValues.image -}} + {{- $imageTag := dig "image" "tag" "" $objectValues -}} + {{- /* Convert float64 image tags to string */ -}} + {{- if kindIs "float64" $imageTag -}} + {{- $imageTag = $imageTag | toString -}} + {{- end -}} + + {{- /* Process any templates in the tag */ -}} + {{- $imageTag = tpl $imageTag $rootContext -}} + + {{- $_ := set $objectValues.image "tag" $imageTag -}} + {{- end -}} + + {{- /* Return the container object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_args.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_args.tpl new file mode 100644 index 000000000..172e444ee --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_args.tpl @@ -0,0 +1,26 @@ +{{/* +Args used by the container. +*/}} +{{- define "bjw-s.common.lib.container.field.args" -}} + {{- $ctx := .ctx -}} + {{- $containerObject := $ctx.containerObject -}} + + {{- /* Default to empty list */ -}} + {{- $args := list -}} + + {{- /* See if an override is desired */ -}} + {{- if not (empty (get $containerObject "args")) -}} + {{- $option := get $containerObject "args" -}} + {{- if not (empty $option) -}} + {{- if kindIs "string" $option -}} + {{- $args = append $args $option -}} + {{- else -}} + {{- $args = $option -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- if not (empty $args) -}} + {{- $args | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_command.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_command.tpl new file mode 100644 index 000000000..67e3b65bc --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_command.tpl @@ -0,0 +1,26 @@ +{{/* +Command used by the container. +*/}} +{{- define "bjw-s.common.lib.container.field.command" -}} + {{- $ctx := .ctx -}} + {{- $containerObject := $ctx.containerObject -}} + + {{- /* Default to empty list */ -}} + {{- $command := list -}} + + {{- /* See if an override is desired */ -}} + {{- if not (empty (get $containerObject "command")) -}} + {{- $option := get $containerObject "command" -}} + {{- if not (empty $option) -}} + {{- if kindIs "string" $option -}} + {{- $command = append $command $option -}} + {{- else -}} + {{- $command = $option -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- if not (empty $command) -}} + {{- $command | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_env.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_env.tpl new file mode 100644 index 000000000..72973fb2a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_env.tpl @@ -0,0 +1,82 @@ +{{/* +Env field used by the container. +*/}} +{{- define "bjw-s.common.lib.container.field.env" -}} + {{- $ctx := .ctx -}} + {{- $rootContext := $ctx.rootContext -}} + {{- $containerObject := $ctx.containerObject -}} + + {{- /* Default to empty list */ -}} + {{- $envList := list -}} + + {{- /* See if an override is desired */ -}} + {{- if not (empty (get $containerObject "env")) -}} + {{- if kindIs "slice" $containerObject.env -}} + {{- /* Env is a list so we assume the order is already as desired */ -}} + {{- range $name, $var := $containerObject.env -}} + {{- if kindIs "int" $name -}} + {{- $name = required "environment variables as a list of maps require a name field" $var.name -}} + {{- end -}} + {{- end -}} + {{- $envList = $containerObject.env -}} + {{- else -}} + {{- /* Env is a map so we must check if ordering is desired */ -}} + {{- $graph := dict -}} + + {{- range $name, $var := $containerObject.env -}} + {{- if kindIs "map" $var -}} + {{- /* Value is a map so ordering can be specified */ -}} + {{- if empty (dig "dependsOn" nil $var) -}} + {{- $_ := set $graph $name ( list ) -}} + {{- else if kindIs "string" $var.dependsOn -}} + {{- $_ := set $graph $name ( list $var.dependsOn ) -}} + {{- else if kindIs "slice" $var.dependsOn -}} + {{- $_ := set $graph $name $var.dependsOn -}} + {{- end -}} + {{- else -}} + {{- /* Value is not a map so no ordering can be specified */ -}} + {{- $_ := set $graph $name ( list ) -}} + {{- end -}} + {{- end -}} + + {{- $args := dict "graph" $graph "out" list -}} + {{- include "bjw-s.common.lib.kahn" $args -}} + + {{- range $name := $args.out -}} + {{- $envItem := dict "name" $name -}} + {{- $envValue := get $containerObject.env $name -}} + + {{- if kindIs "map" $envValue -}} + {{- $envItem := merge $envItem (omit $envValue "dependsOn") -}} + {{- else -}} + {{- $_ := set $envItem "value" $envValue -}} + {{- end -}} + + {{- $envList = append $envList $envItem -}} + {{- end -}} + + {{- $args = dict -}} + {{- end -}} + {{- end -}} + + {{- if not (empty $envList) -}} + {{- $output := list -}} + {{- range $envList -}} + {{- if hasKey . "value" -}} + {{- if kindIs "string" .value -}} + {{- $output = append $output (dict "name" .name "value" (tpl .value $rootContext)) -}} + {{- else if or (kindIs "float64" .value) (kindIs "bool" .value) -}} + {{- $output = append $output (dict "name" .name "value" (.value | toString)) -}} + {{- else -}} + {{- $output = append $output (dict "name" .name "value" .value) -}} + {{- end -}} + {{- else if hasKey . "valueFrom" -}} + {{- $parsedValue := (tpl (.valueFrom | toYaml) $rootContext) | fromYaml -}} + {{- $output = append $output (dict "name" .name "valueFrom" $parsedValue) -}} + {{- else -}} + {{- $output = append $output (dict "name" .name "valueFrom" (omit . "name")) -}} + {{- end -}} + {{- end -}} + {{- $output | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_envFrom.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_envFrom.tpl new file mode 100644 index 000000000..84e731291 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_envFrom.tpl @@ -0,0 +1,58 @@ +{{/* +Env field used by the container. +*/}} +{{- define "bjw-s.common.lib.container.field.envFrom" -}} + {{- $ctx := .ctx -}} + {{- $rootContext := $ctx.rootContext -}} + {{- $containerObject := $ctx.containerObject -}} + + {{- if not (empty (get $containerObject "envFrom")) -}} + {{- $envFrom := list -}} + {{- range $containerObject.envFrom -}} + {{- $item := dict -}} + + {{- if hasKey . "configMap" -}} + {{- $configMap := include "bjw-s.common.lib.configMap.getByIdentifier" (dict "rootContext" $rootContext "id" .configMap) | fromYaml -}} + {{- $configMapName := default (tpl .configMap $rootContext) $configMap.name -}} + {{- $_ := set $item "configMapRef" (dict "name" $configMapName) -}} + {{- else if hasKey . "configMapRef" -}} + {{- if not (empty (dig "identifier" nil .configMapRef)) -}} + {{- $configMap := include "bjw-s.common.lib.configMap.getByIdentifier" (dict "rootContext" $rootContext "id" .configMapRef.identifier) | fromYaml -}} + {{- if empty $configMap -}} + {{- fail (printf "No configMap configured with identifier '%s'" .configMapRef.identifier) -}} + {{- end -}} + + {{- $_ := set $item "configMapRef" (dict "name" $configMap.name) -}} + {{- else -}} + {{- $_ := set $item "configMapRef" (dict "name" (tpl .configMapRef.name $rootContext)) -}} + {{- end -}} + + {{- else if hasKey . "secret" -}} + {{- $secret := include "bjw-s.common.lib.secret.getByIdentifier" (dict "rootContext" $rootContext "id" .secret) | fromYaml -}} + {{- $secretName := default (tpl .secret $rootContext) $secret.name -}} + {{- $_ := set $item "secretRef" (dict "name" $secretName) -}} + {{- else if hasKey . "secretRef" -}} + {{- if not (empty (dig "identifier" nil .secretRef)) -}} + {{- $secret := include "bjw-s.common.lib.secret.getByIdentifier" (dict "rootContext" $rootContext "id" .secretRef.identifier) | fromYaml -}} + {{- if empty $secret -}} + {{- fail (printf "No secret configured with identifier '%s'" .secretRef.identifier) -}} + {{- end -}} + + {{- $_ := set $item "secretRef" (dict "name" $secret.name) -}} + {{- else -}} + {{- $_ := set $item "secretRef" (dict "name" (tpl .secretRef.name $rootContext)) -}} + {{- end -}} + {{- end -}} + + {{- if not (empty (dig "prefix" nil .)) -}} + {{- $_ := set $item "prefix" .prefix -}} + {{- end -}} + + {{- if not (empty $item) -}} + {{- $envFrom = append $envFrom $item -}} + {{- end -}} + {{- end -}} + + {{- $envFrom | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_image.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_image.tpl new file mode 100644 index 000000000..327ea627d --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_image.tpl @@ -0,0 +1,15 @@ +{{/* +Image used by the container. +*/}} +{{- define "bjw-s.common.lib.container.field.image" -}} + {{- $ctx := .ctx -}} + {{- $rootContext := $ctx.rootContext -}} + {{- $containerObject := $ctx.containerObject -}} + + {{- $imageRepo := $containerObject.image.repository -}} + {{- $imageTag := $containerObject.image.tag -}} + + {{- if and $imageRepo $imageTag -}} + {{- printf "%s:%s" $imageRepo $imageTag -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_name.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_name.tpl new file mode 100644 index 000000000..7695f39b9 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_name.tpl @@ -0,0 +1,24 @@ +{{/* +Name used by the container. +*/}} +{{- define "bjw-s.common.lib.container.field.name" -}} + {{- $ctx := .ctx -}} + {{- $rootContext := $ctx.rootContext -}} + {{- $containerObject := $ctx.containerObject -}} + + {{- /* Default to container identifier */ -}} + {{- $name := $containerObject.identifier -}} + + {{- /* See if an override is desired */ -}} + {{- if hasKey $containerObject "nameOverride" -}} + {{- $option := get $containerObject "nameOverride" -}} + {{- if not (empty $option) -}} + {{- $name = $option -}} + {{- end -}} + {{- end -}} + + {{- /* Parse any templates */ -}} + {{- $name = tpl $name $rootContext -}} + + {{- $name | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_probes.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_probes.tpl new file mode 100644 index 000000000..5f6d60e10 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_probes.tpl @@ -0,0 +1,83 @@ +{{/* +Probes used by the container. +*/}} +{{- define "bjw-s.common.lib.container.field.probes" -}} + {{- $ctx := .ctx -}} + {{- $rootContext := $ctx.rootContext -}} + {{- $controllerObject := $ctx.controllerObject -}} + {{- $containerObject := $ctx.containerObject -}} + + {{- /* Default to empty dict */ -}} + {{- $enabledProbes := dict -}} + + {{- range $probeName, $probeValues := $containerObject.probes -}} + {{- /* Disable probe by default, but allow override */ -}} + {{- $probeEnabled := false -}} + {{- if hasKey $probeValues "enabled" -}} + {{- $probeEnabled = $probeValues.enabled -}} + {{- end -}} + + {{- if $probeEnabled -}} + {{- $probeDefinition := dict -}} + + {{- if $probeValues.custom -}} + {{- $parsedProbeSpec := tpl ($probeValues.spec | toYaml) $rootContext -}} + {{- $probeDefinition = $parsedProbeSpec | fromYaml -}} + {{- else -}} + {{- $primaryService := include "bjw-s.common.lib.service.primaryForController" (dict "rootContext" $rootContext "controllerIdentifier" $controllerObject.identifier) | fromYaml -}} + {{- $primaryServiceDefaultPort := dict -}} + {{- if $primaryService -}} + {{- $primaryServiceDefaultPort = include "bjw-s.common.lib.service.primaryPort" (dict "rootContext" $rootContext "serviceObject" $primaryService) | fromYaml -}} + {{- end -}} + {{- if $primaryServiceDefaultPort -}} + {{- $probeType := "" -}} + {{- if eq $probeValues.type "AUTO" -}} + {{- $probeType = $primaryServiceDefaultPort.protocol -}} + {{- else -}} + {{- $probeType = $probeValues.type | default "TCP" -}} + {{- end -}} + + {{- $_ := set $probeDefinition "initialDelaySeconds" $probeValues.spec.initialDelaySeconds -}} + {{- $_ := set $probeDefinition "failureThreshold" $probeValues.spec.failureThreshold -}} + {{- $_ := set $probeDefinition "timeoutSeconds" $probeValues.spec.timeoutSeconds -}} + {{- $_ := set $probeDefinition "periodSeconds" $probeValues.spec.periodSeconds -}} + + {{- $probeHeader := "" -}} + {{- if or ( eq $probeType "HTTPS" ) ( eq $probeType "HTTP" ) -}} + {{- $probeHeader = "httpGet" -}} + + {{- $_ := set $probeDefinition $probeHeader ( + dict + "path" $probeValues.path + "scheme" $probeType + ) + -}} + {{- else }} + {{- $probeHeader = "tcpSocket" -}} + {{- $_ := set $probeDefinition $probeHeader dict -}} + {{- end -}} + + {{- if $probeValues.port -}} + {{- if kindIs "float64" $probeValues.port -}} + {{- $_ := set (index $probeDefinition $probeHeader) "port" $probeValues.port -}} + {{- else if kindIs "string" $probeValues.port -}} + {{- $_ := set (index $probeDefinition $probeHeader) "port" (tpl ( $probeValues.port | toString ) $rootContext) -}} + {{- end -}} + {{- else if $primaryServiceDefaultPort.targetPort -}} + {{- $_ := set (index $probeDefinition $probeHeader) "port" $primaryServiceDefaultPort.targetPort -}} + {{- else -}} + {{- $_ := set (index $probeDefinition $probeHeader) "port" ($primaryServiceDefaultPort.port | toString | atoi ) -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- if $probeDefinition -}} + {{- $_ := set $enabledProbes (printf "%sProbe" $probeName) $probeDefinition -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- with $enabledProbes -}} + {{- . | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_volumeMounts.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_volumeMounts.tpl new file mode 100644 index 000000000..5139866b2 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_volumeMounts.tpl @@ -0,0 +1,115 @@ +{{/* +volumeMounts used by the container. +*/}} +{{- define "bjw-s.common.lib.container.field.volumeMounts" -}} + {{- $ctx := .ctx -}} + {{- $rootContext := $ctx.rootContext -}} + {{- $controllerObject := $ctx.controllerObject -}} + {{- $containerObject := $ctx.containerObject -}} + + {{- /* Default to empty dict */ -}} + {{- $persistenceItemsToProcess := dict -}} + {{- $enabledVolumeMounts := list -}} + + {{- /* Collect regular persistence items */ -}} + {{- range $identifier, $persistenceValues := $rootContext.Values.persistence -}} + {{- /* Enable persistence item by default, but allow override */ -}} + {{- $persistenceEnabled := true -}} + {{- if hasKey $persistenceValues "enabled" -}} + {{- $persistenceEnabled = $persistenceValues.enabled -}} + {{- end -}} + + {{- if $persistenceEnabled -}} + {{- $_ := set $persistenceItemsToProcess $identifier $persistenceValues -}} + {{- end -}} + {{- end -}} + + {{- /* Collect volumeClaimTemplates */ -}} + {{- if not (empty (dig "statefulset" "volumeClaimTemplates" nil $controllerObject)) -}} + {{- range $persistenceValues := $controllerObject.statefulset.volumeClaimTemplates -}} + {{- /* Enable persistence item by default, but allow override */ -}} + {{- $persistenceEnabled := true -}} + {{- if hasKey $persistenceValues "enabled" -}} + {{- $persistenceEnabled = $persistenceValues.enabled -}} + {{- end -}} + + {{- if $persistenceEnabled -}} + {{- $mountValues := dict -}} + {{- if not (empty (dig "globalMounts" nil $persistenceValues)) -}} + {{- $_ := set $mountValues "globalMounts" $persistenceValues.globalMounts -}} + {{- end -}} + {{- if not (empty (dig "advancedMounts" nil $persistenceValues)) -}} + {{- $_ := set $mountValues "advancedMounts" (dict $controllerObject.identifier $persistenceValues.advancedMounts) -}} + {{- end -}} + {{- $_ := set $persistenceItemsToProcess $persistenceValues.name $mountValues -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- range $identifier, $persistenceValues := $persistenceItemsToProcess -}} + {{- /* Set some default values */ -}} + + {{- /* Set the default mountPath to / */ -}} + {{- $mountPath := (printf "/%v" $identifier) -}} + {{- if eq "hostPath" (default "pvc" $persistenceValues.type) -}} + {{- $mountPath = $persistenceValues.hostPath -}} + {{- end -}} + + {{- /* Process configured mounts */ -}} + {{- if or .globalMounts .advancedMounts -}} + {{- $mounts := list -}} + {{- if hasKey . "globalMounts" -}} + {{- $mounts = .globalMounts -}} + {{- end -}} + + {{- if hasKey . "advancedMounts" -}} + {{- $advancedMounts := dig $controllerObject.identifier $containerObject.identifier list .advancedMounts -}} + {{- range $advancedMounts -}} + {{- $mounts = append $mounts . -}} + {{- end -}} + {{- end -}} + + {{- range $mounts -}} + {{- $volumeMount := dict -}} + {{- $_ := set $volumeMount "name" $identifier -}} + + {{- /* Use the specified mountPath if provided */ -}} + {{- with .path -}} + {{- $mountPath = . -}} + {{- end -}} + {{- $_ := set $volumeMount "mountPath" $mountPath -}} + + {{- /* Use the specified subPath if provided */ -}} + {{- with .subPath -}} + {{- $subPath := . -}} + {{- $_ := set $volumeMount "subPath" $subPath -}} + {{- end -}} + + {{- /* Use the specified readOnly setting if provided */ -}} + {{- with .readOnly -}} + {{- $readOnly := . -}} + {{- $_ := set $volumeMount "readOnly" $readOnly -}} + {{- end -}} + + {{- /* Use the specified mountPropagation setting if provided */ -}} + {{- with .mountPropagation -}} + {{- $mountPropagation := . -}} + {{- $_ := set $volumeMount "mountPropagation" $mountPropagation -}} + {{- end -}} + + {{- $enabledVolumeMounts = append $enabledVolumeMounts $volumeMount -}} + {{- end -}} + + {{- /* Mount to default path if no mounts are configured */ -}} + {{- else -}} + {{- $volumeMount := dict -}} + {{- $_ := set $volumeMount "name" $identifier -}} + {{- $_ := set $volumeMount "mountPath" $mountPath -}} + {{- $enabledVolumeMounts = append $enabledVolumeMounts $volumeMount -}} + {{- end -}} + {{- end -}} + + {{- with $enabledVolumeMounts -}} + {{- . | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_enabled_containers.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_enabled_containers.tpl new file mode 100644 index 000000000..a49104968 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_enabled_containers.tpl @@ -0,0 +1,24 @@ +{{/* +Return the enabled containers for a controller. +*/}} +{{- define "bjw-s.common.lib.controller.enabledContainers" -}} + {{- $rootContext := .rootContext -}} + {{- $controllerObject := .controllerObject -}} + + {{- $enabledContainers := dict -}} + {{- range $name, $container := $controllerObject.containers -}} + {{- if kindIs "map" $container -}} + {{- /* Enable container by default, but allow override */ -}} + {{- $containerEnabled := true -}} + {{- if hasKey $container "enabled" -}} + {{- $containerEnabled = $container.enabled -}} + {{- end -}} + + {{- if $containerEnabled -}} + {{- $_ := set $enabledContainers $name $container -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- $enabledContainers | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_metadata.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_metadata.tpl new file mode 100644 index 000000000..0d759d6d4 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_metadata.tpl @@ -0,0 +1,25 @@ +{{- define "bjw-s.common.lib.controller.metadata.labels" -}} + {{- + $labels := ( + merge + (.Values.controller.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $ | fromYaml) + ) + -}} + {{- with $labels -}} + {{- toYaml . -}} + {{- end -}} +{{- end -}} + +{{- define "bjw-s.common.lib.controller.metadata.annotations" -}} + {{- + $annotations := ( + merge + (.Values.controller.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $ | fromYaml) + ) + -}} + {{- with $annotations -}} + {{- toYaml . -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_validate.tpl new file mode 100644 index 000000000..5d61d1a00 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_validate.tpl @@ -0,0 +1,18 @@ +{{/* +Validate controller values +*/}} +{{- define "bjw-s.common.lib.controller.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $controllerValues := .object -}} + + {{- $allowedControllerTypes := list "deployment" "daemonset" "statefulset" "cronjob" "job" -}} + {{- if not (has $controllerValues.type $allowedControllerTypes) -}} + {{- fail (printf "Not a valid controller.type (%s)" $controllerValues.type) -}} + {{- end -}} + + {{- $enabledContainers := include "bjw-s.common.lib.controller.enabledContainers" (dict "rootContext" $rootContext "controllerObject" $controllerValues) | fromYaml }} + {{- /* Validate at least one container is enabled */ -}} + {{- if not $enabledContainers -}} + {{- fail (printf "No containers enabled for controller (%s)" $controllerValues.identifier) -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_valuesToObject.tpl new file mode 100644 index 000000000..6badac92c --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_valuesToObject.tpl @@ -0,0 +1,41 @@ +{{/* +Convert controller values to an object +*/}} +{{- define "bjw-s.common.lib.controller.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Default the controller type to Deployment */ -}} + {{- if empty (dig "type" nil $objectValues) -}} + {{- $_ := set $objectValues "type" "deployment" -}} + {{- end -}} + + {{- /* Determine and inject the controller name */ -}} + {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + + {{- if $objectValues.nameOverride -}} + {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} + {{- else -}} + {{- if ne $identifier "main" -}} + {{- $objectName = printf "%s-%s" $objectName $identifier -}} + {{- end -}} + {{- end -}} + {{- $_ := set $objectValues "name" $objectName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Set the default Pod options for the controller */ -}} + {{- range $index, $key := keys $rootContext.Values.defaultPodOptions -}} + {{- if not (hasKey $objectValues "pod") -}} + {{- $_ := set $objectValues "pod" dict -}} + {{- end -}} + + {{- $defaultValue := get $rootContext.Values.defaultPodOptions $key -}} + {{- if not (hasKey $objectValues.pod $key) -}} + {{- $_ := set $objectValues.pod $key $defaultValue -}} + {{- end -}} + {{- end -}} + + {{- /* Return the controller object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/cronjob/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/cronjob/_validate.tpl new file mode 100644 index 000000000..37cb7b20e --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/cronjob/_validate.tpl @@ -0,0 +1,11 @@ +{{/* +Validate CronJob values +*/}} +{{- define "bjw-s.common.lib.cronjob.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $cronjobValues := .object -}} + + {{- if and (ne $cronjobValues.pod.restartPolicy "Never") (ne $cronjobValues.pod.restartPolicy "OnFailure") -}} + {{- fail (printf "Not a valid restartPolicy type for CronJob. (controller: %s, restartPolicy: %s)" $cronjobValues.identifier $cronjobValues.pod.restartPolicy) }} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/cronjob/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/cronjob/_valuesToObject.tpl new file mode 100644 index 000000000..5657be59e --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/cronjob/_valuesToObject.tpl @@ -0,0 +1,18 @@ +{{/* +Convert Cronjob values to an object +*/}} +{{- define "bjw-s.common.lib.cronjob.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- if not (hasKey $objectValues "pod") -}} + {{- $_ := set $objectValues "pod" dict -}} + {{- end -}} + + {{- $restartPolicy := default "Never" $objectValues.pod.restartPolicy -}} + {{- $_ := set $objectValues.pod "restartPolicy" $restartPolicy -}} + + {{- /* Return the CronJob object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/daemonset/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/daemonset/_validate.tpl new file mode 100644 index 000000000..25a7408c8 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/daemonset/_validate.tpl @@ -0,0 +1,7 @@ +{{/* +Validate DaemonSet values +*/}} +{{- define "bjw-s.common.lib.daemonset.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $daemonsetValues := .object -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/daemonset/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/daemonset/_valuesToObject.tpl new file mode 100644 index 000000000..4593255b5 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/daemonset/_valuesToObject.tpl @@ -0,0 +1,11 @@ +{{/* +Convert DaemonSet values to an object +*/}} +{{- define "bjw-s.common.lib.daemonset.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Return the DaemonSet object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/deployment/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/deployment/_validate.tpl new file mode 100644 index 000000000..c32100794 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/deployment/_validate.tpl @@ -0,0 +1,11 @@ +{{/* +Validate Deployment values +*/}} +{{- define "bjw-s.common.lib.deployment.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $deploymentValues := .object -}} + + {{- if and (ne $deploymentValues.strategy "Recreate") (ne $deploymentValues.strategy "RollingUpdate") -}} + {{- fail (printf "Not a valid strategy type for Deployment. (controller: %s, strategy: %s)" $deploymentValues.identifier $deploymentValues.strategy) }} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/deployment/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/deployment/_valuesToObject.tpl new file mode 100644 index 000000000..7e7ad9ae8 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/deployment/_valuesToObject.tpl @@ -0,0 +1,14 @@ +{{/* +Convert Deployment values to an object +*/}} +{{- define "bjw-s.common.lib.deployment.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- $strategy := default "Recreate" $objectValues.strategy -}} + {{- $_ := set $objectValues "strategy" $strategy -}} + + {{- /* Return the Deployment object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_primary.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_primary.tpl new file mode 100644 index 000000000..5198d09a4 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_primary.tpl @@ -0,0 +1,21 @@ +{{/* Return the name of the primary Ingress object */}} +{{- define "bjw-s.common.lib.ingress.primary" -}} + {{- $enabledIngresses := dict -}} + {{- range $name, $ingress := .Values.ingress -}} + {{- if $ingress.enabled -}} + {{- $_ := set $enabledIngresses $name . -}} + {{- end -}} + {{- end -}} + + {{- $result := "" -}} + {{- range $name, $ingress := $enabledIngresses -}} + {{- if and (hasKey $ingress "primary") $ingress.primary -}} + {{- $result = $name -}} + {{- end -}} + {{- end -}} + + {{- if not $result -}} + {{- $result = keys $enabledIngresses | first -}} + {{- end -}} + {{- $result -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_validate.tpl new file mode 100644 index 000000000..0078e86e6 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_validate.tpl @@ -0,0 +1,15 @@ +{{/* +Validate Ingress values +*/}} +{{- define "bjw-s.common.lib.ingress.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $ingressValues := .object -}} + + {{- range $ingressValues.hosts -}} + {{- range .paths -}} + {{- if empty (dig "service" "name" nil .) -}} + {{- fail (printf "No service name configured. (ingress: %s, path: %s)" $ingressValues.identifier .path) -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_valuesToObject.tpl new file mode 100644 index 000000000..c9195cad4 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_valuesToObject.tpl @@ -0,0 +1,24 @@ +{{/* +Convert ingress values to an object +*/}} +{{- define "bjw-s.common.lib.ingress.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Determine and inject the ingress name */ -}} + {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + + {{- if $objectValues.nameOverride -}} + {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} + {{- else -}} + {{- if ne $identifier "main" -}} + {{- $objectName = printf "%s-%s" $objectName $identifier -}} + {{- end -}} + {{- end -}} + {{- $_ := set $objectValues "name" $objectName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Return the ingress object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/job/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/job/_validate.tpl new file mode 100644 index 000000000..75f71917e --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/job/_validate.tpl @@ -0,0 +1,12 @@ +{{/* +Validate job values +*/}} +{{- define "bjw-s.common.lib.job.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $jobValues := .object -}} + + {{- $allowedRestartPolicy := list "Never" "OnFailure" -}} + {{- if not (has $jobValues.pod.restartPolicy $allowedRestartPolicy) -}} + {{- fail (printf "Not a valid restart policy for Job (controller: %s, strategy: %s)" $jobValues.identifier $jobValues.pod.restartPolicy) -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/job/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/job/_valuesToObject.tpl new file mode 100644 index 000000000..5886d6033 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/job/_valuesToObject.tpl @@ -0,0 +1,14 @@ +{{/* +Convert job values to an object +*/}} +{{- define "bjw-s.common.lib.job.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- $restartPolicy := default "Never" $objectValues.pod.restartPolicy -}} + {{- $_ := set $objectValues.pod "restartPolicy" $restartPolicy -}} + + {{- /* Return the Job object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_allLabels.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_allLabels.tpl new file mode 100644 index 000000000..330857b04 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_allLabels.tpl @@ -0,0 +1,10 @@ +{{/* Common labels shared across objects */}} +{{- define "bjw-s.common.lib.metadata.allLabels" -}} +helm.sh/chart: {{ include "bjw-s.common.lib.chart.names.chart" . }} +{{ include "bjw-s.common.lib.metadata.selectorLabels" . }} + {{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} + {{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{ include "bjw-s.common.lib.metadata.globalLabels" . }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_globalAnnotations.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_globalAnnotations.tpl new file mode 100644 index 000000000..c7850c599 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_globalAnnotations.tpl @@ -0,0 +1,10 @@ +{{/* Common annotations shared across objects */}} +{{- define "bjw-s.common.lib.metadata.globalAnnotations" -}} + {{- with .Values.global.annotations }} + {{- range $k, $v := . }} + {{- $name := $k }} + {{- $value := tpl $v $ }} +{{ $name }}: {{ quote $value }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_globalLabels.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_globalLabels.tpl new file mode 100644 index 000000000..6b4c37709 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_globalLabels.tpl @@ -0,0 +1,9 @@ +{{- define "bjw-s.common.lib.metadata.globalLabels" -}} + {{- with .Values.global.labels }} + {{- range $k, $v := . }} + {{- $name := $k }} + {{- $value := tpl $v $ }} +{{ $name }}: {{ quote $value }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_selectorLabels.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_selectorLabels.tpl new file mode 100644 index 000000000..5174d999d --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_selectorLabels.tpl @@ -0,0 +1,5 @@ +{{/* Selector labels shared across objects */}} +{{- define "bjw-s.common.lib.metadata.selectorLabels" -}} +app.kubernetes.io/name: {{ include "bjw-s.common.lib.chart.names.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/networkpolicy/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/networkpolicy/_validate.tpl new file mode 100644 index 000000000..c490d1b70 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/networkpolicy/_validate.tpl @@ -0,0 +1,22 @@ +{{/* +Validate networkPolicy values +*/}} +{{- define "bjw-s.common.lib.networkpolicy.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $networkpolicyObject := .object -}} + + {{- if and (not (hasKey $networkpolicyObject "podSelector")) (empty (get $networkpolicyObject "controller")) -}} + {{- fail (printf "controller reference or podSelector is required for NetworkPolicy. (NetworkPolicy %s)" $networkpolicyObject.identifier) -}} + {{- end -}} + + {{- if empty (get $networkpolicyObject "policyTypes") -}} + {{- fail (printf "policyTypes is required for NetworkPolicy. (NetworkPolicy %s)" $networkpolicyObject.identifier) -}} + {{- end -}} + + {{- $allowedpolicyTypes := list "Ingress" "Egress" -}} + {{- range $networkpolicyObject.policyTypes -}} + {{- if not (has . $allowedpolicyTypes) -}} + {{- fail (printf "Not a valid policyType for NetworkPolicy. (NetworkPolicy %s, value %s)" $networkpolicyObject.identifier .) -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/networkpolicy/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/networkpolicy/_valuesToObject.tpl new file mode 100644 index 000000000..805f33a5a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/networkpolicy/_valuesToObject.tpl @@ -0,0 +1,24 @@ +{{/* +Convert networkPolicy values to an object +*/}} +{{- define "bjw-s.common.lib.networkpolicy.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Determine and inject the networkPolicy name */ -}} + {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + + {{- if $objectValues.nameOverride -}} + {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} + {{- else -}} + {{- if ne $identifier "main" -}} + {{- $objectName = printf "%s-%s" $objectName $identifier -}} + {{- end -}} + {{- end -}} + {{- $_ := set $objectValues "name" $objectName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Return the networkPolicy object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/_getOption.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/_getOption.tpl new file mode 100644 index 000000000..c436ee328 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/_getOption.tpl @@ -0,0 +1,34 @@ +{{- /* +Returns the value for the specified field +*/ -}} +{{- define "bjw-s.common.lib.pod.getOption" -}} + {{- $rootContext := .ctx.rootContext -}} + {{- $controllerObject := .ctx.controllerObject -}} + {{- $option := .option -}} + + {{- $value := "" -}} + + {{- /* Set to the default if it is set */ -}} + {{- $defaultOption := get $rootContext.Values.defaultPodOptions $option -}} + {{- if kindIs "bool" $defaultOption -}} + {{- $value = $defaultOption -}} + {{- else if not (empty $defaultOption) -}} + {{- $value = $defaultOption -}} + {{- end -}} + + {{- /* See if a pod-specific override is needed */ -}} + {{- if hasKey $controllerObject "pod" -}} + {{- $podOption := get $controllerObject.pod $option -}} + {{- if kindIs "bool" $podOption -}} + {{- $value = $podOption -}} + {{- else if not (empty $podOption) -}} + {{- $value = $podOption -}} + {{- end -}} + {{- end -}} + + {{- if kindIs "bool" $value -}} + {{- $value | toYaml -}} + {{- else if not (empty $value) -}} + {{- $value | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/_spec.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/_spec.tpl new file mode 100644 index 000000000..103acc3c7 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/_spec.tpl @@ -0,0 +1,67 @@ +{{- /* +The pod definition included in the controller. +*/ -}} +{{- define "bjw-s.common.lib.pod.spec" -}} + {{- $rootContext := .rootContext -}} + {{- $controllerObject := .controllerObject -}} + {{- $ctx := dict "rootContext" $rootContext "controllerObject" $controllerObject -}} + +enableServiceLinks: {{ $controllerObject.pod.enableServiceLinks }} +serviceAccountName: {{ include "bjw-s.common.lib.pod.field.serviceAccountName" (dict "ctx" $ctx) | trim }} +automountServiceAccountToken: {{ $controllerObject.pod.automountServiceAccountToken }} + {{- with ($controllerObject.pod.priorityClassName) }} +priorityClassName: {{ . | trim }} + {{- end -}} + {{- with ($controllerObject.pod.runtimeClassName) }} +runtimeClassName: {{ . | trim }} + {{- end -}} + {{- with ($controllerObject.pod.schedulerName) }} +schedulerName: {{ . | trim }} + {{- end -}} + {{- with ($controllerObject.pod.securityContext) }} +securityContext: {{ . | toYaml | nindent 2 }} + {{- end -}} + {{- with ($controllerObject.pod.hostname) }} +hostname: {{ . | trim }} + {{- end }} +hostIPC: {{ $controllerObject.pod.hostIPC }} +hostNetwork: {{ $controllerObject.pod.hostNetwork }} +hostPID: {{ $controllerObject.pod.hostPID }} +dnsPolicy: {{ include "bjw-s.common.lib.pod.field.dnsPolicy" (dict "ctx" $ctx) | trim }} + {{- with $controllerObject.pod.dnsConfig }} +dnsConfig: {{ . | toYaml | nindent 2 }} + {{- end -}} + {{- with $controllerObject.pod.hostAliases }} +hostAliases: {{ . | toYaml | nindent 2 }} + {{- end -}} + {{- with $controllerObject.pod.imagePullSecrets }} +imagePullSecrets: {{ . | toYaml | nindent 2 }} + {{- end -}} + {{- with $controllerObject.pod.terminationGracePeriodSeconds }} +terminationGracePeriodSeconds: {{ . | trim }} + {{- end -}} + {{- with $controllerObject.pod.restartPolicy }} +restartPolicy: {{ . | trim }} + {{- end -}} + {{- with $controllerObject.pod.nodeSelector }} +nodeSelector: {{ . | toYaml | nindent 2 }} + {{- end -}} + {{- with $controllerObject.pod.affinity }} +affinity: {{ . | toYaml | nindent 2 }} + {{- end -}} + {{- with $controllerObject.pod.topologySpreadConstraints }} +topologySpreadConstraints: {{ . | toYaml | nindent 2 }} + {{- end -}} + {{- with $controllerObject.pod.tolerations }} +tolerations: {{ . | toYaml | nindent 2 }} + {{- end }} + {{- with (include "bjw-s.common.lib.pod.field.initContainers" (dict "ctx" $ctx) | trim) }} +initContainers: {{ . | nindent 2 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.pod.field.containers" (dict "ctx" $ctx) | trim) }} +containers: {{ . | nindent 2 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.pod.field.volumes" (dict "ctx" $ctx) | trim) }} +volumes: {{ . | nindent 2 }} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_containers.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_containers.tpl new file mode 100644 index 000000000..a20f7d413 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_containers.tpl @@ -0,0 +1,71 @@ +{{- /* +Returns the value for containers +*/ -}} +{{- define "bjw-s.common.lib.pod.field.containers" -}} + {{- $rootContext := .ctx.rootContext -}} + {{- $controllerObject := .ctx.controllerObject -}} + + {{- /* Default to empty list */ -}} + {{- $graph := dict -}} + {{- $containers := list -}} + + {{- /* Fetch configured containers for this controller */ -}} + {{- $enabledContainers := include "bjw-s.common.lib.controller.enabledContainers" (dict "rootContext" $rootContext "controllerObject" $controllerObject) | fromYaml }} + {{- $renderedContainers := dict -}} + + {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} + {{- $containersWithDependsOn := include "bjw-s.common.lib.getMapItemsWithKey" (dict "map" $enabledContainers "key" "dependsOn") | fromYaml | keys -}} + {{- $useDependsOn := gt (len $containersWithDependsOn) 0 -}} + + {{- range $key, $containerValues := $enabledContainers -}} + {{- /* Create object from the container values */ -}} + {{- $containerObject := (include "bjw-s.common.lib.container.valuesToObject" (dict "rootContext" $rootContext "id" $key "values" $containerValues)) | fromYaml -}} + + {{- /* Perform validations on the Container before rendering */ -}} + {{- include "bjw-s.common.lib.container.validate" (dict "rootContext" $ "controllerObject" $controllerObject "containerObject" $containerObject) -}} + + {{- /* Generate the Container spec */ -}} + {{- $renderedContainer := include "bjw-s.common.lib.container.spec" (dict "rootContext" $rootContext "controllerObject" $controllerObject "containerObject" $containerObject) | fromYaml -}} + {{- $_ := set $renderedContainers $key $renderedContainer -}} + + {{- /* Determine the Container order */ -}} + {{- if $useDependsOn -}} + {{- if empty (dig "dependsOn" nil $containerValues) -}} + {{- $_ := set $graph $key ( list ) -}} + {{- else if kindIs "string" $containerValues.dependsOn -}} + {{- $_ := set $graph $key ( list $containerValues.dependsOn ) -}} + {{- else if kindIs "slice" $containerValues.dependsOn -}} + {{- $_ := set $graph $key $containerValues.dependsOn -}} + {{- end -}} + {{- else -}} + {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} + {{- $containerOrder := (dig "order" 99 $containerValues) -}} + {{- $_ := set $graph $key $containerOrder -}} + {{- end -}} + {{- end -}} + + {{- /* Process graph */ -}} + {{- if $useDependsOn -}} + {{- $args := dict "graph" $graph "out" list -}} + {{- include "bjw-s.common.lib.kahn" $args -}} + + {{- range $name := $args.out -}} + {{- $containerItem := get $renderedContainers $name -}} + {{- $containers = append $containers $containerItem -}} + {{- end -}} + {{- else -}} + {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} + {{- $orderedContainers := dict -}} + {{- range $key, $order := $graph -}} + {{- $containerItem := get $renderedContainers $key -}} + {{- $_ := set $orderedContainers (printf "%v-%s" $order $key) $containerItem -}} + {{- end -}} + {{- range $key, $containerValues := $orderedContainers -}} + {{- $containers = append $containers $containerValues -}} + {{- end -}} + {{- end -}} + + {{- if not (empty $containers) -}} + {{- $containers | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_dnsPolicy.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_dnsPolicy.tpl new file mode 100644 index 000000000..e82636d04 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_dnsPolicy.tpl @@ -0,0 +1,25 @@ +{{- /* +Returns the value for dnsPolicy +*/ -}} +{{- define "bjw-s.common.lib.pod.field.dnsPolicy" -}} + {{- $ctx := .ctx -}} + {{- $controllerObject := $ctx.controllerObject -}} + + {{- /* Default to "ClusterFirst" */ -}} + {{- $dnsPolicy := "ClusterFirst" -}} + + {{- /* Get hostNetwork value "" */ -}} + {{- $hostNetwork:= get $controllerObject.pod "hostNetwork" -}} + {{- if $hostNetwork -}} + {{- $dnsPolicy = "ClusterFirstWithHostNet" -}} + {{- end -}} + + {{- /* See if an override is desired */ -}} + {{- $override := get $controllerObject.pod "dnsPolicy" -}} + + {{- if not (empty $override) -}} + {{- $dnsPolicy = $override -}} + {{- end -}} + + {{- $dnsPolicy -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_initContainers.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_initContainers.tpl new file mode 100644 index 000000000..2d7800923 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_initContainers.tpl @@ -0,0 +1,78 @@ +{{- /* +Returns the value for initContainers +*/ -}} +{{- define "bjw-s.common.lib.pod.field.initContainers" -}} + {{- $rootContext := .ctx.rootContext -}} + {{- $controllerObject := .ctx.controllerObject -}} + + {{- /* Default to empty list */ -}} + {{- $graph := dict -}} + {{- $containers := list -}} + + {{- /* Fetch configured containers for this controller */ -}} + {{- $renderedContainers := dict -}} + + {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} + {{- $containersWithDependsOn := include "bjw-s.common.lib.getMapItemsWithKey" (dict "map" $controllerObject.initContainers "key" "dependsOn") | fromYaml | keys -}} + {{- $useDependsOn := gt (len $containersWithDependsOn) 0 -}} + + {{- range $key, $containerValues := $controllerObject.initContainers -}} + {{- /* Enable container by default, but allow override */ -}} + {{- $containerEnabled := true -}} + {{- if hasKey $containerValues "enabled" -}} + {{- $containerEnabled = $containerValues.enabled -}} + {{- end -}} + + {{- if $containerEnabled -}} + {{- /* Create object from the container values */ -}} + {{- $containerObject := (include "bjw-s.common.lib.container.valuesToObject" (dict "rootContext" $rootContext "id" $key "values" $containerValues)) | fromYaml -}} + + {{- /* Perform validations on the Container before rendering */ -}} + {{- include "bjw-s.common.lib.container.validate" (dict "rootContext" $ "controllerObject" $controllerObject "containerObject" $containerObject) -}} + + {{- /* Generate the Container spec */ -}} + {{- $renderedContainer := include "bjw-s.common.lib.container.spec" (dict "rootContext" $rootContext "controllerObject" $controllerObject "containerObject" $containerObject) | fromYaml -}} + {{- $_ := set $renderedContainers $key $renderedContainer -}} + + {{- /* Determine the Container order */ -}} + {{- if $useDependsOn -}} + {{- if empty (dig "dependsOn" nil $containerValues) -}} + {{- $_ := set $graph $key ( list ) -}} + {{- else if kindIs "string" $containerValues.dependsOn -}} + {{- $_ := set $graph $key ( list $containerValues.dependsOn ) -}} + {{- else if kindIs "slice" $containerValues.dependsOn -}} + {{- $_ := set $graph $key $containerValues.dependsOn -}} + {{- end -}} + {{- else -}} + {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} + {{- $containerOrder := (dig "order" 99 $containerValues) -}} + {{- $_ := set $graph $key $containerOrder -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- /* Process graph */ -}} + {{- if $useDependsOn -}} + {{- $args := dict "graph" $graph "out" list -}} + {{- include "bjw-s.common.lib.kahn" $args -}} + + {{- range $name := $args.out -}} + {{- $containerItem := get $renderedContainers $name -}} + {{- $containers = append $containers $containerItem -}} + {{- end -}} + {{- else -}} + {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} + {{- $orderedContainers := dict -}} + {{- range $key, $order := $graph -}} + {{- $containerItem := get $renderedContainers $key -}} + {{- $_ := set $orderedContainers (printf "%v-%s" $order $key) $containerItem -}} + {{- end -}} + {{- range $key, $containerValues := $orderedContainers -}} + {{- $containers = append $containers $containerValues -}} + {{- end -}} + {{- end -}} + + {{- if not (empty $containers) -}} + {{- $containers | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_serviceAccountName.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_serviceAccountName.tpl new file mode 100644 index 000000000..947a1a460 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_serviceAccountName.tpl @@ -0,0 +1,11 @@ +{{- /* +Returns the value for serviceAccountName +*/ -}} +{{- define "bjw-s.common.lib.pod.field.serviceAccountName" -}} + {{- $rootContext := .ctx.rootContext -}} + + {{- $serviceAccountValues := (mustDeepCopy $rootContext.Values.serviceAccount) -}} + {{- $serviceAccountObject := (include "bjw-s.common.lib.serviceAccount.valuesToObject" (dict "rootContext" $rootContext "id" "default" "values" $serviceAccountValues)) | fromYaml -}} + {{- $serviceAccountObject.name -}} + +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_volumes.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_volumes.tpl new file mode 100644 index 000000000..2e8836906 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_volumes.tpl @@ -0,0 +1,125 @@ +{{- /* +Returns the value for volumes +*/ -}} +{{- define "bjw-s.common.lib.pod.field.volumes" -}} + {{- $rootContext := .ctx.rootContext -}} + {{- $controllerObject := .ctx.controllerObject -}} + + {{- /* Default to empty list */ -}} + {{- $persistenceItemsToProcess := dict -}} + {{- $volumes := list -}} + + {{- /* Loop over persistence values */ -}} + {{- range $identifier, $persistenceValues := $rootContext.Values.persistence -}} + {{- /* Enable persistence item by default, but allow override */ -}} + {{- $persistenceEnabled := true -}} + {{- if hasKey $persistenceValues "enabled" -}} + {{- $persistenceEnabled = $persistenceValues.enabled -}} + {{- end -}} + + {{- if $persistenceEnabled -}} + {{- $hasglobalMounts := not (empty $persistenceValues.globalMounts) -}} + {{- $globalMounts := dig "globalMounts" list $persistenceValues -}} + + {{- $hasAdvancedMounts := not (empty $persistenceValues.advancedMounts) -}} + {{- $advancedMounts := dig "advancedMounts" $controllerObject.identifier list $persistenceValues -}} + + {{ if or + ($hasglobalMounts) + (and ($hasAdvancedMounts) (not (empty $advancedMounts))) + (and (not $hasglobalMounts) (not $hasAdvancedMounts)) + -}} + {{- $_ := set $persistenceItemsToProcess $identifier $persistenceValues -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- /* Loop over persistence items */ -}} + {{- range $identifier, $persistenceValues := $persistenceItemsToProcess -}} + {{- $volume := dict "name" $identifier -}} + + {{- /* PVC persistence type */ -}} + {{- if eq (default "persistentVolumeClaim" $persistenceValues.type) "persistentVolumeClaim" -}} + {{- $pvcName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + {{- if $persistenceValues.existingClaim -}} + {{- /* Always prefer an existingClaim if that is set */ -}} + {{- $pvcName = $persistenceValues.existingClaim -}} + {{- else -}} + {{- /* Otherwise refer to the PVC name */ -}} + {{- if $persistenceValues.nameOverride -}} + {{- if not (eq $persistenceValues.nameOverride "-") -}} + {{- $pvcName = (printf "%s-%s" (include "bjw-s.common.lib.chart.names.fullname" $rootContext) $persistenceValues.nameOverride) -}} + {{- end -}} + {{- else -}} + {{- $pvcName = (printf "%s-%s" (include "bjw-s.common.lib.chart.names.fullname" $rootContext) $identifier) -}} + {{- end -}} + {{- end -}} + {{- $_ := set $volume "persistentVolumeClaim" (dict "claimName" $pvcName) -}} + + {{- /* configMap persistence type */ -}} + {{- else if eq $persistenceValues.type "configMap" -}} + {{- $objectName := (required (printf "name not set for persistence item %s" $identifier) $persistenceValues.name) -}} + {{- $objectName = tpl $objectName $rootContext -}} + {{- $_ := set $volume "configMap" dict -}} + {{- $_ := set $volume.configMap "name" $objectName -}} + {{- with $persistenceValues.defaultMode -}} + {{- $_ := set $volume.configMap "defaultMode" . -}} + {{- end -}} + {{- with $persistenceValues.items -}} + {{- $_ := set $volume.configMap "items" . -}} + {{- end -}} + + {{- /* Secret persistence type */ -}} + {{- else if eq $persistenceValues.type "secret" -}} + {{- $objectName := (required (printf "name not set for persistence item %s" $identifier) $persistenceValues.name) -}} + {{- $objectName = tpl $objectName $rootContext -}} + {{- $_ := set $volume "secret" dict -}} + {{- $_ := set $volume.secret "secretName" $objectName -}} + {{- with $persistenceValues.defaultMode -}} + {{- $_ := set $volume.secret "defaultMode" . -}} + {{- end -}} + {{- with $persistenceValues.items -}} + {{- $_ := set $volume.secret "items" . -}} + {{- end -}} + + {{- /* emptyDir persistence type */ -}} + {{- else if eq $persistenceValues.type "emptyDir" -}} + {{- $_ := set $volume "emptyDir" dict -}} + {{- with $persistenceValues.medium -}} + {{- $_ := set $volume.emptyDir "medium" . -}} + {{- end -}} + {{- with $persistenceValues.sizeLimit -}} + {{- $_ := set $volume.emptyDir "sizeLimit" . -}} + {{- end -}} + + {{- /* hostPath persistence type */ -}} + {{- else if eq $persistenceValues.type "hostPath" -}} + {{- $_ := set $volume "hostPath" dict -}} + {{- $_ := set $volume.hostPath "path" (required "hostPath not set" $persistenceValues.hostPath) -}} + {{- with $persistenceValues.hostPathType }} + {{- $_ := set $volume.hostPath "type" . -}} + {{- end -}} + + {{- /* nfs persistence type */ -}} + {{- else if eq $persistenceValues.type "nfs" -}} + {{- $_ := set $volume "nfs" dict -}} + {{- $_ := set $volume.nfs "server" (required "server not set" $persistenceValues.server) -}} + {{- $_ := set $volume.nfs "path" (required "path not set" $persistenceValues.path) -}} + + {{- /* custom persistence type */ -}} + {{- else if eq $persistenceValues.type "custom" -}} + {{- $volume = $persistenceValues.volumeSpec -}} + {{- $_ := set $volume "name" $identifier -}} + + {{- /* Fail otherwise */ -}} + {{- else -}} + {{- fail (printf "Not a valid persistence.type (%s)" $persistenceValues.type) -}} + {{- end -}} + + {{- $volumes = append $volumes $volume -}} + {{- end -}} + + {{- if not (empty $volumes) -}} + {{- $volumes | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/metadata/_annotations.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/metadata/_annotations.tpl new file mode 100644 index 000000000..86e6d25ff --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/metadata/_annotations.tpl @@ -0,0 +1,56 @@ +{{- /* +Returns the value for annotations +*/ -}} +{{- define "bjw-s.common.lib.pod.metadata.annotations" -}} + {{- $rootContext := .rootContext -}} + {{- $controllerObject := .controllerObject -}} + + {{- /* Default annotations */ -}} + {{- $annotations := dict -}} + + {{- /* Set to the default if it is set */ -}} + {{- $defaultOption := get $rootContext.Values.defaultPodOptions "annotations" -}} + {{- if not (empty $defaultOption) -}} + {{- $annotations = merge $defaultOption $annotations -}} + {{- end -}} + + {{- /* See if a pod-specific override is set */ -}} + {{- if hasKey $controllerObject "pod" -}} + {{- $podOption := get $controllerObject.pod "annotations" -}} + {{- if not (empty $podOption) -}} + {{- $annotations = merge $podOption $annotations -}} + {{- end -}} + {{- end -}} + + {{- /* Add configMaps checksum */ -}} + {{- $configMapsFound := dict -}} + {{- range $name, $configmap := $rootContext.Values.configMaps -}} + {{- if $configmap.enabled -}} + {{- $_ := set $configMapsFound $name (toYaml $configmap.data | sha256sum) -}} + {{- end -}} + {{- end -}} + {{- if $configMapsFound -}} + {{- $annotations = merge + (dict "checksum/configMaps" (toYaml $configMapsFound | sha256sum)) + $annotations + -}} + {{- end -}} + + {{- /* Add Secrets checksum */ -}} + {{- $secretsFound := dict -}} + {{- range $name, $secret := $rootContext.Values.secrets -}} + {{- if $secret.enabled -}} + {{- $_ := set $secretsFound $name (toYaml $secret.stringData | sha256sum) -}} + {{- end -}} + {{- end -}} + {{- if $secretsFound -}} + {{- $annotations = merge + (dict "checksum/secrets" (toYaml $secretsFound | sha256sum)) + $annotations + -}} + {{- end -}} + + {{- if not (empty $annotations) -}} + {{- $annotations | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/metadata/_labels.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/metadata/_labels.tpl new file mode 100644 index 000000000..82a1731be --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/metadata/_labels.tpl @@ -0,0 +1,36 @@ +{{- /* +Returns the value for labels +*/ -}} +{{- define "bjw-s.common.lib.pod.metadata.labels" -}} + {{- $rootContext := .rootContext -}} + {{- $controllerObject := .controllerObject -}} + + {{- /* Default labels */ -}} + {{- $labels := merge + (dict "app.kubernetes.io/component" $controllerObject.identifier) + -}} + + {{- /* Fetch the Pod selectorLabels */ -}} + {{- $selectorLabels := include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | fromYaml -}} + {{- if not (empty $selectorLabels) -}} + {{- $labels = merge $selectorLabels $labels -}} + {{- end -}} + + {{- /* Set to the default if it is set */ -}} + {{- $defaultOption := get $rootContext.Values.defaultPodOptions "labels" -}} + {{- if not (empty $defaultOption) -}} + {{- $labels = merge $defaultOption $labels -}} + {{- end -}} + + {{- /* See if a pod-specific override is set */ -}} + {{- if hasKey $controllerObject "pod" -}} + {{- $podOption := get $controllerObject.pod "labels" -}} + {{- if not (empty $podOption) -}} + {{- $labels = merge $podOption $labels -}} + {{- end -}} + {{- end -}} + + {{- if not (empty $labels) -}} + {{- $labels | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pvc/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pvc/_validate.tpl new file mode 100644 index 000000000..23110faf0 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pvc/_validate.tpl @@ -0,0 +1,7 @@ +{{/* +Validate PVC values +*/}} +{{- define "bjw-s.common.lib.pvc.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $pvcObject := .object -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pvc/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pvc/_valuesToObject.tpl new file mode 100644 index 000000000..99878382a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pvc/_valuesToObject.tpl @@ -0,0 +1,24 @@ +{{/* +Convert PVC values to an object +*/}} +{{- define "bjw-s.common.lib.pvc.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Determine and inject the PVC name */ -}} + {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + + {{- if $objectValues.nameOverride -}} + {{- if ne $objectValues.nameOverride "-" -}} + {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} + {{- end -}} + {{- else -}} + {{- $objectName = printf "%s-%s" $objectName $identifier -}} + {{- end -}} + {{- $_ := set $objectValues "name" $objectName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Return the PVC object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_primary.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_primary.tpl new file mode 100644 index 000000000..ba6cd1a40 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_primary.tpl @@ -0,0 +1,21 @@ +{{/* Return the name of the primary route object */}} +{{- define "bjw-s.common.lib.route.primary" -}} + {{- $enabledRoutes := dict -}} + {{- range $name, $route := .Values.route -}} + {{- if $route.enabled -}} + {{- $_ := set $enabledRoutes $name . -}} + {{- end -}} + {{- end -}} + + {{- $result := "" -}} + {{- range $name, $route := $enabledRoutes -}} + {{- if and (hasKey $route "primary") $route.primary -}} + {{- $result = $name -}} + {{- end -}} + {{- end -}} + + {{- if not $result -}} + {{- $result = keys $enabledRoutes | first -}} + {{- end -}} + {{- $result -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_validate.tpl new file mode 100644 index 000000000..776494c0a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_validate.tpl @@ -0,0 +1,25 @@ +{{/* +Validate Route values +*/}} +{{- define "bjw-s.common.lib.route.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $routeObject := .object -}} + + {{/* Route Types */}} + {{- $routeKind := $routeObject.kind | default "HTTPRoute"}} + {{- if and (ne $routeKind "GRPCRoute") (ne $routeKind "HTTPRoute") (ne $routeKind "TCPRoute") (ne $routeKind "TLSRoute") (ne $routeKind "UDPRoute") }} + {{- fail (printf "Not a valid route kind (%s)" $routeKind) }} + {{- end }} + + {{/* Route Rules */}} + + {{- range $routeObject.rules }} + {{- if and (.filters) (.backendRefs) }} + {{- range .filters }} + {{- if eq .type "RequestRedirect" }} + {{- fail (printf "backend refs and request redirect filters cannot co-exist.")}} + {{- end }} + {{- end }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_valuesToObject.tpl new file mode 100644 index 000000000..1b4366312 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_valuesToObject.tpl @@ -0,0 +1,24 @@ +{{/* +Convert Route values to an object +*/}} +{{- define "bjw-s.common.lib.route.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Determine and inject the Route name */ -}} + {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + + {{- if $objectValues.nameOverride -}} + {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} + {{- else -}} + {{- if ne $identifier (include "bjw-s.common.lib.route.primary" $rootContext) -}} + {{- $objectName = printf "%s-%s" $objectName $identifier -}} + {{- end -}} + {{- end -}} + {{- $_ := set $objectValues "name" $objectName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Return the Route object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_getByIdentifier.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_getByIdentifier.tpl new file mode 100644 index 000000000..ddcb4547a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_getByIdentifier.tpl @@ -0,0 +1,12 @@ +{{/* +Return a secret Object by its Identifier. +*/}} +{{- define "bjw-s.common.lib.secret.getByIdentifier" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + + {{- $secretValues := dig $identifier nil $rootContext.Values.secrets -}} + {{- if not (empty $secretValues) -}} + {{- include "bjw-s.common.lib.secret.valuesToObject" (dict "rootContext" $rootContext "id" $identifier "values" $secretValues) -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_validate.tpl new file mode 100644 index 000000000..82603992f --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_validate.tpl @@ -0,0 +1,7 @@ +{{/* +Validate Secret values +*/}} +{{- define "bjw-s.common.lib.secret.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $secretValues := .object -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_valuesToObject.tpl new file mode 100644 index 000000000..59f89d17a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_valuesToObject.tpl @@ -0,0 +1,24 @@ +{{/* +Convert Secret values to an object +*/}} +{{- define "bjw-s.common.lib.secret.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Determine and inject the Secret name */ -}} + {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + + {{- if $objectValues.nameOverride -}} + {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} + {{- else -}} + {{- if ne $identifier "main" -}} + {{- $objectName = printf "%s-%s" $objectName $identifier -}} + {{- end -}} + {{- end -}} + {{- $_ := set $objectValues "name" $objectName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Return the Secret object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_enabled_ports.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_enabled_ports.tpl new file mode 100644 index 000000000..6de6c1b08 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_enabled_ports.tpl @@ -0,0 +1,22 @@ +{{/* +Return the enabled ports for a given Service object. +*/}} +{{- define "bjw-s.common.lib.service.enabledPorts" -}} + {{- $rootContext := .rootContext -}} + {{- $serviceObject := .serviceObject -}} + + {{- $enabledPorts := dict -}} + + {{- range $name, $port := $serviceObject.ports -}} + {{- if kindIs "map" $port -}} + {{- $portEnabled := true -}} + {{- if hasKey $port "enabled" -}} + {{- $portEnabled = $port.enabled -}} + {{- end -}} + {{- if $portEnabled -}} + {{- $_ := set $enabledPorts $name . -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- $enabledPorts | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_enabled_services.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_enabled_services.tpl new file mode 100644 index 000000000..74b4ea901 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_enabled_services.tpl @@ -0,0 +1,23 @@ +{{/* +Return the enabled services. +*/}} +{{- define "bjw-s.common.lib.service.enabledServices" -}} + {{- $rootContext := .rootContext -}} + {{- $enabledServices := dict -}} + + {{- range $name, $service := $rootContext.Values.service -}} + {{- if kindIs "map" $service -}} + {{- /* Enable Service by default, but allow override */ -}} + {{- $serviceEnabled := true -}} + {{- if hasKey $service "enabled" -}} + {{- $serviceEnabled = $service.enabled -}} + {{- end -}} + + {{- if $serviceEnabled -}} + {{- $_ := set $enabledServices $name . -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- $enabledServices | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_getByIdentifier.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_getByIdentifier.tpl new file mode 100644 index 000000000..c83351254 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_getByIdentifier.tpl @@ -0,0 +1,13 @@ +{{/* +Return a service Object by its Identifier. +*/}} +{{- define "bjw-s.common.lib.service.getByIdentifier" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + + {{- range $name, $serviceValues := $rootContext.Values.service -}} + {{- if eq $name $identifier -}} + {{- include "bjw-s.common.lib.service.valuesToObject" (dict "rootContext" $rootContext "id" $identifier "values" $serviceValues) -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_getPortNumberByName.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_getPortNumberByName.tpl new file mode 100644 index 000000000..0b9174702 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_getPortNumberByName.tpl @@ -0,0 +1,17 @@ +{{/* +Return a service port number by name for a Service object +*/}} +{{- define "bjw-s.common.lib.service.getPortNumberByName" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .serviceID -}} + {{- $portName := .portName -}} + + {{- $service := include "bjw-s.common.lib.service.getByIdentifier" (dict "rootContext" $rootContext "id" $identifier) | fromYaml -}} + + {{- if $service -}} + {{ $servicePort := dig "ports" $portName "port" nil $service -}} + {{- if not (eq $servicePort nil) -}} + {{- $servicePort -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_primaryForController.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_primaryForController.tpl new file mode 100644 index 000000000..ebc07067f --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_primaryForController.tpl @@ -0,0 +1,30 @@ +{{/* +Return the primary service object for a controller +*/}} +{{- define "bjw-s.common.lib.service.primaryForController" -}} + {{- $rootContext := .rootContext -}} + {{- $controllerIdentifier := .controllerIdentifier -}} + + {{- $identifier := "" -}} + {{- $result := dict -}} + + {{- /* Loop over all enabled services */ -}} + {{- $enabledServices := (include "bjw-s.common.lib.service.enabledServices" (dict "rootContext" $rootContext) | fromYaml ) }} + {{- if $enabledServices -}} + {{- range $name, $service := $enabledServices -}} + {{- /* Determine the Service that has been marked as primary */ -}} + {{- if and (hasKey $service "primary") $service.primary -}} + {{- $identifier = $name -}} + {{- $result = $service -}} + {{- end -}} + {{- end -}} + + {{- /* Return the first Service if none has been explicitly marked as primary */ -}} + {{- if not $result -}} + {{- $identifier = keys $enabledServices | first -}} + {{- $result = get $enabledServices $identifier -}} + {{- end -}} + + {{- include "bjw-s.common.lib.service.valuesToObject" (dict "rootContext" $rootContext "id" $identifier "values" $result) -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_primary_port.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_primary_port.tpl new file mode 100644 index 000000000..d921be1a7 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_primary_port.tpl @@ -0,0 +1,25 @@ +{{/* +Return the primary port for a given Service object. +*/}} +{{- define "bjw-s.common.lib.service.primaryPort" -}} + {{- $rootContext := .rootContext -}} + {{- $serviceObject := .serviceObject -}} + {{- $result := "" -}} + + {{- /* Loop over all enabled ports */ -}} + {{- $enabledPorts := include "bjw-s.common.lib.service.enabledPorts" (dict "rootContext" $rootContext "serviceObject" $serviceObject) | fromYaml }} + {{- range $name, $port := $enabledPorts -}} + {{- /* Determine the port that has been marked as primary */ -}} + {{- if and (hasKey $port "primary") $port.primary -}} + {{- $result = $port -}} + {{- end -}} + {{- end -}} + + {{- /* Return the first port if none has been explicitly marked as primary */ -}} + {{- if not $result -}} + {{- $firstPortKey := keys $enabledPorts | first -}} + {{- $result = get $enabledPorts $firstPortKey -}} + {{- end -}} + + {{- $result | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_validate.tpl new file mode 100644 index 000000000..e9558cea3 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_validate.tpl @@ -0,0 +1,37 @@ +{{/* +Validate Service values +*/}} +{{- define "bjw-s.common.lib.service.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $serviceObject := .object -}} + + {{- if empty (get $serviceObject "controller") -}} + {{- fail (printf "controller field is required for Service. (service: %s)" $serviceObject.identifier) -}} + {{- end -}} + + {{- /* Validate Service type */ -}} + {{- $validServiceTypes := (list "ClusterIP" "LoadBalancer" "NodePort" "ExternalName" "ExternalIP") -}} + {{- if and $serviceObject.type (not (mustHas $serviceObject.type $validServiceTypes)) -}} + {{- fail ( + printf "invalid service type \"%s\" for Service with key \"%s\". Allowed values are [%s]" + $serviceObject.type + $serviceObject.identifier + (join ", " $validServiceTypes) + ) -}} + {{- end -}} + + {{- if ne $serviceObject.type "ExternalName" -}} + {{- $enabledPorts := include "bjw-s.common.lib.service.enabledPorts" (dict "rootContext" $rootContext "serviceObject" $serviceObject) | fromYaml }} + {{- /* Validate at least one port is enabled */ -}} + {{- if not $enabledPorts -}} + {{- fail (printf "no ports are enabled for Service with key \"%s\"" $serviceObject.identifier) -}} + {{- end -}} + + {{- range $name, $port := $enabledPorts -}} + {{- /* Validate a port number is configured */ -}} + {{- if not $port.port -}} + {{- fail (printf "no port number is configured for port \"%s\" under Service with key \"%s\"" $name $serviceObject.identifier) -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_valuesToObject.tpl new file mode 100644 index 000000000..2b1417cbe --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_valuesToObject.tpl @@ -0,0 +1,24 @@ +{{/* +Convert Service values to an object +*/}} +{{- define "bjw-s.common.lib.service.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Determine and inject the Service name */ -}} + {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + + {{- if $objectValues.nameOverride -}} + {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} + {{- else -}} + {{- if not $objectValues.primary -}} + {{- $objectName = printf "%s-%s" $objectName $identifier -}} + {{- end -}} + {{- end -}} + {{- $_ := set $objectValues "name" $objectName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Return the Service object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceAccount/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceAccount/_validate.tpl new file mode 100644 index 000000000..8eeb37461 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceAccount/_validate.tpl @@ -0,0 +1,7 @@ +{{/* +Validate ServiceAccount values +*/}} +{{- define "bjw-s.common.lib.serviceAccount.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $serviceAccountValues := .object -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceAccount/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceAccount/_valuesToObject.tpl new file mode 100644 index 000000000..9451e1018 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceAccount/_valuesToObject.tpl @@ -0,0 +1,23 @@ +{{/* +Convert ServiceAccount values to an object +*/}} +{{- define "bjw-s.common.lib.serviceAccount.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Determine and inject the serviceAccount name */ -}} + {{- $serviceAccountName := "" -}} + {{- $defaultServiceAccountName := "default" -}} + {{- if $objectValues.create -}} + {{- $defaultServiceAccountName = (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + {{- end -}} + + {{- $serviceAccountName = default $defaultServiceAccountName $objectValues.name -}} + + {{- $_ := set $objectValues "name" $serviceAccountName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Return the serviceAccount object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceMonitor/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceMonitor/_validate.tpl new file mode 100644 index 000000000..c63527a17 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceMonitor/_validate.tpl @@ -0,0 +1,11 @@ +{{/* +Validate serviceMonitor values +*/}} +{{- define "bjw-s.common.lib.serviceMonitor.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $serviceMonitorObject := .object -}} + + {{- if not $serviceMonitorObject.endpoints -}} + {{- fail (printf "endpoints are required for serviceMonitor with key \"%v\"" $serviceMonitorObject.identifier) -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceMonitor/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceMonitor/_valuesToObject.tpl new file mode 100644 index 000000000..febce01da --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceMonitor/_valuesToObject.tpl @@ -0,0 +1,24 @@ +{{/* +Convert ServiceMonitor values to an object +*/}} +{{- define "bjw-s.common.lib.serviceMonitor.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Determine and inject the ServiceMonitor name */ -}} + {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + + {{- if $objectValues.nameOverride -}} + {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} + {{- else -}} + {{- if ne $identifier "main" -}} + {{- $objectName = printf "%s-%s" $objectName $identifier -}} + {{- end -}} + {{- end -}} + {{- $_ := set $objectValues "name" $objectName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Return the ServiceMonitor object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_validate.tpl new file mode 100644 index 000000000..1bfcac738 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_validate.tpl @@ -0,0 +1,23 @@ +{{/* +Validate StatefulSet values +*/}} +{{- define "bjw-s.common.lib.statefulset.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $statefulsetValues := .object -}} + + {{- if and (ne $statefulsetValues.strategy "OnDelete") (ne $statefulsetValues.strategy "RollingUpdate") -}} + {{- fail (printf "Not a valid strategy type for StatefulSet. (controller: %s, strategy: %s)" $statefulsetValues.identifier $statefulsetValues.strategy) -}} + {{- end -}} + + {{- if not (empty (dig "statefulset" "volumeClaimTemplates" "" $statefulsetValues)) -}} + {{- range $index, $volumeClaimTemplate := $statefulsetValues.statefulset.volumeClaimTemplates -}} + {{- if empty (get . "size") -}} + {{- fail (printf "size is required for volumeClaimTemplate. (controller: %s, volumeClaimTemplate: %s)" $statefulsetValues.identifier $volumeClaimTemplate.name) -}} + {{- end -}} + + {{- if empty (get . "accessMode") -}} + {{- fail (printf "accessMode is required for volumeClaimTemplate. (controller: %s, volumeClaimTemplate: %s)" $statefulsetValues.identifier $volumeClaimTemplate.name) -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_valuesToObject.tpl new file mode 100644 index 000000000..687f4ed86 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_valuesToObject.tpl @@ -0,0 +1,14 @@ +{{/* +Convert StatefulSet values to an object +*/}} +{{- define "bjw-s.common.lib.statefulset.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- $strategy := default "RollingUpdate" $objectValues.strategy -}} + {{- $_ := set $objectValues "strategy" $strategy -}} + + {{- /* Return the StatefulSet object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_volumeClaimTemplates.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_volumeClaimTemplates.tpl new file mode 100644 index 000000000..ab96ae799 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_volumeClaimTemplates.tpl @@ -0,0 +1,51 @@ +{{/* +Basic VolumeClaimTemplate template +*/}} +{{- define "bjw-s.common.lib.statefulset.volumeclaimtemplate" -}} + {{- $rootContext := .rootContext -}} + {{- $values := .values -}} + +metadata: + name: {{ $values.name }} + {{- with ($values.labels | default dict) }} + labels: {{- toYaml . | nindent 10 }} + {{- end }} + {{- with ($values.annotations | default dict) }} + annotations: {{- toYaml . | nindent 10 }} + {{- end }} +spec: + accessModes: + - {{ $values.accessMode | quote }} + resources: + requests: + storage: {{ $values.size | quote }} + {{- if $values.storageClass }} + storageClassName: {{ if (eq "-" $values.storageClass) }}""{{- else }}{{ $values.storageClass | quote }}{{- end }} + {{- end }} + {{- with $values.dataSource }} + dataSource: {{- tpl (toYaml .) $rootContext | nindent 10 }} + {{- end }} + {{- with $values.dataSourceRef }} + dataSourceRef: {{- tpl (toYaml .) $rootContext | nindent 10 }} + {{- end }} +{{- end -}} + +{{/* +VolumeClaimTemplates for StatefulSet +*/}} +{{- define "bjw-s.common.lib.statefulset.volumeclaimtemplates" -}} + {{- $rootContext := .rootContext -}} + {{- $statefulsetObject := .statefulsetObject -}} + + {{- /* Default to empty list */ -}} + {{- $volumeClaimTemplates := list -}} + + {{- range $index, $volumeClaimTemplate := (dig "statefulset" "volumeClaimTemplates" list $statefulsetObject) }} + {{- $vct := include "bjw-s.common.lib.statefulset.volumeclaimtemplate" (dict "rootContext" $rootContext "values" $volumeClaimTemplate) -}} + {{- $volumeClaimTemplates = append $volumeClaimTemplates ($vct | fromYaml) -}} + {{- end -}} + + {{- if not (empty $volumeClaimTemplates) -}} + {{ $volumeClaimTemplates | toYaml }} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_all.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_all.tpl new file mode 100644 index 000000000..f0b700788 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_all.tpl @@ -0,0 +1,10 @@ +{{/* +Main entrypoint for the common library chart. It will render all underlying templates based on the provided values. +*/}} +{{- define "bjw-s.common.loader.all" -}} + {{- /* Generate chart and dependency values */ -}} + {{- include "bjw-s.common.loader.init" . -}} + + {{- /* Generate remaining objects */ -}} + {{- include "bjw-s.common.loader.generate" . -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_generate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_generate.tpl new file mode 100644 index 000000000..43750162a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_generate.tpl @@ -0,0 +1,16 @@ +{{/* +Secondary entrypoint and primary loader for the common chart +*/}} +{{- define "bjw-s.common.loader.generate" -}} + {{- /* Build the templates */ -}} + {{- include "bjw-s.common.render.pvcs" . | nindent 0 -}} + {{- include "bjw-s.common.render.serviceAccount" . | nindent 0 -}} + {{- include "bjw-s.common.render.controllers" . | nindent 0 -}} + {{- include "bjw-s.common.render.services" . | nindent 0 -}} + {{- include "bjw-s.common.render.ingresses" . | nindent 0 -}} + {{- include "bjw-s.common.render.serviceMonitors" . | nindent 0 -}} + {{- include "bjw-s.common.render.routes" . | nindent 0 -}} + {{- include "bjw-s.common.render.configMaps" . | nindent 0 -}} + {{- include "bjw-s.common.render.secrets" . | nindent 0 -}} + {{- include "bjw-s.common.render.networkpolicies" . | nindent 0 -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_init.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_init.tpl new file mode 100644 index 000000000..95f63f62c --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_init.tpl @@ -0,0 +1,4 @@ +{{- define "bjw-s.common.loader.init" -}} + {{- /* Merge the local chart values and the common chart defaults */ -}} + {{- include "bjw-s.common.values.init" . }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_configmaps.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_configmaps.tpl new file mode 100644 index 000000000..7d69205df --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_configmaps.tpl @@ -0,0 +1,26 @@ +{{/* +Renders the configMap objects required by the chart. +*/}} +{{- define "bjw-s.common.render.configMaps" -}} + {{- /* Generate named configMaps as required */ -}} + {{- range $key, $configMap := .Values.configMaps }} + {{- /* Enable configMap by default, but allow override */ -}} + {{- $configMapEnabled := true -}} + {{- if hasKey $configMap "enabled" -}} + {{- $configMapEnabled = $configMap.enabled -}} + {{- end -}} + + {{- if $configMapEnabled -}} + {{- $configMapValues := (mustDeepCopy $configMap) -}} + + {{- /* Create object from the raw configMap values */ -}} + {{- $configMapObject := (include "bjw-s.common.lib.configMap.valuesToObject" (dict "rootContext" $ "id" $key "values" $configMapValues)) | fromYaml -}} + + {{- /* Perform validations on the configMap before rendering */ -}} + {{- include "bjw-s.common.lib.configMap.validate" (dict "rootContext" $ "object" $configMapObject) -}} + + {{/* Include the configMap class */}} + {{- include "bjw-s.common.class.configMap" (dict "rootContext" $ "object" $configMapObject) | nindent 0 -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_controllers.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_controllers.tpl new file mode 100644 index 000000000..0d58998f4 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_controllers.tpl @@ -0,0 +1,45 @@ +{{/* +Renders the controller objects required by the chart. +*/}} +{{- define "bjw-s.common.render.controllers" -}} + {{- /* Generate named controller objects as required */ -}} + {{- range $key, $controller := .Values.controllers -}} + {{- /* Enable controller by default, but allow override */ -}} + {{- $controllerEnabled := true -}} + {{- if hasKey $controller "enabled" -}} + {{- $controllerEnabled = $controller.enabled -}} + {{- end -}} + + {{- if $controllerEnabled -}} + {{- $controllerValues := $controller -}} + + {{- /* Create object from the raw controller values */ -}} + {{- $controllerObject := (include "bjw-s.common.lib.controller.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerValues)) | fromYaml -}} + + {{- /* Perform validations on the controller before rendering */ -}} + {{- include "bjw-s.common.lib.controller.validate" (dict "rootContext" $ "object" $controllerObject) -}} + + {{- if eq $controllerObject.type "deployment" -}} + {{- $deploymentObject := (include "bjw-s.common.lib.deployment.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} + {{- include "bjw-s.common.lib.deployment.validate" (dict "rootContext" $ "object" $deploymentObject) -}} + {{- include "bjw-s.common.class.deployment" (dict "rootContext" $ "object" $deploymentObject) | nindent 0 -}} + {{- else if eq $controllerObject.type "cronjob" -}} + {{- $cronjobObject := (include "bjw-s.common.lib.cronjob.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} + {{- include "bjw-s.common.lib.cronjob.validate" (dict "rootContext" $ "object" $cronjobObject) -}} + {{- include "bjw-s.common.class.cronjob" (dict "rootContext" $ "object" $cronjobObject) | nindent 0 -}} + {{- else if eq $controllerObject.type "daemonset" -}} + {{- $daemonsetObject := (include "bjw-s.common.lib.daemonset.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} + {{- include "bjw-s.common.lib.daemonset.validate" (dict "rootContext" $ "object" $daemonsetObject) -}} + {{- include "bjw-s.common.class.daemonset" (dict "rootContext" $ "object" $daemonsetObject) | nindent 0 -}} + {{- else if eq $controllerObject.type "statefulset" -}} + {{- $statefulsetObject := (include "bjw-s.common.lib.statefulset.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} + {{- include "bjw-s.common.lib.statefulset.validate" (dict "rootContext" $ "object" $statefulsetObject) -}} + {{- include "bjw-s.common.class.statefulset" (dict "rootContext" $ "object" $statefulsetObject) | nindent 0 -}} + {{- else if eq $controllerObject.type "job" -}} + {{- $jobObject := (include "bjw-s.common.lib.job.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} + {{- include "bjw-s.common.lib.job.validate" (dict "rootContext" $ "object" $jobObject) -}} + {{- include "bjw-s.common.class.job" (dict "rootContext" $ "object" $jobObject) | nindent 0 -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_ingresses.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_ingresses.tpl new file mode 100644 index 000000000..c0cbc24a0 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_ingresses.tpl @@ -0,0 +1,26 @@ +{{/* +Renders the Ingress objects required by the chart. +*/}} +{{- define "bjw-s.common.render.ingresses" -}} + {{- /* Generate named Ingresses as required */ -}} + {{- range $key, $ingress := .Values.ingress }} + {{- /* Enable Ingress by default, but allow override */ -}} + {{- $ingressEnabled := true -}} + {{- if hasKey $ingress "enabled" -}} + {{- $ingressEnabled = $ingress.enabled -}} + {{- end -}} + + {{- if $ingressEnabled -}} + {{- $ingressValues := (mustDeepCopy $ingress) -}} + + {{- /* Create object from the raw ingress values */ -}} + {{- $ingressObject := (include "bjw-s.common.lib.ingress.valuesToObject" (dict "rootContext" $ "id" $key "values" $ingressValues)) | fromYaml -}} + + {{- /* Perform validations on the ingress before rendering */ -}} + {{- include "bjw-s.common.lib.ingress.validate" (dict "rootContext" $ "object" $ingressObject) -}} + + {{/* Include the ingress class */}} + {{- include "bjw-s.common.class.ingress" (dict "rootContext" $ "object" $ingressObject) | nindent 0 -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_networkpolicies.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_networkpolicies.tpl new file mode 100644 index 000000000..d35a591ba --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_networkpolicies.tpl @@ -0,0 +1,26 @@ +{{/* +Renders the networkPolicy objects required by the chart. +*/}} +{{- define "bjw-s.common.render.networkpolicies" -}} + {{- /* Generate named networkPolicy as required */ -}} + {{- range $key, $networkPolicy := .Values.networkpolicies }} + {{- /* Enable networkPolicy by default, but allow override */ -}} + {{- $networkPolicyEnabled := true -}} + {{- if hasKey $networkPolicy "enabled" -}} + {{- $networkPolicyEnabled = $networkPolicy.enabled -}} + {{- end -}} + + {{- if $networkPolicyEnabled -}} + {{- $networkPolicyValues := (mustDeepCopy $networkPolicy) -}} + + {{- /* Create object from the raw networkPolicy values */ -}} + {{- $networkPolicyObject := (include "bjw-s.common.lib.networkpolicy.valuesToObject" (dict "rootContext" $ "id" $key "values" $networkPolicyValues)) | fromYaml -}} + + {{- /* Perform validations on the networkPolicy before rendering */ -}} + {{- include "bjw-s.common.lib.networkpolicy.validate" (dict "rootContext" $ "object" $networkPolicyObject) -}} + + {{/* Include the networkPolicy class */}} + {{- include "bjw-s.common.class.networkpolicy" (dict "rootContext" $ "object" $networkPolicyObject) | nindent 0 -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_pvcs.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_pvcs.tpl new file mode 100644 index 000000000..98d7df5e3 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_pvcs.tpl @@ -0,0 +1,26 @@ +{{/* +Renders the Persistent Volume Claim objects required by the chart. +*/}} +{{- define "bjw-s.common.render.pvcs" -}} + {{- /* Generate pvc as required */ -}} + {{- range $key, $pvc := .Values.persistence -}} + {{- /* Enable PVC by default, but allow override */ -}} + {{- $pvcEnabled := true -}} + {{- if hasKey $pvc "enabled" -}} + {{- $pvcEnabled = $pvc.enabled -}} + {{- end -}} + + {{- if and $pvcEnabled (eq (default "persistentVolumeClaim" $pvc.type) "persistentVolumeClaim") (not $pvc.existingClaim) -}} + {{- $pvcValues := (mustDeepCopy $pvc) -}} + + {{- /* Create object from the raw PVC values */ -}} + {{- $pvcObject := (include "bjw-s.common.lib.pvc.valuesToObject" (dict "rootContext" $ "id" $key "values" $pvcValues)) | fromYaml -}} + + {{- /* Perform validations on the PVC before rendering */ -}} + {{- include "bjw-s.common.lib.pvc.validate" (dict "rootContext" $ "object" $pvcValues) -}} + + {{- /* Include the PVC class */ -}} + {{- include "bjw-s.common.class.pvc" (dict "rootContext" $ "object" $pvcValues) | nindent 0 -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_routes.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_routes.tpl new file mode 100644 index 000000000..12e89caac --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_routes.tpl @@ -0,0 +1,24 @@ +{{/* Renders the Route objects required by the chart */}} +{{- define "bjw-s.common.render.routes" -}} + {{- /* Generate named routes as required */ -}} + {{- range $key, $route := .Values.route }} + {{- /* Enable Route by default, but allow override */ -}} + {{- $routeEnabled := true -}} + {{- if hasKey $route "enabled" -}} + {{- $routeEnabled = $route.enabled -}} + {{- end -}} + + {{- if $routeEnabled -}} + {{- $routeValues := (mustDeepCopy $route) -}} + + {{- /* Create object from the raw Route values */ -}} + {{- $routeObject := (include "bjw-s.common.lib.route.valuesToObject" (dict "rootContext" $ "id" $key "values" $routeValues)) | fromYaml -}} + + {{- /* Perform validations on the Route before rendering */ -}} + {{- include "bjw-s.common.lib.route.validate" (dict "rootContext" $ "object" $routeObject) -}} + + {{- /* Include the Route class */ -}} + {{- include "bjw-s.common.class.route" (dict "rootContext" $ "object" $routeObject) | nindent 0 -}} + {{- end }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_secrets.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_secrets.tpl new file mode 100644 index 000000000..feaaed2db --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_secrets.tpl @@ -0,0 +1,26 @@ +{{/* +Renders the Secret objects required by the chart. +*/}} +{{- define "bjw-s.common.render.secrets" -}} + {{- /* Generate named Secrets as required */ -}} + {{- range $key, $secret := .Values.secrets }} + {{- /* Enable Secret by default, but allow override */ -}} + {{- $secretEnabled := true -}} + {{- if hasKey $secret "enabled" -}} + {{- $secretEnabled = $secret.enabled -}} + {{- end -}} + + {{- if $secretEnabled -}} + {{- $secretValues := (mustDeepCopy $secret) -}} + + {{- /* Create object from the raw Secret values */ -}} + {{- $secretObject := (include "bjw-s.common.lib.secret.valuesToObject" (dict "rootContext" $ "id" $key "values" $secretValues)) | fromYaml -}} + + {{- /* Perform validations on the Secret before rendering */ -}} + {{- include "bjw-s.common.lib.secret.validate" (dict "rootContext" $ "object" $secretObject) -}} + + {{/* Include the Secret class */}} + {{- include "bjw-s.common.class.secret" (dict "rootContext" $ "object" $secretObject) | nindent 0 -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_serviceMonitors.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_serviceMonitors.tpl new file mode 100644 index 000000000..ab8c1ff24 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_serviceMonitors.tpl @@ -0,0 +1,26 @@ +{{/* +Renders the serviceMonitor objects required by the chart. +*/}} +{{- define "bjw-s.common.render.serviceMonitors" -}} + {{- /* Generate named serviceMonitors as required */ -}} + {{- range $key, $serviceMonitor := .Values.serviceMonitor -}} + {{- /* Enable ServiceMonitor by default, but allow override */ -}} + {{- $serviceMonitorEnabled := true -}} + {{- if hasKey $serviceMonitor "enabled" -}} + {{- $serviceMonitorEnabled = $serviceMonitor.enabled -}} + {{- end -}} + + {{- if $serviceMonitorEnabled -}} + {{- $serviceMonitorValues := (mustDeepCopy $serviceMonitor) -}} + + {{- /* Create object from the raw ServiceMonitor values */ -}} + {{- $serviceMonitorObject := (include "bjw-s.common.lib.serviceMonitor.valuesToObject" (dict "rootContext" $ "id" $key "values" $serviceMonitorValues)) | fromYaml -}} + + {{- /* Perform validations on the serviceMonitor before rendering */ -}} + {{- include "bjw-s.common.lib.serviceMonitor.validate" (dict "rootContext" $ "object" $serviceMonitorObject) -}} + + {{/* Include the serviceMonitor class */}} + {{- include "bjw-s.common.class.serviceMonitor" (dict "rootContext" $ "object" $serviceMonitorObject) | nindent 0 -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_serviceaccount.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_serviceaccount.tpl new file mode 100644 index 000000000..ad6f49a65 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_serviceaccount.tpl @@ -0,0 +1,20 @@ +{{/* +Renders the serviceAccount object required by the chart. +*/}} +{{- define "bjw-s.common.render.serviceAccount" -}} + {{- if .Values.serviceAccount.create -}} + {{- $serviceAccountValues := (mustDeepCopy .Values.serviceAccount) -}} + + {{- /* Create object from the raw ServiceAccount values */ -}} + {{- $serviceAccountObject := (include "bjw-s.common.lib.serviceAccount.valuesToObject" (dict "rootContext" $ "id" "default" "values" $serviceAccountValues)) | fromYaml -}} + + {{- /* Perform validations on the ServiceAccount before rendering */ -}} + {{- include "bjw-s.common.lib.serviceAccount.validate" (dict "rootContext" $ "object" $serviceAccountObject) -}} + + {{/* Include the serviceAccount class */}} + {{- include "bjw-s.common.class.serviceAccount" (dict "rootContext" $ "object" $serviceAccountObject) | nindent 0 -}} + + {{- /* Create a service account secret */ -}} + {{- $_ := set .Values.secrets "sa-token" (dict "enabled" true "annotations" (dict "kubernetes.io/service-account.name" $serviceAccountObject.name) "type" "kubernetes.io/service-account-token") -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_services.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_services.tpl new file mode 100644 index 000000000..cf6f6ee8b --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_services.tpl @@ -0,0 +1,19 @@ +{{/* +Renders the Service objects required by the chart. +*/}} +{{- define "bjw-s.common.render.services" -}} + {{- /* Generate named Services as required */ -}} + {{- $enabledServices := (include "bjw-s.common.lib.service.enabledServices" (dict "rootContext" $) | fromYaml ) -}} + {{- range $key, $svc := $enabledServices -}} + {{- $serviceValues := (mustDeepCopy $svc) -}} + + {{- /* Create object from the raw Service values */ -}} + {{- $serviceObject := (include "bjw-s.common.lib.service.valuesToObject" (dict "rootContext" $ "id" $key "values" $serviceValues)) | fromYaml -}} + + {{- /* Perform validations on the Service before rendering */ -}} + {{- include "bjw-s.common.lib.service.validate" (dict "rootContext" $ "object" $serviceObject) -}} + + {{- /* Include the Service class */ -}} + {{- include "bjw-s.common.class.service" (dict "rootContext" $ "object" $serviceObject) | nindent 0 -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/values/_init.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/values/_init.tpl new file mode 100644 index 000000000..e9a7af8f1 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/values/_init.tpl @@ -0,0 +1,11 @@ +{{/* +Merge the local chart values and the common chart defaults +*/}} +{{- define "bjw-s.common.values.init" -}} + {{- if .Values.common -}} + {{- $defaultValues := deepCopy .Values.common -}} + {{- $userValues := deepCopy (omit .Values "common") -}} + {{- $mergedValues := mustMergeOverwrite $defaultValues $userValues -}} + {{- $_ := set . "Values" (deepCopy $mergedValues) -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/values.yaml b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/values.yaml new file mode 100644 index 000000000..30b1bd135 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/values.yaml @@ -0,0 +1,740 @@ +--- +global: + # -- Set an override for the prefix of the fullname + nameOverride: + # -- Set the entire name definition + fullnameOverride: + # -- Set additional global labels. Helm templates can be used. + labels: {} + # -- Set additional global annotations. Helm templates can be used. + annotations: {} + +# -- Set default options for all controllers / pods here +# Each of these options can be overridden on a Controller level +defaultPodOptions: + # -- Defines affinity constraint rules. + # [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity) + affinity: {} + + # -- Set annotations on the Pod. Pod-specific values will be merged with this. + annotations: {} + + # -- Specifies whether a service account token should be automatically mounted. + automountServiceAccountToken: true + + # -- Configuring the ndots option may resolve nslookup issues on some Kubernetes setups. + dnsConfig: + {} + # options: + # - name: ndots + # value: "1" + + # -- Defaults to "ClusterFirst" if hostNetwork is false + # and "ClusterFirstWithHostNet" if hostNetwork is true. + dnsPolicy: # ClusterFirst + + # -- Enable/disable the generation of environment variables for services. + # [[ref]](https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#accessing-the-service) + enableServiceLinks: true + + # -- Allows specifying explicit hostname setting + hostname: + + # -- Use hostAliases to add custom entries to /etc/hosts - mapping IP addresses to hostnames. + # [[ref]](https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/) + hostAliases: [] + # - ip: "192.168.1.100" + # hostnames: + # - "example.com" + # - "www.example.com" + + # -- Use the host's ipc namespace + hostIPC: false + + # -- When using hostNetwork make sure you set dnsPolicy to `ClusterFirstWithHostNet` + hostNetwork: false + + # -- Use the host's pid namespace + hostPID: false + + # -- Set image pull secrets + imagePullSecrets: [] + + # -- Set labels on the Pod. Pod-specific values will be merged with this. + labels: {} + + # -- Node selection constraint + # [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector) + nodeSelector: {} + + # -- Custom priority class for different treatment by the scheduler + priorityClassName: # system-node-critical + + # -- Set Container restart policy. + # @default -- `Always`. When `controller.type` is `cronjob` it defaults to `Never`. + restartPolicy: + + # -- Allow specifying a runtimeClassName other than the default one (ie: nvidia) + runtimeClassName: # nvidia + + # -- Allows specifying a custom scheduler name + schedulerName: # awkward-dangerous-scheduler + + # -- Configure the Security Context for the Pod + securityContext: {} + + # -- Duration in seconds the pod needs to terminate gracefully + # -- [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle)] + terminationGracePeriodSeconds: + + # -- Specify taint tolerations + # [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) + tolerations: [] + + # -- Defines topologySpreadConstraint rules. + # [[ref]](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) + topologySpreadConstraints: [] + # - maxSkew: + # topologyKey: + # whenUnsatisfiable: + # labelSelector: + +controllers: + main: + # -- enable the controller. + enabled: true + + # -- Set the controller type. + # Valid options are deployment, daemonset, statefulset, cronjob or job + type: deployment + # -- Set annotations on the deployment/statefulset/daemonset/cronjob/job + annotations: {} + # -- Set labels on the deployment/statefulset/daemonset/cronjob/job + labels: {} + # -- Number of desired pods. When using a HorizontalPodAutoscaler, set this to `null`. + replicas: 1 + # -- Set the controller upgrade strategy + # For Deployments, valid values are Recreate (default) and RollingUpdate. + # For StatefulSets, valid values are OnDelete and RollingUpdate (default). + # DaemonSets/CronJobs/Jobs ignore this. + strategy: + + rollingUpdate: + # -- Set deployment RollingUpdate max unavailable + unavailable: + # -- Set deployment RollingUpdate max surge + surge: + # -- Set statefulset RollingUpdate partition + partition: + # -- ReplicaSet revision history limit + revisionHistoryLimit: 3 + + # -- CronJob configuration. Required only when using `controller.type: cronjob`. + # @default -- See below + cronjob: + # -- Suspends the CronJob + # [[ref]](https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#schedule-suspension) + # @default -- false + suspend: + # -- Specifies how to treat concurrent executions of a job that is created by this cron job + # valid values are Allow, Forbid or Replace + concurrencyPolicy: Forbid + # -- Sets the CronJob timezone (only works in Kubernetes >= 1.27) + timeZone: + # -- Sets the CronJob time when to execute your jobs + schedule: "*/20 * * * *" + # -- The deadline in seconds for starting the job if it misses its scheduled time for any reason + startingDeadlineSeconds: 30 + # -- The number of succesful Jobs to keep + successfulJobsHistory: 1 + # -- The number of failed Jobs to keep + failedJobsHistory: 1 + # -- If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to + # be automatically deleted. + ttlSecondsAfterFinished: + # -- Limits the number of times a failed job will be retried + backoffLimit: 6 + + # -- Job configuration. Required only when using `controller.type: job`. + # @default -- See below + job: + # -- Suspends the Job + # [[ref]](https://kubernetes.io/docs/concepts/workloads/controllers/job/#suspending-a-job) + # @default -- false + suspend: + # -- If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to + # be automatically deleted. + ttlSecondsAfterFinished: + # -- Limits the number of times a failed job will be retried + backoffLimit: 6 + + # -- StatefulSet configuration. Required only when using `controller.type: statefulset`. + statefulset: + # -- Set podManagementPolicy, valid values are Parallel and OrderedReady (default). + podManagementPolicy: + + # -- Used to create individual disks for each instance. + volumeClaimTemplates: [] + # - name: data + # labels: {} + # annotations: {} + # globalMounts: + # - path: /data + # accessMode: "ReadWriteOnce" + # dataSourceRef: + # apiGroup: snapshot.storage.k8s.io + # kind: VolumeSnapshot + # name: MySnapshot + # size: 1Gi + # - name: backup + # labels: {} + # annotations: {} + # globalMounts: + # - path: /backup + # subPath: theSubPath + # accessMode: "ReadWriteOnce" + # size: 2Gi + # storageClass: cheap-storage-class + + # Controller-specific overrides for `defaultPodOptions` keys + pod: {} + + containers: + main: + # -- Override the container name + nameOverride: + + # -- Override the default container order + # Containers get sorted alphanumerically by the `-` combination. + # @default -- 99 + order: 1 + + # -- Specify if this container depends on any other containers + # This is used to determine the order in which the containers are rendered. + # The use of "dependsOn" completely disables the "order" field within the controller. + dependsOn: [] + + image: + # -- image repository + repository: + # -- image tag + tag: + # -- image pull policy + pullPolicy: + + # -- Override the command(s) for the default container + command: [] + # -- Override the args for the default container + args: [] + # -- Override the working directory for the default container + workingDir: + + # -- Environment variables. Template enabled. + # Syntax options: + # A) TZ: UTC + # B) PASSWD: '{{ .Release.Name }}' + # B) TZ: + # value: UTC + # dependsOn: otherVar + # D) PASSWD: + # configMapKeyRef: + # name: config-map-name + # key: key-name + # E) PASSWD: + # dependsOn: + # - otherVar1 + # - otherVar2 + # valueFrom: + # secretKeyRef: + # name: secret-name + # key: key-name + # ... + # F) - name: TZ + # value: UTC + # G) - name: TZ + # value: '{{ .Release.Name }}' + env: + + # -- Secrets and/or ConfigMaps that will be loaded as environment variables. + # Syntax options: + # A) Pass an app-template configMap identifier: + # - config: config + # B) Pass any configMap name that is not also an identifier (Template enabled): + # - config: random-configmap-name + # C) Pass an app-template configMap identifier, explicit syntax: + # - configMapRef: + # identifier: config + # D) Pass any configMap name, explicit syntax (Template enabled): + # - configMapRef: + # name: "{{ .Release.Name }}-config" + # E) Pass an app-template secret identifier: + # - secret: secret + # F) Pass any secret name that is not also an identifier (Template enabled): + # - secret: random-secret-name + # G) Pass an app-template secret identifier, explicit syntax: + # - secretRef: + # identifier: secret + # H) Pass any secret name, explicit syntax (Template enabled): + # - secretRef: + # name: "{{ .Release.Name }}-secret" + envFrom: [] + + # -- Probe configuration + # -- [[ref]](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) + # @default -- See below + probes: + # -- Liveness probe configuration + # @default -- See below + liveness: + # -- Enable the liveness probe + enabled: true + # -- Set this to `true` if you wish to specify your own livenessProbe + custom: false + # -- sets the probe type when not using a custom probe + # @default -- "TCP" + type: TCP + # -- The spec field contains the values for the default livenessProbe. + # If you selected `custom: true`, this field holds the definition of the livenessProbe. + # @default -- See below + spec: + initialDelaySeconds: 0 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + + # -- Redainess probe configuration + # @default -- See below + readiness: + # -- Enable the readiness probe + enabled: true + # -- Set this to `true` if you wish to specify your own readinessProbe + custom: false + # -- sets the probe type when not using a custom probe + # @default -- "TCP" + type: TCP + # -- The spec field contains the values for the default readinessProbe. + # If you selected `custom: true`, this field holds the definition of the readinessProbe. + # @default -- See below + spec: + initialDelaySeconds: 0 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + + # -- Startup probe configuration + # @default -- See below + startup: + # -- Enable the startup probe + enabled: true + # -- Set this to `true` if you wish to specify your own startupProbe + custom: false + # -- sets the probe type when not using a custom probe + # @default -- "TCP" + type: TCP + # -- The spec field contains the values for the default startupProbe. + # If you selected `custom: true`, this field holds the definition of the startupProbe. + # @default -- See below + spec: + initialDelaySeconds: 0 + timeoutSeconds: 1 + ## This means it has a maximum of 5*30=150 seconds to start up before it fails + periodSeconds: 5 + failureThreshold: 30 + + # -- Set the resource requests / limits for the container. + resources: + {} + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + # -- Configure the Security Context for the container + securityContext: {} + + # -- Configure the lifecycle event hooks for the container + # -- [[ref](https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/)] + lifecycle: {} + + # -- Configure the path at which the file to which the containers termination message will be written. + # -- [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle-1)] + terminationMessagePath: + + # -- Indicate how the containers termination message should be populated. + # Valid options are `File` and `FallbackToLogsOnError`. + # -- [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle-1)] + terminationMessagePolicy: + + # -- Specify any initContainers here as dictionary items. + # Each initContainer should have its own key + # initContainers get sorted alphanumerically by the `-` combination + # if no order or dependsOn has been configured for them. + initContainers: {} + +serviceAccount: + # -- Specifies whether a service account should be created + create: false + + # -- Annotations to add to the service account + annotations: {} + + # -- Labels to add to the service account + labels: {} + + # -- The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +# -- Use this to populate secrets with the values you specify. +# Be aware that these values are not encrypted by default, and could therefore visible +# to anybody with access to the values.yaml file. +# Additional Secrets can be added by adding a dictionary key similar to the 'secret' object. +# @default -- See below +secrets: + secret: + # -- Enables or disables the Secret + enabled: false + # -- Labels to add to the Secret + labels: {} + # -- Annotations to add to the Secret + annotations: {} + # -- Secret stringData content. Helm template enabled. + stringData: + {} + # foo: bar + +# -- Configure configMaps for the chart here. +# Additional configMaps can be added by adding a dictionary key similar to the 'config' object. +# @default -- See below +configMaps: + config: + # -- Enables or disables the configMap + enabled: false + # -- Labels to add to the configMap + labels: {} + # -- Annotations to add to the configMap + annotations: {} + # -- configMap data content. Helm template enabled. + data: + {} + # foo: bar + +# -- Configure the services for the chart here. +# Additional services can be added by adding a dictionary key similar to the 'main' service. +# @default -- See below +service: + main: + # -- Enables or disables the service + enabled: true + + # -- Override the name suffix that is used for this service + nameOverride: + + # -- Configure which controller this service should target + controller: main + + # -- Make this the primary service for this controller (used in probes, notes, etc...). + # If there is more than 1 service targeting the controller, make sure that only 1 service is + # marked as primary. + primary: true + + # -- Set the service type + type: ClusterIP + + # -- Specify the externalTrafficPolicy for the service. Options: Cluster, Local + # -- [[ref](https://kubernetes.io/docs/tutorials/services/source-ip/)] + externalTrafficPolicy: + + # -- Specify the ip policy. Options: SingleStack, PreferDualStack, RequireDualStack + ipFamilyPolicy: + # -- The ip families that should be used. Options: IPv4, IPv6 + ipFamilies: [] + + # -- Provide additional annotations which may be required. + annotations: {} + + # -- Provide additional labels which may be required. + labels: {} + + # -- Allow adding additional match labels + extraSelectorLabels: {} + + # -- Configure the Service port information here. + # Additional ports can be added by adding a dictionary key similar to the 'http' service. + # @default -- See below + ports: + http: + # -- Enables or disables the port + enabled: true + + # -- Make this the primary port (used in probes, notes, etc...) + # If there is more than 1 service, make sure that only 1 port is marked as primary. + primary: true + + # -- The port number + port: + + # -- Port protocol. + # Support values are `HTTP`, `HTTPS`, `TCP` and `UDP`. + # HTTP and HTTPS spawn a TCP service and get used for internal URL and name generation + protocol: HTTP + + # -- Specify a service targetPort if you wish to differ the service port from the application port. + # If `targetPort` is specified, this port number is used in the container definition instead of + # the `port` value. Therefore named ports are not supported for this field. + targetPort: + + # -- Specify the nodePort value for the LoadBalancer and NodePort service types. + # [[ref]](https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport) + nodePort: + + # -- Specify the appProtocol value for the Service. + # [[ref]](https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol) + appProtocol: + +# -- Configure the ServiceMonitors for the chart here. +# Additional ServiceMonitors can be added by adding a dictionary key similar to the 'main' ServiceMonitors. +# @default -- See below +serviceMonitor: + main: + # -- Enables or disables the serviceMonitor. + enabled: false + + # -- Override the name suffix that is used for this serviceMonitor. + nameOverride: + + # -- Provide additional annotations which may be required. + annotations: {} + + # -- Provide additional labels which may be required. + labels: {} + + # -- Configures a custom selector for the serviceMonitor, this takes precedence over + # specifying a service name. + # Helm templates can be used. + selector: {} + + # -- Configures the target Service for the serviceMonitor. Helm templates can be used. + serviceName: '{{ include "bjw-s.common.lib.chart.names.fullname" $ }}' + + # -- Configures the endpoints for the serviceMonitor. + # @default -- See values.yaml + endpoints: + - port: http + scheme: http + path: /metrics + interval: 1m + scrapeTimeout: 10s + + # -- Configures custom targetLabels for the serviceMonitor. (All collected + # meterics will have these labels, taking the value from the target service) + # [[ref]](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#servicemonitorspec/) + targetLabels: [] + +# -- Configure the ingresses for the chart here. +# Additional ingresses can be added by adding a dictionary key similar to the 'main' ingress. +# @default -- See below +ingress: + main: + # -- Enables or disables the ingress + enabled: false + + # -- Make this the primary ingress (used in probes, notes, etc...). + # If there is more than 1 ingress, make sure that only 1 ingress is marked as primary. + primary: true + + # -- Override the name suffix that is used for this ingress. + nameOverride: + + # -- Provide additional annotations which may be required. + annotations: + {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + + # -- Provide additional labels which may be required. + labels: {} + + # -- Set the ingressClass that is used for this ingress. + className: # "nginx" + + # -- Configure the defaultBackend for this ingress. This will disable any other rules for the ingress. + defaultBackend: + + ## Configure the hosts for the ingress + hosts: + - # -- Host address. Helm template can be passed. + host: chart-example.local + ## Configure the paths for the host + paths: + - # -- Path. Helm template can be passed. + path: / + pathType: Prefix + service: + # -- Overrides the service name reference for this path + # This can be an actual service name, or reference a service identifier + # from this values.yaml + name: main + # -- Overrides the service port number reference for this path + port: + + # -- Configure TLS for the ingress. Both secretName and hosts can process a Helm template. + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +# -- Configure the gateway routes for the chart here. +# Additional routes can be added by adding a dictionary key similar to the 'main' route. +# [[ref]](https://gateway-api.sigs.k8s.io/references/spec/) +# @default -- See below +route: + main: + # -- Enables or disables the route + enabled: false + + # -- Set the route kind + # Valid options are GRPCRoute, HTTPRoute, TCPRoute, TLSRoute, UDPRoute + kind: HTTPRoute + + # -- Override the name suffix that is used for this route. + nameOverride: + + # -- Provide additional annotations which may be required. + annotations: {} + + # -- Provide additional labels which may be required. + labels: {} + + # -- Configure the resource the route attaches to. + parentRefs: + - # Group of the referent resource. + group: gateway.networking.k8s.io + # Kind of the referent resource. + kind: Gateway + # Name of the referent resource + name: + # Namespace of the referent resource + namespace: + # Name of the section within the target resource. + sectionName: + + # -- Host addresses. Helm template can be passed. + hostnames: [] + + # -- Configure rules for routing. Defaults to the primary service. + rules: + - # -- Configure backends where matching requests should be sent. + backendRefs: [] + ## Configure conditions used for matching incoming requests. Only for HTTPRoutes + matches: + - path: + type: PathPrefix + value: / + ## Request filters that are applied to the rules. + filters: [] + ## Request timeout that are applied to the rules. + timeouts: {} + +# -- Configure persistence for the chart here. +# Additional items can be added by adding a dictionary key similar to the 'config' key. +# [[ref]](https://bjw-s.github.io/helm-charts/docs/common-library/common-library-storage) +# @default -- See below +persistence: + config: + # -- Enables or disables the persistence item. Defaults to true + enabled: false + + # -- Sets the persistence type + # Valid options are persistentVolumeClaim, emptyDir, nfs, hostPath, secret, configMap or custom + type: persistentVolumeClaim + + # -- Storage Class for the config volume. + # If set to `-`, dynamic provisioning is disabled. + # If set to something else, the given storageClass is used. + # If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. + storageClass: # "-" + + # -- If you want to reuse an existing claim, the name of the existing PVC can be passed here. + existingClaim: # your-claim + + # -- The optional data source for the persistentVolumeClaim. + # [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-populators-and-data-sources) + dataSource: {} + + # -- The optional volume populator for the persistentVolumeClaim. + # [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-populators-and-data-sources) + dataSourceRef: {} + + # -- AccessMode for the persistent volume. + # Make sure to select an access mode that is supported by your storage provider! + # [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes) + accessMode: ReadWriteOnce + + # -- The amount of storage that is requested for the persistent volume. + size: 1Gi + + # -- Set to true to retain the PVC upon `helm uninstall` + retain: false + + # -- Configure mounts to all controllers and containers. By default the persistence item + # will be mounted to `/`. + # Example: + # globalMounts: + # - path: /config + # readOnly: false + globalMounts: [] + + # -- Explicitly configure mounts for specific controllers and containers. + # Example: + # advancedMounts: + # main: # the controller with the "main" identifier + # main: # the container with the "main" identifier + # - path: /data/config.yaml + # readOnly: true + # mountPropagation: None + # subPath: config.yaml + # second-container: # the container with the "second-container" identifier + # - path: /appdata/config + # readOnly: true + # second-controller: # the controller with the "second-controller" identifier + # main: # the container with the "main" identifier + # - path: /data/config.yaml + # readOnly: false + # subPath: config.yaml + advancedMounts: {} + +# -- Configure the networkPolicies for the chart here. +# Additional networkPolicies can be added by adding a dictionary key similar to the 'main' networkPolicy. +# @default -- See below +networkpolicies: + main: + # -- Enables or disables the networkPolicy item. Defaults to true + enabled: false + + # -- Configure which controller this networkPolicy should target + controller: main + + # -- Define a custom podSelector for the networkPolicy. This takes precedence over targeting a controller. + # podSelector: {} + + # -- The policyTypes for this networkPolicy + policyTypes: + - Ingress + - Egress + + # -- The rulesets for this networkPolicy + # [[ref]](https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource) + rules: + # -- The ingress rules for this networkPolicy. Allows all ingress traffic by default. + ingress: + - {} + # -- The egress rules for this networkPolicy. Allows all egress traffic by default. + egress: + - {} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/templates/_helpers.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/templates/_helpers.tpl new file mode 100644 index 000000000..7e385d4af --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/templates/_helpers.tpl @@ -0,0 +1,23 @@ +{{- define "blobcache.init" -}} + {{/* Make sure all variables are set properly */}} + {{- include "bjw-s.common.loader.init" . }} + + {{/* Apply enforced values */}} + {{- $_ := include "blobcache.image.tag" . | fromYaml | merge .Values -}} +{{- end -}} + +{{- define "blobcache.image.tag" -}} +global: + fullnameOverride: {{ .Values.global.fullnameOverride | default "blobcache" }} +controllers: + main: + enabled: true + type: deployment + containers: + main: + command: + - blobcache + image: + repository: {{ .Values.image.repository }} + tag: "{{ .Values.image.tag | default .Chart.AppVersion }}" +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/templates/common.yaml b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/templates/common.yaml new file mode 100644 index 000000000..0c5c3201f --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/templates/common.yaml @@ -0,0 +1,6 @@ +--- +{{/* Set all variables properly */}} +{{- include "blobcache.init" . -}} + +{{/* Render the templates */}} +{{- include "bjw-s.common.loader.all" . -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/values.yaml b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/values.yaml new file mode 100644 index 000000000..58893d39b --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/values.yaml @@ -0,0 +1,60 @@ +--- +# -- See the common values.yaml for all the options you can set. +# https://github.com/bjw-s/helm-charts/blob/common-2.5.0/charts/library/common/values.yaml +global: + fullnameOverride: + +image: + repository: public.ecr.aws/n4e0e1y0/beam-blobcache + tag: 0.1.2 + +controllers: + main: + annotations: {} + labels: {} + replicas: 1 + strategy: Recreate # Can be Recreate or RollingUpdate + rollingUpdate: + unavailable: + surge: + containers: + main: + resources: + limits: {} + requests: {} + # cpu: 8000m + # memory: 64Gi + +persistence: + cache: + enabled: true + type: emptyDir + medium: Memory + sizeLimit: 60Gi + +service: + main: + enabled: true + annotations: {} + labels: {} + ports: + http: + port: 2049 + targetPort: 2049 + protocol: TCP + +ingress: + main: + enabled: false + annotations: {} + labels: {} + className: # nginx, traefik, etc. + hosts: + - host: blobcache.local + paths: + - path: / + pathType: Prefix + service: + name: main # Refers to service key + port: 2049 + tls: [] diff --git a/thunder_deployment/infra/beta9/charts/common/.helmignore b/thunder_deployment/infra/beta9/charts/common/.helmignore new file mode 100644 index 000000000..c62cbf857 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/.helmignore @@ -0,0 +1,28 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ +# OWNERS file for Kubernetes +OWNERS +# helm-docs templates +*.gotmpl +# Test files +tests/ diff --git a/thunder_deployment/infra/beta9/charts/common/Chart.yaml b/thunder_deployment/infra/beta9/charts/common/Chart.yaml new file mode 100644 index 000000000..442854507 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/Chart.yaml @@ -0,0 +1,33 @@ +annotations: + artifacthub.io/changes: |- + - kind: fixed + description: |- + PersistentVolumeClaims now properly created based on `persistence.x.enabled` value + - kind: added + description: |- + Support suspending CronJobs + - kind: added + description: |- + Add support for targetLabels in ServiceMonitor + - kind: added + description: |- + Re-add support for setting mountPropagation on volumemounts + - kind: added + description: |- + Support `envFrom` identifiers and name templates for Secrets and ConfigMaps + - kind: added + description: |- + Support the `job` controller type to generate one-off jobs. +apiVersion: v2 +description: Function library for Helm charts +home: https://github.com/bjw-s/helm-charts/tree/main/charts/library/common +keywords: +- common +- library +kubeVersion: '>=1.22.0-0' +maintainers: +- email: me@bjw-s.dev + name: bjw-s +name: common +type: library +version: 2.5.0 diff --git a/thunder_deployment/infra/beta9/charts/common/README.md b/thunder_deployment/infra/beta9/charts/common/README.md new file mode 100644 index 000000000..76cef450e --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/README.md @@ -0,0 +1,234 @@ +# common + +![Version: 2.5.0](https://img.shields.io/badge/Version-2.5.0-informational?style=flat-square) ![Type: library](https://img.shields.io/badge/Type-library-informational?style=flat-square) + +Function library for Helm charts + +## Requirements + +Kubernetes: `>=1.22.0-0` + +## Dependencies + +| Repository | Name | Version | +|------------|------|---------| + +## Installing the Chart + +This is a [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm). + +**🚨 WARNING: THIS CHART IS NOT MEANT TO BE INSTALLED DIRECTLY** + +## Using this library + +Include this chart as a dependency in your `Chart.yaml` e.g. + +```yaml +# Chart.yaml +dependencies: + - name: common + version: 2.5.0 + repository: https://bjw-s.github.io/helm-charts/ +``` + +For more information, take a look at the [Docs](http://bjw-s.github.io/helm-charts/docs/common-library/introduction/). + +## Configuration + +Read through the [values.yaml](./values.yaml) file. It has several commented out suggested values. + +## Values + +**Important**: When deploying an application Helm chart you can add more values from the common library chart [here](https://github.com/bjw-s/helm-charts/tree/main/charts/library/common) + +The following table contains an overview of available values and their descriptions / default values. + +
+Expand + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| configMaps | object | See below | Configure configMaps for the chart here. Additional configMaps can be added by adding a dictionary key similar to the 'config' object. | +| configMaps.config.annotations | object | `{}` | Annotations to add to the configMap | +| configMaps.config.data | object | `{}` | configMap data content. Helm template enabled. | +| configMaps.config.enabled | bool | `false` | Enables or disables the configMap | +| configMaps.config.labels | object | `{}` | Labels to add to the configMap | +| controllers.main.annotations | object | `{}` | Set annotations on the deployment/statefulset/daemonset/cronjob/job | +| controllers.main.containers.main.args | list | `[]` | Override the args for the default container | +| controllers.main.containers.main.command | list | `[]` | Override the command(s) for the default container | +| controllers.main.containers.main.dependsOn | list | `[]` | Specify if this container depends on any other containers This is used to determine the order in which the containers are rendered. The use of "dependsOn" completely disables the "order" field within the controller. | +| controllers.main.containers.main.env | string | `nil` | Environment variables. Template enabled. Syntax options: A) TZ: UTC B) PASSWD: '{{ .Release.Name }}' B) TZ: value: UTC dependsOn: otherVar D) PASSWD: configMapKeyRef: name: config-map-name key: key-name E) PASSWD: dependsOn: - otherVar1 - otherVar2 valueFrom: secretKeyRef: name: secret-name key: key-name ... F) - name: TZ value: UTC G) - name: TZ value: '{{ .Release.Name }}' | +| controllers.main.containers.main.envFrom | list | `[]` | Secrets and/or ConfigMaps that will be loaded as environment variables. Syntax options: A) Pass an app-template configMap identifier: - config: config B) Pass any configMap name that is not also an identifier (Template enabled): - config: random-configmap-name C) Pass an app-template configMap identifier, explicit syntax: - configMapRef: identifier: config D) Pass any configMap name, explicit syntax (Template enabled): - configMapRef: name: "{{ .Release.Name }}-config" E) Pass an app-template secret identifier: - secret: secret F) Pass any secret name that is not also an identifier (Template enabled): - secret: random-secret-name G) Pass an app-template secret identifier, explicit syntax: - secretRef: identifier: secret H) Pass any secret name, explicit syntax (Template enabled): - secretRef: name: "{{ .Release.Name }}-secret" | +| controllers.main.containers.main.image.pullPolicy | string | `nil` | image pull policy | +| controllers.main.containers.main.image.repository | string | `nil` | image repository | +| controllers.main.containers.main.image.tag | string | `nil` | image tag | +| controllers.main.containers.main.lifecycle | object | `{}` | [[ref](https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/)] | +| controllers.main.containers.main.nameOverride | string | `nil` | Override the container name | +| controllers.main.containers.main.order | int | 99 | Override the default container order Containers get sorted alphanumerically by the `-` combination. | +| controllers.main.containers.main.probes | object | See below | [[ref]](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) | +| controllers.main.containers.main.probes.liveness | object | See below | Liveness probe configuration | +| controllers.main.containers.main.probes.liveness.custom | bool | `false` | Set this to `true` if you wish to specify your own livenessProbe | +| controllers.main.containers.main.probes.liveness.enabled | bool | `true` | Enable the liveness probe | +| controllers.main.containers.main.probes.liveness.spec | object | See below | The spec field contains the values for the default livenessProbe. If you selected `custom: true`, this field holds the definition of the livenessProbe. | +| controllers.main.containers.main.probes.liveness.type | string | "TCP" | sets the probe type when not using a custom probe | +| controllers.main.containers.main.probes.readiness | object | See below | Redainess probe configuration | +| controllers.main.containers.main.probes.readiness.custom | bool | `false` | Set this to `true` if you wish to specify your own readinessProbe | +| controllers.main.containers.main.probes.readiness.enabled | bool | `true` | Enable the readiness probe | +| controllers.main.containers.main.probes.readiness.spec | object | See below | The spec field contains the values for the default readinessProbe. If you selected `custom: true`, this field holds the definition of the readinessProbe. | +| controllers.main.containers.main.probes.readiness.type | string | "TCP" | sets the probe type when not using a custom probe | +| controllers.main.containers.main.probes.startup | object | See below | Startup probe configuration | +| controllers.main.containers.main.probes.startup.custom | bool | `false` | Set this to `true` if you wish to specify your own startupProbe | +| controllers.main.containers.main.probes.startup.enabled | bool | `true` | Enable the startup probe | +| controllers.main.containers.main.probes.startup.spec | object | See below | The spec field contains the values for the default startupProbe. If you selected `custom: true`, this field holds the definition of the startupProbe. | +| controllers.main.containers.main.probes.startup.type | string | "TCP" | sets the probe type when not using a custom probe | +| controllers.main.containers.main.resources | object | `{}` | Set the resource requests / limits for the container. | +| controllers.main.containers.main.securityContext | object | `{}` | Configure the Security Context for the container | +| controllers.main.containers.main.terminationMessagePath | string | `nil` | [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle-1)] | +| controllers.main.containers.main.terminationMessagePolicy | string | `nil` | [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle-1)] | +| controllers.main.containers.main.workingDir | string | `nil` | Override the working directory for the default container | +| controllers.main.cronjob | object | See below | CronJob configuration. Required only when using `controller.type: cronjob`. | +| controllers.main.cronjob.backoffLimit | int | `6` | Limits the number of times a failed job will be retried | +| controllers.main.cronjob.concurrencyPolicy | string | `"Forbid"` | Specifies how to treat concurrent executions of a job that is created by this cron job valid values are Allow, Forbid or Replace | +| controllers.main.cronjob.failedJobsHistory | int | `1` | The number of failed Jobs to keep | +| controllers.main.cronjob.schedule | string | `"*/20 * * * *"` | Sets the CronJob time when to execute your jobs | +| controllers.main.cronjob.startingDeadlineSeconds | int | `30` | The deadline in seconds for starting the job if it misses its scheduled time for any reason | +| controllers.main.cronjob.successfulJobsHistory | int | `1` | The number of succesful Jobs to keep | +| controllers.main.cronjob.suspend | string | false | Suspends the CronJob [[ref]](https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#schedule-suspension) | +| controllers.main.cronjob.timeZone | string | `nil` | Sets the CronJob timezone (only works in Kubernetes >= 1.27) | +| controllers.main.cronjob.ttlSecondsAfterFinished | string | `nil` | If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to be automatically deleted. | +| controllers.main.enabled | bool | `true` | enable the controller. | +| controllers.main.initContainers | object | `{}` | Specify any initContainers here as dictionary items. Each initContainer should have its own key initContainers get sorted alphanumerically by the `-` combination if no order or dependsOn has been configured for them. | +| controllers.main.job | object | See below | Job configuration. Required only when using `controller.type: job`. | +| controllers.main.job.backoffLimit | int | `6` | Limits the number of times a failed job will be retried | +| controllers.main.job.suspend | string | false | Suspends the Job [[ref]](https://kubernetes.io/docs/concepts/workloads/controllers/job/#suspending-a-job) | +| controllers.main.job.ttlSecondsAfterFinished | string | `nil` | If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to be automatically deleted. | +| controllers.main.labels | object | `{}` | Set labels on the deployment/statefulset/daemonset/cronjob/job | +| controllers.main.pod | object | `{}` | | +| controllers.main.replicas | int | `1` | Number of desired pods. When using a HorizontalPodAutoscaler, set this to `null`. | +| controllers.main.revisionHistoryLimit | int | `3` | ReplicaSet revision history limit | +| controllers.main.rollingUpdate.partition | string | `nil` | Set statefulset RollingUpdate partition | +| controllers.main.rollingUpdate.surge | string | `nil` | Set deployment RollingUpdate max surge | +| controllers.main.rollingUpdate.unavailable | string | `nil` | Set deployment RollingUpdate max unavailable | +| controllers.main.statefulset | object | `{"podManagementPolicy":null,"volumeClaimTemplates":[]}` | StatefulSet configuration. Required only when using `controller.type: statefulset`. | +| controllers.main.statefulset.podManagementPolicy | string | `nil` | Set podManagementPolicy, valid values are Parallel and OrderedReady (default). | +| controllers.main.statefulset.volumeClaimTemplates | list | `[]` | Used to create individual disks for each instance. | +| controllers.main.strategy | string | `nil` | Set the controller upgrade strategy For Deployments, valid values are Recreate (default) and RollingUpdate. For StatefulSets, valid values are OnDelete and RollingUpdate (default). DaemonSets/CronJobs/Jobs ignore this. | +| controllers.main.type | string | `"deployment"` | Set the controller type. Valid options are deployment, daemonset, statefulset, cronjob or job | +| defaultPodOptions | object | `{"affinity":{},"annotations":{},"automountServiceAccountToken":true,"dnsConfig":{},"dnsPolicy":null,"enableServiceLinks":true,"hostAliases":[],"hostIPC":false,"hostNetwork":false,"hostPID":false,"hostname":null,"imagePullSecrets":[],"labels":{},"nodeSelector":{},"priorityClassName":null,"restartPolicy":null,"runtimeClassName":null,"schedulerName":null,"securityContext":{},"terminationGracePeriodSeconds":null,"tolerations":[],"topologySpreadConstraints":[]}` | Set default options for all controllers / pods here Each of these options can be overridden on a Controller level | +| defaultPodOptions.affinity | object | `{}` | Defines affinity constraint rules. [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity) | +| defaultPodOptions.annotations | object | `{}` | Set annotations on the Pod. Pod-specific values will be merged with this. | +| defaultPodOptions.automountServiceAccountToken | bool | `true` | Specifies whether a service account token should be automatically mounted. | +| defaultPodOptions.dnsConfig | object | `{}` | Configuring the ndots option may resolve nslookup issues on some Kubernetes setups. | +| defaultPodOptions.dnsPolicy | string | `nil` | Defaults to "ClusterFirst" if hostNetwork is false and "ClusterFirstWithHostNet" if hostNetwork is true. | +| defaultPodOptions.enableServiceLinks | bool | `true` | Enable/disable the generation of environment variables for services. [[ref]](https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#accessing-the-service) | +| defaultPodOptions.hostAliases | list | `[]` | Use hostAliases to add custom entries to /etc/hosts - mapping IP addresses to hostnames. [[ref]](https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/) | +| defaultPodOptions.hostIPC | bool | `false` | Use the host's ipc namespace | +| defaultPodOptions.hostNetwork | bool | `false` | When using hostNetwork make sure you set dnsPolicy to `ClusterFirstWithHostNet` | +| defaultPodOptions.hostPID | bool | `false` | Use the host's pid namespace | +| defaultPodOptions.hostname | string | `nil` | Allows specifying explicit hostname setting | +| defaultPodOptions.imagePullSecrets | list | `[]` | Set image pull secrets | +| defaultPodOptions.labels | object | `{}` | Set labels on the Pod. Pod-specific values will be merged with this. | +| defaultPodOptions.nodeSelector | object | `{}` | Node selection constraint [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector) | +| defaultPodOptions.priorityClassName | string | `nil` | Custom priority class for different treatment by the scheduler | +| defaultPodOptions.restartPolicy | string | `Always`. When `controller.type` is `cronjob` it defaults to `Never`. | Set Container restart policy. | +| defaultPodOptions.runtimeClassName | string | `nil` | Allow specifying a runtimeClassName other than the default one (ie: nvidia) | +| defaultPodOptions.schedulerName | string | `nil` | Allows specifying a custom scheduler name | +| defaultPodOptions.securityContext | object | `{}` | Configure the Security Context for the Pod | +| defaultPodOptions.terminationGracePeriodSeconds | string | `nil` | [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle)] | +| defaultPodOptions.tolerations | list | `[]` | Specify taint tolerations [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) | +| defaultPodOptions.topologySpreadConstraints | list | `[]` | Defines topologySpreadConstraint rules. [[ref]](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) | +| global.annotations | object | `{}` | Set additional global annotations. Helm templates can be used. | +| global.fullnameOverride | string | `nil` | Set the entire name definition | +| global.labels | object | `{}` | Set additional global labels. Helm templates can be used. | +| global.nameOverride | string | `nil` | Set an override for the prefix of the fullname | +| ingress | object | See below | Configure the ingresses for the chart here. Additional ingresses can be added by adding a dictionary key similar to the 'main' ingress. | +| ingress.main.annotations | object | `{}` | Provide additional annotations which may be required. | +| ingress.main.className | string | `nil` | Set the ingressClass that is used for this ingress. | +| ingress.main.defaultBackend | string | `nil` | Configure the defaultBackend for this ingress. This will disable any other rules for the ingress. | +| ingress.main.enabled | bool | `false` | Enables or disables the ingress | +| ingress.main.hosts[0].host | string | `"chart-example.local"` | Host address. Helm template can be passed. | +| ingress.main.hosts[0].paths[0].path | string | `"/"` | Path. Helm template can be passed. | +| ingress.main.hosts[0].paths[0].service.name | string | `"main"` | Overrides the service name reference for this path This can be an actual service name, or reference a service identifier from this values.yaml | +| ingress.main.hosts[0].paths[0].service.port | string | `nil` | Overrides the service port number reference for this path | +| ingress.main.labels | object | `{}` | Provide additional labels which may be required. | +| ingress.main.nameOverride | string | `nil` | Override the name suffix that is used for this ingress. | +| ingress.main.primary | bool | `true` | Make this the primary ingress (used in probes, notes, etc...). If there is more than 1 ingress, make sure that only 1 ingress is marked as primary. | +| ingress.main.tls | list | `[]` | Configure TLS for the ingress. Both secretName and hosts can process a Helm template. | +| networkpolicies | object | See below | Configure the networkPolicies for the chart here. Additional networkPolicies can be added by adding a dictionary key similar to the 'main' networkPolicy. | +| networkpolicies.main.controller | string | `"main"` | Configure which controller this networkPolicy should target | +| networkpolicies.main.enabled | bool | `false` | Enables or disables the networkPolicy item. Defaults to true | +| networkpolicies.main.policyTypes | list | `["Ingress","Egress"]` | The policyTypes for this networkPolicy | +| networkpolicies.main.rules | object | `{"egress":[{}],"ingress":[{}]}` | The rulesets for this networkPolicy [[ref]](https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource) | +| networkpolicies.main.rules.egress | list | `[{}]` | The egress rules for this networkPolicy. Allows all egress traffic by default. | +| networkpolicies.main.rules.ingress | list | `[{}]` | The ingress rules for this networkPolicy. Allows all ingress traffic by default. | +| persistence | object | See below | Configure persistence for the chart here. Additional items can be added by adding a dictionary key similar to the 'config' key. [[ref]](https://bjw-s.github.io/helm-charts/docs/common-library/common-library-storage) | +| persistence.config.accessMode | string | `"ReadWriteOnce"` | AccessMode for the persistent volume. Make sure to select an access mode that is supported by your storage provider! [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes) | +| persistence.config.advancedMounts | object | `{}` | Explicitly configure mounts for specific controllers and containers. Example: advancedMounts: main: # the controller with the "main" identifier main: # the container with the "main" identifier - path: /data/config.yaml readOnly: true mountPropagation: None subPath: config.yaml second-container: # the container with the "second-container" identifier - path: /appdata/config readOnly: true second-controller: # the controller with the "second-controller" identifier main: # the container with the "main" identifier - path: /data/config.yaml readOnly: false subPath: config.yaml | +| persistence.config.dataSource | object | `{}` | The optional data source for the persistentVolumeClaim. [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-populators-and-data-sources) | +| persistence.config.dataSourceRef | object | `{}` | The optional volume populator for the persistentVolumeClaim. [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-populators-and-data-sources) | +| persistence.config.enabled | bool | `false` | Enables or disables the persistence item. Defaults to true | +| persistence.config.existingClaim | string | `nil` | If you want to reuse an existing claim, the name of the existing PVC can be passed here. | +| persistence.config.globalMounts | list | `[]` | Configure mounts to all controllers and containers. By default the persistence item will be mounted to `/`. Example: globalMounts: - path: /config readOnly: false | +| persistence.config.retain | bool | `false` | Set to true to retain the PVC upon `helm uninstall` | +| persistence.config.size | string | `"1Gi"` | The amount of storage that is requested for the persistent volume. | +| persistence.config.storageClass | string | `nil` | Storage Class for the config volume. If set to `-`, dynamic provisioning is disabled. If set to something else, the given storageClass is used. If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. | +| persistence.config.type | string | `"persistentVolumeClaim"` | Sets the persistence type Valid options are persistentVolumeClaim, emptyDir, nfs, hostPath, secret, configMap or custom | +| route | object | See below | Configure the gateway routes for the chart here. Additional routes can be added by adding a dictionary key similar to the 'main' route. [[ref]](https://gateway-api.sigs.k8s.io/references/spec/) | +| route.main.annotations | object | `{}` | Provide additional annotations which may be required. | +| route.main.enabled | bool | `false` | Enables or disables the route | +| route.main.hostnames | list | `[]` | Host addresses. Helm template can be passed. | +| route.main.kind | string | `"HTTPRoute"` | Set the route kind Valid options are GRPCRoute, HTTPRoute, TCPRoute, TLSRoute, UDPRoute | +| route.main.labels | object | `{}` | Provide additional labels which may be required. | +| route.main.nameOverride | string | `nil` | Override the name suffix that is used for this route. | +| route.main.parentRefs | list | `[{"group":"gateway.networking.k8s.io","kind":"Gateway","name":null,"namespace":null,"sectionName":null}]` | Configure the resource the route attaches to. | +| route.main.rules | list | `[{"backendRefs":[],"filters":[],"matches":[{"path":{"type":"PathPrefix","value":"/"}}],"timeouts":{}}]` | Configure rules for routing. Defaults to the primary service. | +| route.main.rules[0].backendRefs | list | `[]` | Configure backends where matching requests should be sent. | +| secrets | object | See below | Use this to populate secrets with the values you specify. Be aware that these values are not encrypted by default, and could therefore visible to anybody with access to the values.yaml file. Additional Secrets can be added by adding a dictionary key similar to the 'secret' object. | +| secrets.secret.annotations | object | `{}` | Annotations to add to the Secret | +| secrets.secret.enabled | bool | `false` | Enables or disables the Secret | +| secrets.secret.labels | object | `{}` | Labels to add to the Secret | +| secrets.secret.stringData | object | `{}` | Secret stringData content. Helm template enabled. | +| service | object | See below | Configure the services for the chart here. Additional services can be added by adding a dictionary key similar to the 'main' service. | +| service.main.annotations | object | `{}` | Provide additional annotations which may be required. | +| service.main.controller | string | `"main"` | Configure which controller this service should target | +| service.main.enabled | bool | `true` | Enables or disables the service | +| service.main.externalTrafficPolicy | string | `nil` | [[ref](https://kubernetes.io/docs/tutorials/services/source-ip/)] | +| service.main.extraSelectorLabels | object | `{}` | Allow adding additional match labels | +| service.main.ipFamilies | list | `[]` | The ip families that should be used. Options: IPv4, IPv6 | +| service.main.ipFamilyPolicy | string | `nil` | Specify the ip policy. Options: SingleStack, PreferDualStack, RequireDualStack | +| service.main.labels | object | `{}` | Provide additional labels which may be required. | +| service.main.nameOverride | string | `nil` | Override the name suffix that is used for this service | +| service.main.ports | object | See below | Configure the Service port information here. Additional ports can be added by adding a dictionary key similar to the 'http' service. | +| service.main.ports.http.appProtocol | string | `nil` | Specify the appProtocol value for the Service. [[ref]](https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol) | +| service.main.ports.http.enabled | bool | `true` | Enables or disables the port | +| service.main.ports.http.nodePort | string | `nil` | Specify the nodePort value for the LoadBalancer and NodePort service types. [[ref]](https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport) | +| service.main.ports.http.port | string | `nil` | The port number | +| service.main.ports.http.primary | bool | `true` | Make this the primary port (used in probes, notes, etc...) If there is more than 1 service, make sure that only 1 port is marked as primary. | +| service.main.ports.http.protocol | string | `"HTTP"` | Port protocol. Support values are `HTTP`, `HTTPS`, `TCP` and `UDP`. HTTP and HTTPS spawn a TCP service and get used for internal URL and name generation | +| service.main.ports.http.targetPort | string | `nil` | Specify a service targetPort if you wish to differ the service port from the application port. If `targetPort` is specified, this port number is used in the container definition instead of the `port` value. Therefore named ports are not supported for this field. | +| service.main.primary | bool | `true` | Make this the primary service for this controller (used in probes, notes, etc...). If there is more than 1 service targeting the controller, make sure that only 1 service is marked as primary. | +| service.main.type | string | `"ClusterIP"` | Set the service type | +| serviceAccount.annotations | object | `{}` | Annotations to add to the service account | +| serviceAccount.create | bool | `false` | Specifies whether a service account should be created | +| serviceAccount.labels | object | `{}` | Labels to add to the service account | +| serviceAccount.name | string | `""` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template | +| serviceMonitor | object | See below | Configure the ServiceMonitors for the chart here. Additional ServiceMonitors can be added by adding a dictionary key similar to the 'main' ServiceMonitors. | +| serviceMonitor.main.annotations | object | `{}` | Provide additional annotations which may be required. | +| serviceMonitor.main.enabled | bool | `false` | Enables or disables the serviceMonitor. | +| serviceMonitor.main.endpoints | list | See values.yaml | Configures the endpoints for the serviceMonitor. | +| serviceMonitor.main.labels | object | `{}` | Provide additional labels which may be required. | +| serviceMonitor.main.nameOverride | string | `nil` | Override the name suffix that is used for this serviceMonitor. | +| serviceMonitor.main.selector | object | `{}` | Configures a custom selector for the serviceMonitor, this takes precedence over specifying a service name. Helm templates can be used. | +| serviceMonitor.main.serviceName | string | `"{{ include \"bjw-s.common.lib.chart.names.fullname\" $ }}"` | Configures the target Service for the serviceMonitor. Helm templates can be used. | +| serviceMonitor.main.targetLabels | list | `[]` | Configures custom targetLabels for the serviceMonitor. (All collected meterics will have these labels, taking the value from the target service) [[ref]](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#servicemonitorspec/) | + +
+ +## Support + +- See the [Docs](http://bjw-s.github.io/helm-charts/docs/) +- Open an [issue](https://github.com/bjw-s/helm-charts/issues/new/choose) +- Join the k8s-at-home [Discord](https://discord.gg/k8s-at-home) community + +---------------------------------------------- +Autogenerated from chart metadata using [helm-docs v1.11.3](https://github.com/norwoodj/helm-docs/releases/v1.11.3) diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_configmap.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_configmap.tpl new file mode 100644 index 000000000..3aa492e62 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/classes/_configmap.tpl @@ -0,0 +1,32 @@ +{{/* +This template serves as a blueprint for all configMap objects that are created +within the common library. +*/}} +{{- define "bjw-s.common.class.configMap" -}} + {{- $rootContext := .rootContext -}} + {{- $configMapObject := .object -}} + + {{- $labels := merge + ($configMapObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($configMapObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ $configMapObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +data: + {{- with $configMapObject.data }} + {{- tpl (toYaml .) $rootContext | nindent 2 }} + {{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_cronjob.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_cronjob.tpl new file mode 100644 index 000000000..829f54fc0 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/classes/_cronjob.tpl @@ -0,0 +1,61 @@ +{{/* +This template serves as a blueprint for Cronjob objects that are created +using the common library. +*/}} +{{- define "bjw-s.common.class.cronjob" -}} + {{- $rootContext := .rootContext -}} + {{- $cronjobObject := .object -}} + + {{- $timeZone := "" -}} + {{- if ge (int $rootContext.Capabilities.KubeVersion.Minor) 27 }} + {{- $timeZone = dig "cronjob" "timeZone" "" $cronjobObject -}} + {{- end -}} + + {{- $labels := merge + (dict "app.kubernetes.io/component" $cronjobObject.identifier) + ($cronjobObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($cronjobObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: batch/v1 +kind: CronJob +metadata: + name: {{ $cronjobObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + {{- with $cronjobObject.cronjob.suspend }} + suspend: {{ ternary "true" "false" . }} + {{- end }} + concurrencyPolicy: "{{ $cronjobObject.cronjob.concurrencyPolicy }}" + startingDeadlineSeconds: {{ $cronjobObject.cronjob.startingDeadlineSeconds }} + {{- with $timeZone }} + timeZone: "{{ . }}" + {{- end }} + schedule: "{{ $cronjobObject.cronjob.schedule }}" + successfulJobsHistoryLimit: {{ $cronjobObject.cronjob.successfulJobsHistory }} + failedJobsHistoryLimit: {{ $cronjobObject.cronjob.failedJobsHistory }} + jobTemplate: + spec: + {{- with $cronjobObject.cronjob.ttlSecondsAfterFinished }} + ttlSecondsAfterFinished: {{ . }} + {{- end }} + backoffLimit: {{ $cronjobObject.cronjob.backoffLimit }} + template: + metadata: + {{- with (include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $cronjobObject)) }} + annotations: {{ . | nindent 12 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $cronjobObject)) }} + labels: {{ . | nindent 12 }} + {{- end }} + spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $cronjobObject) | nindent 10 }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_daemonset.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_daemonset.tpl new file mode 100644 index 000000000..cdb26fb84 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/classes/_daemonset.tpl @@ -0,0 +1,40 @@ +{{/* +This template serves as the blueprint for the DaemonSet objects that are created +within the common library. +*/}} +{{- define "bjw-s.common.class.daemonset" -}} + {{- $rootContext := .rootContext -}} + {{- $daemonsetObject := .object -}} + + {{- $labels := merge + (dict "app.kubernetes.io/component" $daemonsetObject.identifier) + ($daemonsetObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($daemonsetObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: {{ $daemonsetObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + revisionHistoryLimit: {{ $daemonsetObject.revisionHistoryLimit }} + selector: + matchLabels: + app.kubernetes.io/component: {{ $daemonsetObject.identifier }} + {{- include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | nindent 6 }} + template: + metadata: + annotations: {{ include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $daemonsetObject) | nindent 8 }} + labels: {{ include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $daemonsetObject) | nindent 8 }} + spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $daemonsetObject) | nindent 6 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_deployment.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_deployment.tpl new file mode 100644 index 000000000..ee0a829c4 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/classes/_deployment.tpl @@ -0,0 +1,60 @@ +{{/* +This template serves as a blueprint for Deployment objects that are created +using the common library. +*/}} +{{- define "bjw-s.common.class.deployment" -}} + {{- $rootContext := .rootContext -}} + {{- $deploymentObject := .object -}} + + {{- $labels := merge + (dict "app.kubernetes.io/component" $deploymentObject.identifier) + ($deploymentObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($deploymentObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ $deploymentObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + revisionHistoryLimit: {{ $deploymentObject.revisionHistoryLimit }} + {{- if not (eq $deploymentObject.replicas nil) }} + replicas: {{ $deploymentObject.replicas }} + {{- end }} + strategy: + type: {{ $deploymentObject.strategy }} + {{- with $deploymentObject.rollingUpdate }} + {{- if and (eq $deploymentObject.strategy "RollingUpdate") (or .surge .unavailable) }} + rollingUpdate: + {{- with .unavailable }} + maxUnavailable: {{ . }} + {{- end }} + {{- with .surge }} + maxSurge: {{ . }} + {{- end }} + {{- end }} + {{- end }} + selector: + matchLabels: + app.kubernetes.io/component: {{ $deploymentObject.identifier }} + {{- include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | nindent 6 }} + template: + metadata: + {{- with (include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $deploymentObject)) }} + annotations: {{ . | nindent 8 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $deploymentObject)) }} + labels: {{ . | nindent 8 }} + {{- end }} + spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $deploymentObject) | nindent 6 }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_ingress.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_ingress.tpl new file mode 100644 index 000000000..841cd33e2 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/classes/_ingress.tpl @@ -0,0 +1,85 @@ +{{/* +This template serves as a blueprint for all Ingress objects that are created +within the common library. +*/}} + +{{- define "bjw-s.common.class.ingress" -}} + {{- $rootContext := .rootContext -}} + {{- $ingressObject := .object -}} + + {{- $labels := merge + ($ingressObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($ingressObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ $ingressObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + {{- if $ingressObject.className }} + ingressClassName: {{ $ingressObject.className }} + {{- end }} + {{- if $ingressObject.tls }} + tls: + {{- range $ingressObject.tls }} + - hosts: + {{- range .hosts }} + - {{ tpl . $rootContext | quote }} + {{- end }} + {{- $secretName := tpl (default "" .secretName) $rootContext }} + {{- if $secretName }} + secretName: {{ $secretName | quote}} + {{- end }} + {{- end }} + {{- end }} + {{- if $ingressObject.defaultBackend }} + defaultBackend: {{ $ingressObject.defaultBackend }} + {{- else }} + rules: + {{- range $ingressObject.hosts }} + - host: {{ tpl .host $rootContext | quote }} + http: + paths: + {{- range .paths }} + - path: {{ tpl .path $rootContext | quote }} + pathType: {{ default "Prefix" .pathType }} + backend: + service: + {{ $service := include "bjw-s.common.lib.service.getByIdentifier" (dict "rootContext" $rootContext "id" .service.name) | fromYaml -}} + {{ $servicePort := 0 -}} + + {{ if empty (dig "port" nil .service) -}} + {{/* Default to the Service primary port if no port has been specified */ -}} + {{ if $service -}} + {{ $defaultServicePort := include "bjw-s.common.lib.service.primaryPort" (dict "rootContext" $rootContext "serviceObject" $service) | fromYaml -}} + {{ if $defaultServicePort -}} + {{ $servicePort = $defaultServicePort.port -}} + {{ end -}} + {{ end -}} + {{ else -}} + {{/* If a port number is given, use that */ -}} + {{ if kindIs "float64" .service.port -}} + {{ $servicePort = .service.port -}} + {{ else if kindIs "string" .service.port -}} + {{/* If a port name is given, try to resolve to a number */ -}} + {{ $servicePort = include "bjw-s.common.lib.service.getPortNumberByName" (dict "rootContext" $rootContext "serviceID" .service.name "portName" .service.port) -}} + {{ end -}} + {{ end -}} + name: {{ default .service.name $service.name }} + port: + number: {{ $servicePort }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_job.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_job.tpl new file mode 100644 index 000000000..9c8a99ece --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/classes/_job.tpl @@ -0,0 +1,46 @@ +{{/* +This template serves as the blueprint for the job objects that are created +within the common library. +*/}} +{{- define "bjw-s.common.class.job" -}} + {{- $rootContext := .rootContext -}} + {{- $jobObject := .object -}} + + {{- $labels := merge + (dict "app.kubernetes.io/component" $jobObject.identifier) + ($jobObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($jobObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ $jobObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + {{- with $jobObject.job.suspend }} + suspend: {{ ternary "true" "false" . }} + {{- end }} + {{- with $jobObject.job.ttlSecondsAfterFinished }} + ttlSecondsAfterFinished: {{ . }} + {{- end }} + backoffLimit: {{ $jobObject.job.backoffLimit }} + template: + metadata: + {{- with (include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $jobObject)) }} + annotations: {{ . | nindent 8 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $jobObject)) }} + labels: {{ . | nindent 8 }} + {{- end }} + spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $jobObject) | nindent 6 }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_networkpolicy.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_networkpolicy.tpl new file mode 100644 index 000000000..0854d145e --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/classes/_networkpolicy.tpl @@ -0,0 +1,49 @@ +{{/* +This template serves as a blueprint for all networkPolicy objects that are created +within the common library. +*/}} +{{- define "bjw-s.common.class.networkpolicy" -}} + {{- $rootContext := .rootContext -}} + {{- $networkPolicyObject := .object -}} + + {{- $labels := merge + ($networkPolicyObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($networkPolicyObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} + {{- $podSelector := dict -}} + {{- if (hasKey $networkPolicyObject "podSelector") -}} + {{- $podSelector = $networkPolicyObject.podSelector -}} + {{- else -}} + {{- $podSelector = dict "matchLabels" (merge + ($networkPolicyObject.extraSelectorLabels | default dict) + (dict "app.kubernetes.io/component" $networkPolicyObject.controller) + (include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | fromYaml) + ) -}} + {{- end -}} +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: {{ $networkPolicyObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + podSelector: {{- toYaml $podSelector | nindent 4 }} + {{- with $networkPolicyObject.policyTypes }} + policyTypes: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $networkPolicyObject.rules.ingress }} + ingress: {{- tpl (toYaml .) $rootContext | nindent 4 -}} + {{- end }} + {{- with $networkPolicyObject.rules.egress }} + egress: {{- tpl (toYaml .) $rootContext | nindent 4 -}} + {{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_pvc.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_pvc.tpl new file mode 100644 index 000000000..1c6ee9c17 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/classes/_pvc.tpl @@ -0,0 +1,53 @@ +{{/* +This template serves as a blueprint for all PersistentVolumeClaim objects that are created +within the common library. +*/}} +{{- define "bjw-s.common.class.pvc" -}} + {{- $rootContext := .rootContext -}} + {{- $pvcObject := .object -}} + + {{- $labels := merge + ($pvcObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($pvcObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} + {{- if $pvcObject.retain }} + {{- $annotations = merge + (dict "helm.sh/resource-policy" "keep") + $annotations + -}} + {{- end -}} + +--- +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: {{ $pvcObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + accessModes: + - {{ required (printf "accessMode is required for PVC %v" $pvcObject.name) $pvcObject.accessMode | quote }} + resources: + requests: + storage: {{ required (printf "size is required for PVC %v" $pvcObject.name) $pvcObject.size | quote }} + {{- if $pvcObject.storageClass }} + storageClassName: {{ if (eq "-" $pvcObject.storageClass) }}""{{- else }}{{ $pvcObject.storageClass | quote }}{{- end }} + {{- end }} + {{- if $pvcObject.volumeName }} + volumeName: {{ $pvcObject.volumeName | quote }} + {{- end }} + {{- with $pvcObject.dataSource }} + dataSource: {{- tpl (toYaml .) $rootContext | nindent 10 }} + {{- end }} + {{- with $pvcObject.dataSourceRef }} + dataSourceRef: {{- tpl (toYaml .) $rootContext | nindent 10 }} + {{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_route.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_route.tpl new file mode 100644 index 000000000..123bc5fef --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/classes/_route.tpl @@ -0,0 +1,86 @@ +{{/* +This template serves as a blueprint for all Route objects that are created +within the common library. +*/}} +{{- define "bjw-s.common.class.route" -}} + {{- $rootContext := .rootContext -}} + {{- $routeObject := .object -}} + + {{- $routeKind := $routeObject.kind | default "HTTPRoute" -}} + {{- $apiVersion := "gateway.networking.k8s.io/v1alpha2" -}} + {{- if $rootContext.Capabilities.APIVersions.Has (printf "gateway.networking.k8s.io/v1beta1/%s" $routeKind) }} + {{- $apiVersion = "gateway.networking.k8s.io/v1beta1" -}} + {{- end -}} + {{- if $rootContext.Capabilities.APIVersions.Has (printf "gateway.networking.k8s.io/v1/%s" $routeKind) }} + {{- $apiVersion = "gateway.networking.k8s.io/v1" -}} + {{- end -}} + {{- $labels := merge + ($routeObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($routeObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: {{ $apiVersion }} +kind: {{ $routeKind }} +metadata: + name: {{ $routeObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + parentRefs: + {{- range $routeObject.parentRefs }} + - group: {{ default "gateway.networking.k8s.io" .group }} + kind: {{ default "Gateway" .kind }} + name: {{ required (printf "parentRef name is required for %v %v" $routeKind $routeObject.name) .name }} + namespace: {{ required (printf "parentRef namespace is required for %v %v" $routeKind $routeObject.name) .namespace }} + {{- if .sectionName }} + sectionName: {{ .sectionName | quote }} + {{- end }} + {{- end }} + {{- if and (ne $routeKind "TCPRoute") (ne $routeKind "UDPRoute") $routeObject.hostnames }} + hostnames: + {{- range $routeObject.hostnames }} + - {{ tpl . $rootContext | quote }} + {{- end }} + {{- end }} + rules: + {{- range $routeObject.rules }} + - backendRefs: + {{- range .backendRefs }} + {{ $service := include "bjw-s.common.lib.service.getByIdentifier" (dict "rootContext" $rootContext "id" .name) | fromYaml -}} + {{ $servicePrimaryPort := dict -}} + {{ if $service -}} + {{ $servicePrimaryPort = include "bjw-s.common.lib.service.primaryPort" (dict "rootContext" $rootContext "serviceObject" $service) | fromYaml -}} + {{- end }} + - group: {{ default "" .group | quote}} + kind: {{ default "Service" .kind }} + name: {{ default .name $service.name }} + namespace: {{ default $rootContext.Release.Namespace .namespace }} + port: {{ default .port $servicePrimaryPort.port }} + weight: {{ default 1 .weight }} + {{- end }} + {{- if or (eq $routeKind "HTTPRoute") (eq $routeKind "GRPCRoute") }} + {{- with .matches }} + matches: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .filters }} + filters: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- end }} + {{- if (eq $routeKind "HTTPRoute") }} + {{- with .timeouts }} + timeouts: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_secret.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_secret.tpl new file mode 100644 index 000000000..a46fe534d --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/classes/_secret.tpl @@ -0,0 +1,39 @@ +{{/* +This template serves as a blueprint for all Secret objects that are created +within the common library. +*/}} +{{- define "bjw-s.common.class.secret" -}} + {{- $rootContext := .rootContext -}} + {{- $secretObject := .object -}} + + {{- $labels := merge + ($secretObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($secretObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} + + {{- $stringData := "" -}} + {{- with $secretObject.stringData -}} + {{- $stringData = (toYaml $secretObject.stringData) | trim -}} + {{- end -}} +--- +apiVersion: v1 +kind: Secret +{{- with $secretObject.type }} +type: {{ . }} +{{- end }} +metadata: + name: {{ $secretObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +{{- with $stringData }} +stringData: {{- tpl $stringData $rootContext | nindent 2 }} +{{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_service.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_service.tpl new file mode 100644 index 000000000..223e82b7f --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/classes/_service.tpl @@ -0,0 +1,104 @@ +{{/* +This template serves as a blueprint for all Service objects that are created +within the common library. +*/}} +{{- define "bjw-s.common.class.service" -}} + {{- $rootContext := .rootContext -}} + {{- $serviceObject := .object -}} + + {{- $svcType := $serviceObject.type | default "" -}} + {{- $enabledPorts := include "bjw-s.common.lib.service.enabledPorts" (dict "rootContext" $rootContext "serviceObject" $serviceObject) | fromYaml }} + {{- $labels := merge + (dict "app.kubernetes.io/service" $serviceObject.name) + ($serviceObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($serviceObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ $serviceObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + {{- if (or (eq $svcType "ClusterIP") (empty $svcType)) }} + type: ClusterIP + {{- if $serviceObject.clusterIP }} + clusterIP: {{ $serviceObject.clusterIP }} + {{end}} + {{- else if eq $svcType "LoadBalancer" }} + type: {{ $svcType }} + {{- if $serviceObject.loadBalancerIP }} + loadBalancerIP: {{ $serviceObject.loadBalancerIP }} + {{- end }} + {{- if $serviceObject.loadBalancerSourceRanges }} + loadBalancerSourceRanges: + {{ toYaml $serviceObject.loadBalancerSourceRanges | nindent 4 }} + {{- end -}} + {{- else }} + type: {{ $svcType }} + {{- end }} + {{- if $serviceObject.externalTrafficPolicy }} + externalTrafficPolicy: {{ $serviceObject.externalTrafficPolicy }} + {{- end }} + {{- if hasKey $serviceObject "allocateLoadBalancerNodePorts" }} + allocateLoadBalancerNodePorts: {{ $serviceObject.allocateLoadBalancerNodePorts }} + {{- end }} + {{- if $serviceObject.sessionAffinity }} + sessionAffinity: {{ $serviceObject.sessionAffinity }} + {{- if $serviceObject.sessionAffinityConfig }} + sessionAffinityConfig: + {{ toYaml $serviceObject.sessionAffinityConfig | nindent 4 }} + {{- end -}} + {{- end }} + {{- with $serviceObject.externalIPs }} + externalIPs: + {{- toYaml . | nindent 4 }} + {{- end }} + {{- if $serviceObject.publishNotReadyAddresses }} + publishNotReadyAddresses: {{ $serviceObject.publishNotReadyAddresses }} + {{- end }} + {{- if $serviceObject.ipFamilyPolicy }} + ipFamilyPolicy: {{ $serviceObject.ipFamilyPolicy }} + {{- end }} + {{- with $serviceObject.ipFamilies }} + ipFamilies: + {{ toYaml . | nindent 4 }} + {{- end }} + ports: + {{- range $name, $port := $enabledPorts }} + - port: {{ $port.port }} + targetPort: {{ $port.targetPort | default $port.port }} + {{- if $port.protocol }} + {{- if or ( eq $port.protocol "HTTP" ) ( eq $port.protocol "HTTPS" ) ( eq $port.protocol "TCP" ) }} + protocol: TCP + {{- else }} + protocol: {{ $port.protocol }} + {{- end }} + {{- else }} + protocol: TCP + {{- end }} + name: {{ $name }} + {{- if (and (eq $svcType "NodePort") (not (empty $port.nodePort))) }} + nodePort: {{ $port.nodePort }} + {{ end }} + {{- if (not (empty $port.appProtocol)) }} + appProtocol: {{ $port.appProtocol }} + {{ end }} + {{- end -}} + {{- with (merge + ($serviceObject.extraSelectorLabels | default dict) + (dict "app.kubernetes.io/component" $serviceObject.controller) + (include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | fromYaml) + ) }} + selector: {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_serviceAccount.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_serviceAccount.tpl new file mode 100644 index 000000000..2b109ad0c --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/classes/_serviceAccount.tpl @@ -0,0 +1,30 @@ +{{/* +This template serves as a blueprint for ServiceAccount objects that are created +using the common library. +*/}} +{{- define "bjw-s.common.class.serviceAccount" -}} + {{- $rootContext := .rootContext -}} + {{- $serviceAccountObject := .object -}} + + {{- $labels := merge + ($serviceAccountObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($serviceAccountObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ $serviceAccountObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +secrets: + - name: {{ include "bjw-s.common.lib.chart.names.fullname" $rootContext }}-sa-token +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_serviceMonitor.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_serviceMonitor.tpl new file mode 100644 index 000000000..b14186081 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/classes/_serviceMonitor.tpl @@ -0,0 +1,37 @@ +{{- define "bjw-s.common.class.serviceMonitor" -}} + {{- $rootContext := .rootContext -}} + {{- $serviceMonitorObject := .object -}} + {{- $labels := merge + ($serviceMonitorObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($serviceMonitorObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ $serviceMonitorObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + selector: + {{- if $serviceMonitorObject.selector -}} + {{- tpl ($serviceMonitorObject.selector | toYaml) $rootContext | nindent 4}} + {{- else }} + matchLabels: + app.kubernetes.io/service: {{ tpl $serviceMonitorObject.serviceName $rootContext }} + {{- include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | nindent 6 }} + {{- end }} + endpoints: {{- toYaml $serviceMonitorObject.endpoints | nindent 4 }} + {{- if not (empty $serviceMonitorObject.targetLabels )}} + targetLabels: + {{- toYaml $serviceMonitorObject.targetLabels | nindent 4 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_statefulset.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_statefulset.tpl new file mode 100644 index 000000000..bdcf48a3f --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/classes/_statefulset.tpl @@ -0,0 +1,56 @@ +{{/* +This template serves as the blueprint for the StatefulSet objects that are created +within the common library. +*/}} +{{- define "bjw-s.common.class.statefulset" -}} + {{- $rootContext := .rootContext -}} + {{- $statefulsetObject := .object -}} + + {{- $labels := merge + (dict "app.kubernetes.io/component" $statefulsetObject.identifier) + ($statefulsetObject.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) + -}} + {{- $annotations := merge + ($statefulsetObject.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) + -}} +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ $statefulsetObject.name }} + {{- with $labels }} + labels: {{- toYaml . | nindent 4 -}} + {{- end }} + {{- with $annotations }} + annotations: {{- toYaml . | nindent 4 -}} + {{- end }} +spec: + revisionHistoryLimit: {{ $statefulsetObject.revisionHistoryLimit }} + replicas: {{ $statefulsetObject.replicas }} + podManagementPolicy: {{ dig "statefulset" "podManagementPolicy" "OrderedReady" $statefulsetObject }} + updateStrategy: + type: {{ $statefulsetObject.strategy }} + {{- if and (eq $statefulsetObject.strategy "RollingUpdate") (dig "rollingUpdate" "partition" nil $statefulsetObject) }} + rollingUpdate: + partition: {{ $statefulsetObject.rollingUpdate.partition }} + {{- end }} + selector: + matchLabels: + app.kubernetes.io/component: {{ $statefulsetObject.identifier }} + {{- include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | nindent 6 }} + serviceName: {{ include "bjw-s.common.lib.chart.names.fullname" $rootContext }} + template: + metadata: + {{- with (include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $statefulsetObject)) }} + annotations: {{ . | nindent 8 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $statefulsetObject)) }} + labels: {{ . | nindent 8 }} + {{- end }} + spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $statefulsetObject) | nindent 6 }} + {{- with (include "bjw-s.common.lib.statefulset.volumeclaimtemplates" (dict "rootContext" $rootContext "statefulsetObject" $statefulsetObject)) }} + volumeClaimTemplates: {{ . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_getMapItemsWithKey.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_getMapItemsWithKey.tpl new file mode 100644 index 000000000..0a65d4dc8 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_getMapItemsWithKey.tpl @@ -0,0 +1,17 @@ +{{/* +Returns the items in a map that have a certain key +*/}} +{{- define "bjw-s.common.lib.getMapItemsWithKey" -}} + {{- $map := .map -}} + {{- $keyToFind := .key -}} + {{- $output := dict -}} + + {{- if not (empty $keyToFind) -}} + {{- range $key, $item := $map -}} + {{- if not (empty (dig $keyToFind nil $item)) -}} + {{- $_ := set $output $key $item -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- $output | toYaml -}} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_kahn.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_kahn.tpl new file mode 100644 index 000000000..319a05c87 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_kahn.tpl @@ -0,0 +1,35 @@ +{{/* +Implementation of Kahn's algorithm based on +https://en.wikipedia.org/wiki/Topological_sorting#Kahn's_algorithm + +source: https://github.com/dastrobu/helm-charts/blob/main/environment-variables/templates/_kahn.tpl +*/}} +{{- define "bjw-s.common.lib.kahn" -}} + {{- $graph := .graph -}} + {{- if empty $graph -}} + {{- $_ := set . "out" list -}} + {{- else -}} + {{- $S := list -}} + + {{- range $node, $edges := $graph -}} + {{- if empty $edges -}} + {{- $S = append $S $node -}} + {{- end -}} + {{- end -}} + + {{- if empty $S -}} + {{- fail (printf "graph is cyclic or has bad edge definitions. Remaining graph is:\n%s" ( .graph | toYaml ) ) }} + {{- end -}} + + {{- $n := first $S -}} + {{- $_ := unset $graph $n -}} + + {{- range $node, $edges := $graph -}} + {{- $_ := set $graph $node ( without $edges $n ) -}} + {{- end -}} + + {{- $args := dict "graph" $graph "out" list -}} + {{- include "bjw-s.common.lib.kahn" $args -}} + {{- $_ = set . "out" ( concat ( list $n ) $args.out ) -}} + {{- end -}} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_names.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_names.tpl new file mode 100644 index 000000000..15725e512 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_names.tpl @@ -0,0 +1,35 @@ +{{/* Expand the name of the chart */}} +{{- define "bjw-s.common.lib.chart.names.name" -}} + {{- $globalNameOverride := get .Values.global "nameOverride" -}} + {{- $nameOverride := get .Values "nameOverride" -}} + {{- $name := $globalNameOverride | default $nameOverride | default .Chart.Name -}} + {{- $name | toString | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "bjw-s.common.lib.chart.names.fullname" -}} + {{- $name := include "bjw-s.common.lib.chart.names.name" . -}} + {{- $globalFullNameOverride := get .Values.global "fullnameOverride" -}} + {{- $fullNameOverride := get .Values "fullnameOverride" -}} + + {{- if or $fullNameOverride $globalFullNameOverride -}} + {{- $name = ($globalFullNameOverride | default $fullNameOverride) -}} + {{- else -}} + {{- if contains $name .Release.Name -}} + {{- $name = .Release.Name -}} + {{- else -}} + {{- $name = printf "%s-%s" .Release.Name $name -}} + {{- end -}} + {{- end -}} + + {{- $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* Create chart name and version as used by the chart label */}} +{{- define "bjw-s.common.lib.chart.names.chart" -}} + {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_getByIdentifier.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_getByIdentifier.tpl new file mode 100644 index 000000000..87b10a3b1 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_getByIdentifier.tpl @@ -0,0 +1,12 @@ +{{/* +Return a configMap Object by its Identifier. +*/}} +{{- define "bjw-s.common.lib.configMap.getByIdentifier" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + + {{- $configMapValues := dig $identifier nil $rootContext.Values.configMaps -}} + {{- if not (empty $configMapValues) -}} + {{- include "bjw-s.common.lib.configMap.valuesToObject" (dict "rootContext" $rootContext "id" $identifier "values" $configMapValues) -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_validate.tpl new file mode 100644 index 000000000..c61c70441 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_validate.tpl @@ -0,0 +1,7 @@ +{{/* +Validate configMap values +*/}} +{{- define "bjw-s.common.lib.configMap.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $configMapValues := .object -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_valuesToObject.tpl new file mode 100644 index 000000000..1cad88337 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_valuesToObject.tpl @@ -0,0 +1,24 @@ +{{/* +Convert configMap values to an object +*/}} +{{- define "bjw-s.common.lib.configMap.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Determine and inject the configMap name */ -}} + {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + + {{- if $objectValues.nameOverride -}} + {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} + {{- else -}} + {{- if ne $identifier "main" -}} + {{- $objectName = printf "%s-%s" $objectName $identifier -}} + {{- end -}} + {{- end -}} + {{- $_ := set $objectValues "name" $objectName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Return the configMap object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/_spec.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/_spec.tpl new file mode 100644 index 000000000..9dfd3d43c --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/_spec.tpl @@ -0,0 +1,54 @@ +{{- /* +The container definition included in the Pod. +*/ -}} +{{- define "bjw-s.common.lib.container.spec" -}} + {{- $rootContext := .rootContext -}} + {{- $controllerObject := .controllerObject -}} + {{- $containerObject := .containerObject -}} + {{- $ctx := dict "rootContext" $rootContext "controllerObject" $controllerObject "containerObject" $containerObject -}} + +name: {{ include "bjw-s.common.lib.container.field.name" (dict "ctx" $ctx) | trim }} +image: {{ include "bjw-s.common.lib.container.field.image" (dict "ctx" $ctx) | trim }} + {{- with $containerObject.image.pullPolicy }} +imagePullPolicy: {{ . | trim }} + {{- end -}} + {{- with (include "bjw-s.common.lib.container.field.command" (dict "ctx" $ctx) | trim) }} +command: {{ . | trim | nindent 2 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.container.field.args" (dict "ctx" $ctx) | trim) }} +args: {{ . | trim | nindent 2 }} + {{- end -}} + {{- with $containerObject.workingDir }} +workingDir: {{ . | trim }} + {{- end -}} + {{- with $containerObject.securityContext }} +securityContext: {{ toYaml . | trim | nindent 2 }} + {{- end -}} + {{- with $containerObject.lifecycle }} +lifecycle: {{ toYaml . | trim | nindent 2 }} + {{- end -}} + {{- with $containerObject.terminationMessagePath }} +terminationMessagePath: {{ . | trim }} + {{- end -}} + {{- with $containerObject.terminationMessagePolicy }} +terminationMessagePolicy: {{ . | trim }} + {{- end -}} + {{- with (include "bjw-s.common.lib.container.field.env" (dict "ctx" $ctx) | trim) }} +env: {{ . | trim | nindent 2 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.container.field.envFrom" (dict "ctx" $ctx) | trim) }} +envFrom: {{ . | trim | nindent 2 }} + {{- end -}} + {{- with $containerObject.ports }} +ports: {{ toYaml . | trim | nindent 2 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.container.field.probes" (dict "ctx" $ctx) | trim) }} + {{- . | trim | nindent 0 -}} + {{- end -}} + {{- with $containerObject.resources }} +resources: {{ toYaml . | trim | nindent 2 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.container.field.volumeMounts" (dict "ctx" $ctx) | trim) }} +volumeMounts: {{ . | trim | nindent 2 }} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/_validate.tpl new file mode 100644 index 000000000..6b3176bee --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/_validate.tpl @@ -0,0 +1,20 @@ +{{/* +Validate container values +*/}} +{{- define "bjw-s.common.lib.container.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $controllerObject := .controllerObject -}} + {{- $containerObject := .containerObject -}} + + {{- if not (kindIs "map" $containerObject.image) -}} + {{- fail (printf "Image required to be a dictionary with repository and tag fields. (controller %s, container %s)" $controllerObject.identifier $containerObject.identifier) }} + {{- end -}} + + {{- if empty (dig "image" "repository" nil $containerObject) -}} + {{- fail (printf "No image repository specified for container. (controller %s, container %s)" $controllerObject.identifier $containerObject.identifier) }} + {{- end -}} + + {{- if empty (dig "image" "tag" nil $containerObject) -}} + {{- fail (printf "No image tag specified for container. (controller %s, container %s)" $controllerObject.identifier $containerObject.identifier) }} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/_valuesToObject.tpl new file mode 100644 index 000000000..50b9e2f50 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/_valuesToObject.tpl @@ -0,0 +1,27 @@ +{{/* +Convert container values to an object +*/}} +{{- define "bjw-s.common.lib.container.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Process image tags */ -}} + {{- if kindIs "map" $objectValues.image -}} + {{- $imageTag := dig "image" "tag" "" $objectValues -}} + {{- /* Convert float64 image tags to string */ -}} + {{- if kindIs "float64" $imageTag -}} + {{- $imageTag = $imageTag | toString -}} + {{- end -}} + + {{- /* Process any templates in the tag */ -}} + {{- $imageTag = tpl $imageTag $rootContext -}} + + {{- $_ := set $objectValues.image "tag" $imageTag -}} + {{- end -}} + + {{- /* Return the container object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_args.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_args.tpl new file mode 100644 index 000000000..172e444ee --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_args.tpl @@ -0,0 +1,26 @@ +{{/* +Args used by the container. +*/}} +{{- define "bjw-s.common.lib.container.field.args" -}} + {{- $ctx := .ctx -}} + {{- $containerObject := $ctx.containerObject -}} + + {{- /* Default to empty list */ -}} + {{- $args := list -}} + + {{- /* See if an override is desired */ -}} + {{- if not (empty (get $containerObject "args")) -}} + {{- $option := get $containerObject "args" -}} + {{- if not (empty $option) -}} + {{- if kindIs "string" $option -}} + {{- $args = append $args $option -}} + {{- else -}} + {{- $args = $option -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- if not (empty $args) -}} + {{- $args | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_command.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_command.tpl new file mode 100644 index 000000000..67e3b65bc --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_command.tpl @@ -0,0 +1,26 @@ +{{/* +Command used by the container. +*/}} +{{- define "bjw-s.common.lib.container.field.command" -}} + {{- $ctx := .ctx -}} + {{- $containerObject := $ctx.containerObject -}} + + {{- /* Default to empty list */ -}} + {{- $command := list -}} + + {{- /* See if an override is desired */ -}} + {{- if not (empty (get $containerObject "command")) -}} + {{- $option := get $containerObject "command" -}} + {{- if not (empty $option) -}} + {{- if kindIs "string" $option -}} + {{- $command = append $command $option -}} + {{- else -}} + {{- $command = $option -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- if not (empty $command) -}} + {{- $command | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_env.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_env.tpl new file mode 100644 index 000000000..72973fb2a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_env.tpl @@ -0,0 +1,82 @@ +{{/* +Env field used by the container. +*/}} +{{- define "bjw-s.common.lib.container.field.env" -}} + {{- $ctx := .ctx -}} + {{- $rootContext := $ctx.rootContext -}} + {{- $containerObject := $ctx.containerObject -}} + + {{- /* Default to empty list */ -}} + {{- $envList := list -}} + + {{- /* See if an override is desired */ -}} + {{- if not (empty (get $containerObject "env")) -}} + {{- if kindIs "slice" $containerObject.env -}} + {{- /* Env is a list so we assume the order is already as desired */ -}} + {{- range $name, $var := $containerObject.env -}} + {{- if kindIs "int" $name -}} + {{- $name = required "environment variables as a list of maps require a name field" $var.name -}} + {{- end -}} + {{- end -}} + {{- $envList = $containerObject.env -}} + {{- else -}} + {{- /* Env is a map so we must check if ordering is desired */ -}} + {{- $graph := dict -}} + + {{- range $name, $var := $containerObject.env -}} + {{- if kindIs "map" $var -}} + {{- /* Value is a map so ordering can be specified */ -}} + {{- if empty (dig "dependsOn" nil $var) -}} + {{- $_ := set $graph $name ( list ) -}} + {{- else if kindIs "string" $var.dependsOn -}} + {{- $_ := set $graph $name ( list $var.dependsOn ) -}} + {{- else if kindIs "slice" $var.dependsOn -}} + {{- $_ := set $graph $name $var.dependsOn -}} + {{- end -}} + {{- else -}} + {{- /* Value is not a map so no ordering can be specified */ -}} + {{- $_ := set $graph $name ( list ) -}} + {{- end -}} + {{- end -}} + + {{- $args := dict "graph" $graph "out" list -}} + {{- include "bjw-s.common.lib.kahn" $args -}} + + {{- range $name := $args.out -}} + {{- $envItem := dict "name" $name -}} + {{- $envValue := get $containerObject.env $name -}} + + {{- if kindIs "map" $envValue -}} + {{- $envItem := merge $envItem (omit $envValue "dependsOn") -}} + {{- else -}} + {{- $_ := set $envItem "value" $envValue -}} + {{- end -}} + + {{- $envList = append $envList $envItem -}} + {{- end -}} + + {{- $args = dict -}} + {{- end -}} + {{- end -}} + + {{- if not (empty $envList) -}} + {{- $output := list -}} + {{- range $envList -}} + {{- if hasKey . "value" -}} + {{- if kindIs "string" .value -}} + {{- $output = append $output (dict "name" .name "value" (tpl .value $rootContext)) -}} + {{- else if or (kindIs "float64" .value) (kindIs "bool" .value) -}} + {{- $output = append $output (dict "name" .name "value" (.value | toString)) -}} + {{- else -}} + {{- $output = append $output (dict "name" .name "value" .value) -}} + {{- end -}} + {{- else if hasKey . "valueFrom" -}} + {{- $parsedValue := (tpl (.valueFrom | toYaml) $rootContext) | fromYaml -}} + {{- $output = append $output (dict "name" .name "valueFrom" $parsedValue) -}} + {{- else -}} + {{- $output = append $output (dict "name" .name "valueFrom" (omit . "name")) -}} + {{- end -}} + {{- end -}} + {{- $output | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_envFrom.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_envFrom.tpl new file mode 100644 index 000000000..84e731291 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_envFrom.tpl @@ -0,0 +1,58 @@ +{{/* +Env field used by the container. +*/}} +{{- define "bjw-s.common.lib.container.field.envFrom" -}} + {{- $ctx := .ctx -}} + {{- $rootContext := $ctx.rootContext -}} + {{- $containerObject := $ctx.containerObject -}} + + {{- if not (empty (get $containerObject "envFrom")) -}} + {{- $envFrom := list -}} + {{- range $containerObject.envFrom -}} + {{- $item := dict -}} + + {{- if hasKey . "configMap" -}} + {{- $configMap := include "bjw-s.common.lib.configMap.getByIdentifier" (dict "rootContext" $rootContext "id" .configMap) | fromYaml -}} + {{- $configMapName := default (tpl .configMap $rootContext) $configMap.name -}} + {{- $_ := set $item "configMapRef" (dict "name" $configMapName) -}} + {{- else if hasKey . "configMapRef" -}} + {{- if not (empty (dig "identifier" nil .configMapRef)) -}} + {{- $configMap := include "bjw-s.common.lib.configMap.getByIdentifier" (dict "rootContext" $rootContext "id" .configMapRef.identifier) | fromYaml -}} + {{- if empty $configMap -}} + {{- fail (printf "No configMap configured with identifier '%s'" .configMapRef.identifier) -}} + {{- end -}} + + {{- $_ := set $item "configMapRef" (dict "name" $configMap.name) -}} + {{- else -}} + {{- $_ := set $item "configMapRef" (dict "name" (tpl .configMapRef.name $rootContext)) -}} + {{- end -}} + + {{- else if hasKey . "secret" -}} + {{- $secret := include "bjw-s.common.lib.secret.getByIdentifier" (dict "rootContext" $rootContext "id" .secret) | fromYaml -}} + {{- $secretName := default (tpl .secret $rootContext) $secret.name -}} + {{- $_ := set $item "secretRef" (dict "name" $secretName) -}} + {{- else if hasKey . "secretRef" -}} + {{- if not (empty (dig "identifier" nil .secretRef)) -}} + {{- $secret := include "bjw-s.common.lib.secret.getByIdentifier" (dict "rootContext" $rootContext "id" .secretRef.identifier) | fromYaml -}} + {{- if empty $secret -}} + {{- fail (printf "No secret configured with identifier '%s'" .secretRef.identifier) -}} + {{- end -}} + + {{- $_ := set $item "secretRef" (dict "name" $secret.name) -}} + {{- else -}} + {{- $_ := set $item "secretRef" (dict "name" (tpl .secretRef.name $rootContext)) -}} + {{- end -}} + {{- end -}} + + {{- if not (empty (dig "prefix" nil .)) -}} + {{- $_ := set $item "prefix" .prefix -}} + {{- end -}} + + {{- if not (empty $item) -}} + {{- $envFrom = append $envFrom $item -}} + {{- end -}} + {{- end -}} + + {{- $envFrom | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_image.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_image.tpl new file mode 100644 index 000000000..327ea627d --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_image.tpl @@ -0,0 +1,15 @@ +{{/* +Image used by the container. +*/}} +{{- define "bjw-s.common.lib.container.field.image" -}} + {{- $ctx := .ctx -}} + {{- $rootContext := $ctx.rootContext -}} + {{- $containerObject := $ctx.containerObject -}} + + {{- $imageRepo := $containerObject.image.repository -}} + {{- $imageTag := $containerObject.image.tag -}} + + {{- if and $imageRepo $imageTag -}} + {{- printf "%s:%s" $imageRepo $imageTag -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_name.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_name.tpl new file mode 100644 index 000000000..7695f39b9 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_name.tpl @@ -0,0 +1,24 @@ +{{/* +Name used by the container. +*/}} +{{- define "bjw-s.common.lib.container.field.name" -}} + {{- $ctx := .ctx -}} + {{- $rootContext := $ctx.rootContext -}} + {{- $containerObject := $ctx.containerObject -}} + + {{- /* Default to container identifier */ -}} + {{- $name := $containerObject.identifier -}} + + {{- /* See if an override is desired */ -}} + {{- if hasKey $containerObject "nameOverride" -}} + {{- $option := get $containerObject "nameOverride" -}} + {{- if not (empty $option) -}} + {{- $name = $option -}} + {{- end -}} + {{- end -}} + + {{- /* Parse any templates */ -}} + {{- $name = tpl $name $rootContext -}} + + {{- $name | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_probes.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_probes.tpl new file mode 100644 index 000000000..5f6d60e10 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_probes.tpl @@ -0,0 +1,83 @@ +{{/* +Probes used by the container. +*/}} +{{- define "bjw-s.common.lib.container.field.probes" -}} + {{- $ctx := .ctx -}} + {{- $rootContext := $ctx.rootContext -}} + {{- $controllerObject := $ctx.controllerObject -}} + {{- $containerObject := $ctx.containerObject -}} + + {{- /* Default to empty dict */ -}} + {{- $enabledProbes := dict -}} + + {{- range $probeName, $probeValues := $containerObject.probes -}} + {{- /* Disable probe by default, but allow override */ -}} + {{- $probeEnabled := false -}} + {{- if hasKey $probeValues "enabled" -}} + {{- $probeEnabled = $probeValues.enabled -}} + {{- end -}} + + {{- if $probeEnabled -}} + {{- $probeDefinition := dict -}} + + {{- if $probeValues.custom -}} + {{- $parsedProbeSpec := tpl ($probeValues.spec | toYaml) $rootContext -}} + {{- $probeDefinition = $parsedProbeSpec | fromYaml -}} + {{- else -}} + {{- $primaryService := include "bjw-s.common.lib.service.primaryForController" (dict "rootContext" $rootContext "controllerIdentifier" $controllerObject.identifier) | fromYaml -}} + {{- $primaryServiceDefaultPort := dict -}} + {{- if $primaryService -}} + {{- $primaryServiceDefaultPort = include "bjw-s.common.lib.service.primaryPort" (dict "rootContext" $rootContext "serviceObject" $primaryService) | fromYaml -}} + {{- end -}} + {{- if $primaryServiceDefaultPort -}} + {{- $probeType := "" -}} + {{- if eq $probeValues.type "AUTO" -}} + {{- $probeType = $primaryServiceDefaultPort.protocol -}} + {{- else -}} + {{- $probeType = $probeValues.type | default "TCP" -}} + {{- end -}} + + {{- $_ := set $probeDefinition "initialDelaySeconds" $probeValues.spec.initialDelaySeconds -}} + {{- $_ := set $probeDefinition "failureThreshold" $probeValues.spec.failureThreshold -}} + {{- $_ := set $probeDefinition "timeoutSeconds" $probeValues.spec.timeoutSeconds -}} + {{- $_ := set $probeDefinition "periodSeconds" $probeValues.spec.periodSeconds -}} + + {{- $probeHeader := "" -}} + {{- if or ( eq $probeType "HTTPS" ) ( eq $probeType "HTTP" ) -}} + {{- $probeHeader = "httpGet" -}} + + {{- $_ := set $probeDefinition $probeHeader ( + dict + "path" $probeValues.path + "scheme" $probeType + ) + -}} + {{- else }} + {{- $probeHeader = "tcpSocket" -}} + {{- $_ := set $probeDefinition $probeHeader dict -}} + {{- end -}} + + {{- if $probeValues.port -}} + {{- if kindIs "float64" $probeValues.port -}} + {{- $_ := set (index $probeDefinition $probeHeader) "port" $probeValues.port -}} + {{- else if kindIs "string" $probeValues.port -}} + {{- $_ := set (index $probeDefinition $probeHeader) "port" (tpl ( $probeValues.port | toString ) $rootContext) -}} + {{- end -}} + {{- else if $primaryServiceDefaultPort.targetPort -}} + {{- $_ := set (index $probeDefinition $probeHeader) "port" $primaryServiceDefaultPort.targetPort -}} + {{- else -}} + {{- $_ := set (index $probeDefinition $probeHeader) "port" ($primaryServiceDefaultPort.port | toString | atoi ) -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- if $probeDefinition -}} + {{- $_ := set $enabledProbes (printf "%sProbe" $probeName) $probeDefinition -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- with $enabledProbes -}} + {{- . | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_volumeMounts.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_volumeMounts.tpl new file mode 100644 index 000000000..5139866b2 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_volumeMounts.tpl @@ -0,0 +1,115 @@ +{{/* +volumeMounts used by the container. +*/}} +{{- define "bjw-s.common.lib.container.field.volumeMounts" -}} + {{- $ctx := .ctx -}} + {{- $rootContext := $ctx.rootContext -}} + {{- $controllerObject := $ctx.controllerObject -}} + {{- $containerObject := $ctx.containerObject -}} + + {{- /* Default to empty dict */ -}} + {{- $persistenceItemsToProcess := dict -}} + {{- $enabledVolumeMounts := list -}} + + {{- /* Collect regular persistence items */ -}} + {{- range $identifier, $persistenceValues := $rootContext.Values.persistence -}} + {{- /* Enable persistence item by default, but allow override */ -}} + {{- $persistenceEnabled := true -}} + {{- if hasKey $persistenceValues "enabled" -}} + {{- $persistenceEnabled = $persistenceValues.enabled -}} + {{- end -}} + + {{- if $persistenceEnabled -}} + {{- $_ := set $persistenceItemsToProcess $identifier $persistenceValues -}} + {{- end -}} + {{- end -}} + + {{- /* Collect volumeClaimTemplates */ -}} + {{- if not (empty (dig "statefulset" "volumeClaimTemplates" nil $controllerObject)) -}} + {{- range $persistenceValues := $controllerObject.statefulset.volumeClaimTemplates -}} + {{- /* Enable persistence item by default, but allow override */ -}} + {{- $persistenceEnabled := true -}} + {{- if hasKey $persistenceValues "enabled" -}} + {{- $persistenceEnabled = $persistenceValues.enabled -}} + {{- end -}} + + {{- if $persistenceEnabled -}} + {{- $mountValues := dict -}} + {{- if not (empty (dig "globalMounts" nil $persistenceValues)) -}} + {{- $_ := set $mountValues "globalMounts" $persistenceValues.globalMounts -}} + {{- end -}} + {{- if not (empty (dig "advancedMounts" nil $persistenceValues)) -}} + {{- $_ := set $mountValues "advancedMounts" (dict $controllerObject.identifier $persistenceValues.advancedMounts) -}} + {{- end -}} + {{- $_ := set $persistenceItemsToProcess $persistenceValues.name $mountValues -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- range $identifier, $persistenceValues := $persistenceItemsToProcess -}} + {{- /* Set some default values */ -}} + + {{- /* Set the default mountPath to / */ -}} + {{- $mountPath := (printf "/%v" $identifier) -}} + {{- if eq "hostPath" (default "pvc" $persistenceValues.type) -}} + {{- $mountPath = $persistenceValues.hostPath -}} + {{- end -}} + + {{- /* Process configured mounts */ -}} + {{- if or .globalMounts .advancedMounts -}} + {{- $mounts := list -}} + {{- if hasKey . "globalMounts" -}} + {{- $mounts = .globalMounts -}} + {{- end -}} + + {{- if hasKey . "advancedMounts" -}} + {{- $advancedMounts := dig $controllerObject.identifier $containerObject.identifier list .advancedMounts -}} + {{- range $advancedMounts -}} + {{- $mounts = append $mounts . -}} + {{- end -}} + {{- end -}} + + {{- range $mounts -}} + {{- $volumeMount := dict -}} + {{- $_ := set $volumeMount "name" $identifier -}} + + {{- /* Use the specified mountPath if provided */ -}} + {{- with .path -}} + {{- $mountPath = . -}} + {{- end -}} + {{- $_ := set $volumeMount "mountPath" $mountPath -}} + + {{- /* Use the specified subPath if provided */ -}} + {{- with .subPath -}} + {{- $subPath := . -}} + {{- $_ := set $volumeMount "subPath" $subPath -}} + {{- end -}} + + {{- /* Use the specified readOnly setting if provided */ -}} + {{- with .readOnly -}} + {{- $readOnly := . -}} + {{- $_ := set $volumeMount "readOnly" $readOnly -}} + {{- end -}} + + {{- /* Use the specified mountPropagation setting if provided */ -}} + {{- with .mountPropagation -}} + {{- $mountPropagation := . -}} + {{- $_ := set $volumeMount "mountPropagation" $mountPropagation -}} + {{- end -}} + + {{- $enabledVolumeMounts = append $enabledVolumeMounts $volumeMount -}} + {{- end -}} + + {{- /* Mount to default path if no mounts are configured */ -}} + {{- else -}} + {{- $volumeMount := dict -}} + {{- $_ := set $volumeMount "name" $identifier -}} + {{- $_ := set $volumeMount "mountPath" $mountPath -}} + {{- $enabledVolumeMounts = append $enabledVolumeMounts $volumeMount -}} + {{- end -}} + {{- end -}} + + {{- with $enabledVolumeMounts -}} + {{- . | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_enabled_containers.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_enabled_containers.tpl new file mode 100644 index 000000000..a49104968 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_enabled_containers.tpl @@ -0,0 +1,24 @@ +{{/* +Return the enabled containers for a controller. +*/}} +{{- define "bjw-s.common.lib.controller.enabledContainers" -}} + {{- $rootContext := .rootContext -}} + {{- $controllerObject := .controllerObject -}} + + {{- $enabledContainers := dict -}} + {{- range $name, $container := $controllerObject.containers -}} + {{- if kindIs "map" $container -}} + {{- /* Enable container by default, but allow override */ -}} + {{- $containerEnabled := true -}} + {{- if hasKey $container "enabled" -}} + {{- $containerEnabled = $container.enabled -}} + {{- end -}} + + {{- if $containerEnabled -}} + {{- $_ := set $enabledContainers $name $container -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- $enabledContainers | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_metadata.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_metadata.tpl new file mode 100644 index 000000000..0d759d6d4 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_metadata.tpl @@ -0,0 +1,25 @@ +{{- define "bjw-s.common.lib.controller.metadata.labels" -}} + {{- + $labels := ( + merge + (.Values.controller.labels | default dict) + (include "bjw-s.common.lib.metadata.allLabels" $ | fromYaml) + ) + -}} + {{- with $labels -}} + {{- toYaml . -}} + {{- end -}} +{{- end -}} + +{{- define "bjw-s.common.lib.controller.metadata.annotations" -}} + {{- + $annotations := ( + merge + (.Values.controller.annotations | default dict) + (include "bjw-s.common.lib.metadata.globalAnnotations" $ | fromYaml) + ) + -}} + {{- with $annotations -}} + {{- toYaml . -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_validate.tpl new file mode 100644 index 000000000..5d61d1a00 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_validate.tpl @@ -0,0 +1,18 @@ +{{/* +Validate controller values +*/}} +{{- define "bjw-s.common.lib.controller.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $controllerValues := .object -}} + + {{- $allowedControllerTypes := list "deployment" "daemonset" "statefulset" "cronjob" "job" -}} + {{- if not (has $controllerValues.type $allowedControllerTypes) -}} + {{- fail (printf "Not a valid controller.type (%s)" $controllerValues.type) -}} + {{- end -}} + + {{- $enabledContainers := include "bjw-s.common.lib.controller.enabledContainers" (dict "rootContext" $rootContext "controllerObject" $controllerValues) | fromYaml }} + {{- /* Validate at least one container is enabled */ -}} + {{- if not $enabledContainers -}} + {{- fail (printf "No containers enabled for controller (%s)" $controllerValues.identifier) -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_valuesToObject.tpl new file mode 100644 index 000000000..6badac92c --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_valuesToObject.tpl @@ -0,0 +1,41 @@ +{{/* +Convert controller values to an object +*/}} +{{- define "bjw-s.common.lib.controller.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Default the controller type to Deployment */ -}} + {{- if empty (dig "type" nil $objectValues) -}} + {{- $_ := set $objectValues "type" "deployment" -}} + {{- end -}} + + {{- /* Determine and inject the controller name */ -}} + {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + + {{- if $objectValues.nameOverride -}} + {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} + {{- else -}} + {{- if ne $identifier "main" -}} + {{- $objectName = printf "%s-%s" $objectName $identifier -}} + {{- end -}} + {{- end -}} + {{- $_ := set $objectValues "name" $objectName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Set the default Pod options for the controller */ -}} + {{- range $index, $key := keys $rootContext.Values.defaultPodOptions -}} + {{- if not (hasKey $objectValues "pod") -}} + {{- $_ := set $objectValues "pod" dict -}} + {{- end -}} + + {{- $defaultValue := get $rootContext.Values.defaultPodOptions $key -}} + {{- if not (hasKey $objectValues.pod $key) -}} + {{- $_ := set $objectValues.pod $key $defaultValue -}} + {{- end -}} + {{- end -}} + + {{- /* Return the controller object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/cronjob/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/cronjob/_validate.tpl new file mode 100644 index 000000000..37cb7b20e --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/cronjob/_validate.tpl @@ -0,0 +1,11 @@ +{{/* +Validate CronJob values +*/}} +{{- define "bjw-s.common.lib.cronjob.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $cronjobValues := .object -}} + + {{- if and (ne $cronjobValues.pod.restartPolicy "Never") (ne $cronjobValues.pod.restartPolicy "OnFailure") -}} + {{- fail (printf "Not a valid restartPolicy type for CronJob. (controller: %s, restartPolicy: %s)" $cronjobValues.identifier $cronjobValues.pod.restartPolicy) }} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/cronjob/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/cronjob/_valuesToObject.tpl new file mode 100644 index 000000000..5657be59e --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/cronjob/_valuesToObject.tpl @@ -0,0 +1,18 @@ +{{/* +Convert Cronjob values to an object +*/}} +{{- define "bjw-s.common.lib.cronjob.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- if not (hasKey $objectValues "pod") -}} + {{- $_ := set $objectValues "pod" dict -}} + {{- end -}} + + {{- $restartPolicy := default "Never" $objectValues.pod.restartPolicy -}} + {{- $_ := set $objectValues.pod "restartPolicy" $restartPolicy -}} + + {{- /* Return the CronJob object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/daemonset/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/daemonset/_validate.tpl new file mode 100644 index 000000000..25a7408c8 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/daemonset/_validate.tpl @@ -0,0 +1,7 @@ +{{/* +Validate DaemonSet values +*/}} +{{- define "bjw-s.common.lib.daemonset.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $daemonsetValues := .object -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/daemonset/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/daemonset/_valuesToObject.tpl new file mode 100644 index 000000000..4593255b5 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/daemonset/_valuesToObject.tpl @@ -0,0 +1,11 @@ +{{/* +Convert DaemonSet values to an object +*/}} +{{- define "bjw-s.common.lib.daemonset.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Return the DaemonSet object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/deployment/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/deployment/_validate.tpl new file mode 100644 index 000000000..c32100794 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/deployment/_validate.tpl @@ -0,0 +1,11 @@ +{{/* +Validate Deployment values +*/}} +{{- define "bjw-s.common.lib.deployment.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $deploymentValues := .object -}} + + {{- if and (ne $deploymentValues.strategy "Recreate") (ne $deploymentValues.strategy "RollingUpdate") -}} + {{- fail (printf "Not a valid strategy type for Deployment. (controller: %s, strategy: %s)" $deploymentValues.identifier $deploymentValues.strategy) }} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/deployment/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/deployment/_valuesToObject.tpl new file mode 100644 index 000000000..7e7ad9ae8 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/deployment/_valuesToObject.tpl @@ -0,0 +1,14 @@ +{{/* +Convert Deployment values to an object +*/}} +{{- define "bjw-s.common.lib.deployment.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- $strategy := default "Recreate" $objectValues.strategy -}} + {{- $_ := set $objectValues "strategy" $strategy -}} + + {{- /* Return the Deployment object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_primary.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_primary.tpl new file mode 100644 index 000000000..5198d09a4 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_primary.tpl @@ -0,0 +1,21 @@ +{{/* Return the name of the primary Ingress object */}} +{{- define "bjw-s.common.lib.ingress.primary" -}} + {{- $enabledIngresses := dict -}} + {{- range $name, $ingress := .Values.ingress -}} + {{- if $ingress.enabled -}} + {{- $_ := set $enabledIngresses $name . -}} + {{- end -}} + {{- end -}} + + {{- $result := "" -}} + {{- range $name, $ingress := $enabledIngresses -}} + {{- if and (hasKey $ingress "primary") $ingress.primary -}} + {{- $result = $name -}} + {{- end -}} + {{- end -}} + + {{- if not $result -}} + {{- $result = keys $enabledIngresses | first -}} + {{- end -}} + {{- $result -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_validate.tpl new file mode 100644 index 000000000..0078e86e6 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_validate.tpl @@ -0,0 +1,15 @@ +{{/* +Validate Ingress values +*/}} +{{- define "bjw-s.common.lib.ingress.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $ingressValues := .object -}} + + {{- range $ingressValues.hosts -}} + {{- range .paths -}} + {{- if empty (dig "service" "name" nil .) -}} + {{- fail (printf "No service name configured. (ingress: %s, path: %s)" $ingressValues.identifier .path) -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_valuesToObject.tpl new file mode 100644 index 000000000..c9195cad4 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_valuesToObject.tpl @@ -0,0 +1,24 @@ +{{/* +Convert ingress values to an object +*/}} +{{- define "bjw-s.common.lib.ingress.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Determine and inject the ingress name */ -}} + {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + + {{- if $objectValues.nameOverride -}} + {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} + {{- else -}} + {{- if ne $identifier "main" -}} + {{- $objectName = printf "%s-%s" $objectName $identifier -}} + {{- end -}} + {{- end -}} + {{- $_ := set $objectValues "name" $objectName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Return the ingress object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/job/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/job/_validate.tpl new file mode 100644 index 000000000..75f71917e --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/job/_validate.tpl @@ -0,0 +1,12 @@ +{{/* +Validate job values +*/}} +{{- define "bjw-s.common.lib.job.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $jobValues := .object -}} + + {{- $allowedRestartPolicy := list "Never" "OnFailure" -}} + {{- if not (has $jobValues.pod.restartPolicy $allowedRestartPolicy) -}} + {{- fail (printf "Not a valid restart policy for Job (controller: %s, strategy: %s)" $jobValues.identifier $jobValues.pod.restartPolicy) -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/job/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/job/_valuesToObject.tpl new file mode 100644 index 000000000..5886d6033 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/job/_valuesToObject.tpl @@ -0,0 +1,14 @@ +{{/* +Convert job values to an object +*/}} +{{- define "bjw-s.common.lib.job.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- $restartPolicy := default "Never" $objectValues.pod.restartPolicy -}} + {{- $_ := set $objectValues.pod "restartPolicy" $restartPolicy -}} + + {{- /* Return the Job object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_allLabels.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_allLabels.tpl new file mode 100644 index 000000000..330857b04 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_allLabels.tpl @@ -0,0 +1,10 @@ +{{/* Common labels shared across objects */}} +{{- define "bjw-s.common.lib.metadata.allLabels" -}} +helm.sh/chart: {{ include "bjw-s.common.lib.chart.names.chart" . }} +{{ include "bjw-s.common.lib.metadata.selectorLabels" . }} + {{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} + {{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{ include "bjw-s.common.lib.metadata.globalLabels" . }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_globalAnnotations.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_globalAnnotations.tpl new file mode 100644 index 000000000..c7850c599 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_globalAnnotations.tpl @@ -0,0 +1,10 @@ +{{/* Common annotations shared across objects */}} +{{- define "bjw-s.common.lib.metadata.globalAnnotations" -}} + {{- with .Values.global.annotations }} + {{- range $k, $v := . }} + {{- $name := $k }} + {{- $value := tpl $v $ }} +{{ $name }}: {{ quote $value }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_globalLabels.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_globalLabels.tpl new file mode 100644 index 000000000..6b4c37709 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_globalLabels.tpl @@ -0,0 +1,9 @@ +{{- define "bjw-s.common.lib.metadata.globalLabels" -}} + {{- with .Values.global.labels }} + {{- range $k, $v := . }} + {{- $name := $k }} + {{- $value := tpl $v $ }} +{{ $name }}: {{ quote $value }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_selectorLabels.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_selectorLabels.tpl new file mode 100644 index 000000000..5174d999d --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_selectorLabels.tpl @@ -0,0 +1,5 @@ +{{/* Selector labels shared across objects */}} +{{- define "bjw-s.common.lib.metadata.selectorLabels" -}} +app.kubernetes.io/name: {{ include "bjw-s.common.lib.chart.names.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/networkpolicy/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/networkpolicy/_validate.tpl new file mode 100644 index 000000000..c490d1b70 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/networkpolicy/_validate.tpl @@ -0,0 +1,22 @@ +{{/* +Validate networkPolicy values +*/}} +{{- define "bjw-s.common.lib.networkpolicy.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $networkpolicyObject := .object -}} + + {{- if and (not (hasKey $networkpolicyObject "podSelector")) (empty (get $networkpolicyObject "controller")) -}} + {{- fail (printf "controller reference or podSelector is required for NetworkPolicy. (NetworkPolicy %s)" $networkpolicyObject.identifier) -}} + {{- end -}} + + {{- if empty (get $networkpolicyObject "policyTypes") -}} + {{- fail (printf "policyTypes is required for NetworkPolicy. (NetworkPolicy %s)" $networkpolicyObject.identifier) -}} + {{- end -}} + + {{- $allowedpolicyTypes := list "Ingress" "Egress" -}} + {{- range $networkpolicyObject.policyTypes -}} + {{- if not (has . $allowedpolicyTypes) -}} + {{- fail (printf "Not a valid policyType for NetworkPolicy. (NetworkPolicy %s, value %s)" $networkpolicyObject.identifier .) -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/networkpolicy/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/networkpolicy/_valuesToObject.tpl new file mode 100644 index 000000000..805f33a5a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/networkpolicy/_valuesToObject.tpl @@ -0,0 +1,24 @@ +{{/* +Convert networkPolicy values to an object +*/}} +{{- define "bjw-s.common.lib.networkpolicy.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Determine and inject the networkPolicy name */ -}} + {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + + {{- if $objectValues.nameOverride -}} + {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} + {{- else -}} + {{- if ne $identifier "main" -}} + {{- $objectName = printf "%s-%s" $objectName $identifier -}} + {{- end -}} + {{- end -}} + {{- $_ := set $objectValues "name" $objectName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Return the networkPolicy object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/_getOption.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/_getOption.tpl new file mode 100644 index 000000000..c436ee328 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/_getOption.tpl @@ -0,0 +1,34 @@ +{{- /* +Returns the value for the specified field +*/ -}} +{{- define "bjw-s.common.lib.pod.getOption" -}} + {{- $rootContext := .ctx.rootContext -}} + {{- $controllerObject := .ctx.controllerObject -}} + {{- $option := .option -}} + + {{- $value := "" -}} + + {{- /* Set to the default if it is set */ -}} + {{- $defaultOption := get $rootContext.Values.defaultPodOptions $option -}} + {{- if kindIs "bool" $defaultOption -}} + {{- $value = $defaultOption -}} + {{- else if not (empty $defaultOption) -}} + {{- $value = $defaultOption -}} + {{- end -}} + + {{- /* See if a pod-specific override is needed */ -}} + {{- if hasKey $controllerObject "pod" -}} + {{- $podOption := get $controllerObject.pod $option -}} + {{- if kindIs "bool" $podOption -}} + {{- $value = $podOption -}} + {{- else if not (empty $podOption) -}} + {{- $value = $podOption -}} + {{- end -}} + {{- end -}} + + {{- if kindIs "bool" $value -}} + {{- $value | toYaml -}} + {{- else if not (empty $value) -}} + {{- $value | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/_spec.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/_spec.tpl new file mode 100644 index 000000000..103acc3c7 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/_spec.tpl @@ -0,0 +1,67 @@ +{{- /* +The pod definition included in the controller. +*/ -}} +{{- define "bjw-s.common.lib.pod.spec" -}} + {{- $rootContext := .rootContext -}} + {{- $controllerObject := .controllerObject -}} + {{- $ctx := dict "rootContext" $rootContext "controllerObject" $controllerObject -}} + +enableServiceLinks: {{ $controllerObject.pod.enableServiceLinks }} +serviceAccountName: {{ include "bjw-s.common.lib.pod.field.serviceAccountName" (dict "ctx" $ctx) | trim }} +automountServiceAccountToken: {{ $controllerObject.pod.automountServiceAccountToken }} + {{- with ($controllerObject.pod.priorityClassName) }} +priorityClassName: {{ . | trim }} + {{- end -}} + {{- with ($controllerObject.pod.runtimeClassName) }} +runtimeClassName: {{ . | trim }} + {{- end -}} + {{- with ($controllerObject.pod.schedulerName) }} +schedulerName: {{ . | trim }} + {{- end -}} + {{- with ($controllerObject.pod.securityContext) }} +securityContext: {{ . | toYaml | nindent 2 }} + {{- end -}} + {{- with ($controllerObject.pod.hostname) }} +hostname: {{ . | trim }} + {{- end }} +hostIPC: {{ $controllerObject.pod.hostIPC }} +hostNetwork: {{ $controllerObject.pod.hostNetwork }} +hostPID: {{ $controllerObject.pod.hostPID }} +dnsPolicy: {{ include "bjw-s.common.lib.pod.field.dnsPolicy" (dict "ctx" $ctx) | trim }} + {{- with $controllerObject.pod.dnsConfig }} +dnsConfig: {{ . | toYaml | nindent 2 }} + {{- end -}} + {{- with $controllerObject.pod.hostAliases }} +hostAliases: {{ . | toYaml | nindent 2 }} + {{- end -}} + {{- with $controllerObject.pod.imagePullSecrets }} +imagePullSecrets: {{ . | toYaml | nindent 2 }} + {{- end -}} + {{- with $controllerObject.pod.terminationGracePeriodSeconds }} +terminationGracePeriodSeconds: {{ . | trim }} + {{- end -}} + {{- with $controllerObject.pod.restartPolicy }} +restartPolicy: {{ . | trim }} + {{- end -}} + {{- with $controllerObject.pod.nodeSelector }} +nodeSelector: {{ . | toYaml | nindent 2 }} + {{- end -}} + {{- with $controllerObject.pod.affinity }} +affinity: {{ . | toYaml | nindent 2 }} + {{- end -}} + {{- with $controllerObject.pod.topologySpreadConstraints }} +topologySpreadConstraints: {{ . | toYaml | nindent 2 }} + {{- end -}} + {{- with $controllerObject.pod.tolerations }} +tolerations: {{ . | toYaml | nindent 2 }} + {{- end }} + {{- with (include "bjw-s.common.lib.pod.field.initContainers" (dict "ctx" $ctx) | trim) }} +initContainers: {{ . | nindent 2 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.pod.field.containers" (dict "ctx" $ctx) | trim) }} +containers: {{ . | nindent 2 }} + {{- end -}} + {{- with (include "bjw-s.common.lib.pod.field.volumes" (dict "ctx" $ctx) | trim) }} +volumes: {{ . | nindent 2 }} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_containers.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_containers.tpl new file mode 100644 index 000000000..a20f7d413 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_containers.tpl @@ -0,0 +1,71 @@ +{{- /* +Returns the value for containers +*/ -}} +{{- define "bjw-s.common.lib.pod.field.containers" -}} + {{- $rootContext := .ctx.rootContext -}} + {{- $controllerObject := .ctx.controllerObject -}} + + {{- /* Default to empty list */ -}} + {{- $graph := dict -}} + {{- $containers := list -}} + + {{- /* Fetch configured containers for this controller */ -}} + {{- $enabledContainers := include "bjw-s.common.lib.controller.enabledContainers" (dict "rootContext" $rootContext "controllerObject" $controllerObject) | fromYaml }} + {{- $renderedContainers := dict -}} + + {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} + {{- $containersWithDependsOn := include "bjw-s.common.lib.getMapItemsWithKey" (dict "map" $enabledContainers "key" "dependsOn") | fromYaml | keys -}} + {{- $useDependsOn := gt (len $containersWithDependsOn) 0 -}} + + {{- range $key, $containerValues := $enabledContainers -}} + {{- /* Create object from the container values */ -}} + {{- $containerObject := (include "bjw-s.common.lib.container.valuesToObject" (dict "rootContext" $rootContext "id" $key "values" $containerValues)) | fromYaml -}} + + {{- /* Perform validations on the Container before rendering */ -}} + {{- include "bjw-s.common.lib.container.validate" (dict "rootContext" $ "controllerObject" $controllerObject "containerObject" $containerObject) -}} + + {{- /* Generate the Container spec */ -}} + {{- $renderedContainer := include "bjw-s.common.lib.container.spec" (dict "rootContext" $rootContext "controllerObject" $controllerObject "containerObject" $containerObject) | fromYaml -}} + {{- $_ := set $renderedContainers $key $renderedContainer -}} + + {{- /* Determine the Container order */ -}} + {{- if $useDependsOn -}} + {{- if empty (dig "dependsOn" nil $containerValues) -}} + {{- $_ := set $graph $key ( list ) -}} + {{- else if kindIs "string" $containerValues.dependsOn -}} + {{- $_ := set $graph $key ( list $containerValues.dependsOn ) -}} + {{- else if kindIs "slice" $containerValues.dependsOn -}} + {{- $_ := set $graph $key $containerValues.dependsOn -}} + {{- end -}} + {{- else -}} + {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} + {{- $containerOrder := (dig "order" 99 $containerValues) -}} + {{- $_ := set $graph $key $containerOrder -}} + {{- end -}} + {{- end -}} + + {{- /* Process graph */ -}} + {{- if $useDependsOn -}} + {{- $args := dict "graph" $graph "out" list -}} + {{- include "bjw-s.common.lib.kahn" $args -}} + + {{- range $name := $args.out -}} + {{- $containerItem := get $renderedContainers $name -}} + {{- $containers = append $containers $containerItem -}} + {{- end -}} + {{- else -}} + {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} + {{- $orderedContainers := dict -}} + {{- range $key, $order := $graph -}} + {{- $containerItem := get $renderedContainers $key -}} + {{- $_ := set $orderedContainers (printf "%v-%s" $order $key) $containerItem -}} + {{- end -}} + {{- range $key, $containerValues := $orderedContainers -}} + {{- $containers = append $containers $containerValues -}} + {{- end -}} + {{- end -}} + + {{- if not (empty $containers) -}} + {{- $containers | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_dnsPolicy.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_dnsPolicy.tpl new file mode 100644 index 000000000..e82636d04 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_dnsPolicy.tpl @@ -0,0 +1,25 @@ +{{- /* +Returns the value for dnsPolicy +*/ -}} +{{- define "bjw-s.common.lib.pod.field.dnsPolicy" -}} + {{- $ctx := .ctx -}} + {{- $controllerObject := $ctx.controllerObject -}} + + {{- /* Default to "ClusterFirst" */ -}} + {{- $dnsPolicy := "ClusterFirst" -}} + + {{- /* Get hostNetwork value "" */ -}} + {{- $hostNetwork:= get $controllerObject.pod "hostNetwork" -}} + {{- if $hostNetwork -}} + {{- $dnsPolicy = "ClusterFirstWithHostNet" -}} + {{- end -}} + + {{- /* See if an override is desired */ -}} + {{- $override := get $controllerObject.pod "dnsPolicy" -}} + + {{- if not (empty $override) -}} + {{- $dnsPolicy = $override -}} + {{- end -}} + + {{- $dnsPolicy -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_initContainers.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_initContainers.tpl new file mode 100644 index 000000000..2d7800923 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_initContainers.tpl @@ -0,0 +1,78 @@ +{{- /* +Returns the value for initContainers +*/ -}} +{{- define "bjw-s.common.lib.pod.field.initContainers" -}} + {{- $rootContext := .ctx.rootContext -}} + {{- $controllerObject := .ctx.controllerObject -}} + + {{- /* Default to empty list */ -}} + {{- $graph := dict -}} + {{- $containers := list -}} + + {{- /* Fetch configured containers for this controller */ -}} + {{- $renderedContainers := dict -}} + + {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} + {{- $containersWithDependsOn := include "bjw-s.common.lib.getMapItemsWithKey" (dict "map" $controllerObject.initContainers "key" "dependsOn") | fromYaml | keys -}} + {{- $useDependsOn := gt (len $containersWithDependsOn) 0 -}} + + {{- range $key, $containerValues := $controllerObject.initContainers -}} + {{- /* Enable container by default, but allow override */ -}} + {{- $containerEnabled := true -}} + {{- if hasKey $containerValues "enabled" -}} + {{- $containerEnabled = $containerValues.enabled -}} + {{- end -}} + + {{- if $containerEnabled -}} + {{- /* Create object from the container values */ -}} + {{- $containerObject := (include "bjw-s.common.lib.container.valuesToObject" (dict "rootContext" $rootContext "id" $key "values" $containerValues)) | fromYaml -}} + + {{- /* Perform validations on the Container before rendering */ -}} + {{- include "bjw-s.common.lib.container.validate" (dict "rootContext" $ "controllerObject" $controllerObject "containerObject" $containerObject) -}} + + {{- /* Generate the Container spec */ -}} + {{- $renderedContainer := include "bjw-s.common.lib.container.spec" (dict "rootContext" $rootContext "controllerObject" $controllerObject "containerObject" $containerObject) | fromYaml -}} + {{- $_ := set $renderedContainers $key $renderedContainer -}} + + {{- /* Determine the Container order */ -}} + {{- if $useDependsOn -}} + {{- if empty (dig "dependsOn" nil $containerValues) -}} + {{- $_ := set $graph $key ( list ) -}} + {{- else if kindIs "string" $containerValues.dependsOn -}} + {{- $_ := set $graph $key ( list $containerValues.dependsOn ) -}} + {{- else if kindIs "slice" $containerValues.dependsOn -}} + {{- $_ := set $graph $key $containerValues.dependsOn -}} + {{- end -}} + {{- else -}} + {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} + {{- $containerOrder := (dig "order" 99 $containerValues) -}} + {{- $_ := set $graph $key $containerOrder -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- /* Process graph */ -}} + {{- if $useDependsOn -}} + {{- $args := dict "graph" $graph "out" list -}} + {{- include "bjw-s.common.lib.kahn" $args -}} + + {{- range $name := $args.out -}} + {{- $containerItem := get $renderedContainers $name -}} + {{- $containers = append $containers $containerItem -}} + {{- end -}} + {{- else -}} + {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} + {{- $orderedContainers := dict -}} + {{- range $key, $order := $graph -}} + {{- $containerItem := get $renderedContainers $key -}} + {{- $_ := set $orderedContainers (printf "%v-%s" $order $key) $containerItem -}} + {{- end -}} + {{- range $key, $containerValues := $orderedContainers -}} + {{- $containers = append $containers $containerValues -}} + {{- end -}} + {{- end -}} + + {{- if not (empty $containers) -}} + {{- $containers | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_serviceAccountName.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_serviceAccountName.tpl new file mode 100644 index 000000000..947a1a460 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_serviceAccountName.tpl @@ -0,0 +1,11 @@ +{{- /* +Returns the value for serviceAccountName +*/ -}} +{{- define "bjw-s.common.lib.pod.field.serviceAccountName" -}} + {{- $rootContext := .ctx.rootContext -}} + + {{- $serviceAccountValues := (mustDeepCopy $rootContext.Values.serviceAccount) -}} + {{- $serviceAccountObject := (include "bjw-s.common.lib.serviceAccount.valuesToObject" (dict "rootContext" $rootContext "id" "default" "values" $serviceAccountValues)) | fromYaml -}} + {{- $serviceAccountObject.name -}} + +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_volumes.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_volumes.tpl new file mode 100644 index 000000000..2e8836906 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_volumes.tpl @@ -0,0 +1,125 @@ +{{- /* +Returns the value for volumes +*/ -}} +{{- define "bjw-s.common.lib.pod.field.volumes" -}} + {{- $rootContext := .ctx.rootContext -}} + {{- $controllerObject := .ctx.controllerObject -}} + + {{- /* Default to empty list */ -}} + {{- $persistenceItemsToProcess := dict -}} + {{- $volumes := list -}} + + {{- /* Loop over persistence values */ -}} + {{- range $identifier, $persistenceValues := $rootContext.Values.persistence -}} + {{- /* Enable persistence item by default, but allow override */ -}} + {{- $persistenceEnabled := true -}} + {{- if hasKey $persistenceValues "enabled" -}} + {{- $persistenceEnabled = $persistenceValues.enabled -}} + {{- end -}} + + {{- if $persistenceEnabled -}} + {{- $hasglobalMounts := not (empty $persistenceValues.globalMounts) -}} + {{- $globalMounts := dig "globalMounts" list $persistenceValues -}} + + {{- $hasAdvancedMounts := not (empty $persistenceValues.advancedMounts) -}} + {{- $advancedMounts := dig "advancedMounts" $controllerObject.identifier list $persistenceValues -}} + + {{ if or + ($hasglobalMounts) + (and ($hasAdvancedMounts) (not (empty $advancedMounts))) + (and (not $hasglobalMounts) (not $hasAdvancedMounts)) + -}} + {{- $_ := set $persistenceItemsToProcess $identifier $persistenceValues -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- /* Loop over persistence items */ -}} + {{- range $identifier, $persistenceValues := $persistenceItemsToProcess -}} + {{- $volume := dict "name" $identifier -}} + + {{- /* PVC persistence type */ -}} + {{- if eq (default "persistentVolumeClaim" $persistenceValues.type) "persistentVolumeClaim" -}} + {{- $pvcName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + {{- if $persistenceValues.existingClaim -}} + {{- /* Always prefer an existingClaim if that is set */ -}} + {{- $pvcName = $persistenceValues.existingClaim -}} + {{- else -}} + {{- /* Otherwise refer to the PVC name */ -}} + {{- if $persistenceValues.nameOverride -}} + {{- if not (eq $persistenceValues.nameOverride "-") -}} + {{- $pvcName = (printf "%s-%s" (include "bjw-s.common.lib.chart.names.fullname" $rootContext) $persistenceValues.nameOverride) -}} + {{- end -}} + {{- else -}} + {{- $pvcName = (printf "%s-%s" (include "bjw-s.common.lib.chart.names.fullname" $rootContext) $identifier) -}} + {{- end -}} + {{- end -}} + {{- $_ := set $volume "persistentVolumeClaim" (dict "claimName" $pvcName) -}} + + {{- /* configMap persistence type */ -}} + {{- else if eq $persistenceValues.type "configMap" -}} + {{- $objectName := (required (printf "name not set for persistence item %s" $identifier) $persistenceValues.name) -}} + {{- $objectName = tpl $objectName $rootContext -}} + {{- $_ := set $volume "configMap" dict -}} + {{- $_ := set $volume.configMap "name" $objectName -}} + {{- with $persistenceValues.defaultMode -}} + {{- $_ := set $volume.configMap "defaultMode" . -}} + {{- end -}} + {{- with $persistenceValues.items -}} + {{- $_ := set $volume.configMap "items" . -}} + {{- end -}} + + {{- /* Secret persistence type */ -}} + {{- else if eq $persistenceValues.type "secret" -}} + {{- $objectName := (required (printf "name not set for persistence item %s" $identifier) $persistenceValues.name) -}} + {{- $objectName = tpl $objectName $rootContext -}} + {{- $_ := set $volume "secret" dict -}} + {{- $_ := set $volume.secret "secretName" $objectName -}} + {{- with $persistenceValues.defaultMode -}} + {{- $_ := set $volume.secret "defaultMode" . -}} + {{- end -}} + {{- with $persistenceValues.items -}} + {{- $_ := set $volume.secret "items" . -}} + {{- end -}} + + {{- /* emptyDir persistence type */ -}} + {{- else if eq $persistenceValues.type "emptyDir" -}} + {{- $_ := set $volume "emptyDir" dict -}} + {{- with $persistenceValues.medium -}} + {{- $_ := set $volume.emptyDir "medium" . -}} + {{- end -}} + {{- with $persistenceValues.sizeLimit -}} + {{- $_ := set $volume.emptyDir "sizeLimit" . -}} + {{- end -}} + + {{- /* hostPath persistence type */ -}} + {{- else if eq $persistenceValues.type "hostPath" -}} + {{- $_ := set $volume "hostPath" dict -}} + {{- $_ := set $volume.hostPath "path" (required "hostPath not set" $persistenceValues.hostPath) -}} + {{- with $persistenceValues.hostPathType }} + {{- $_ := set $volume.hostPath "type" . -}} + {{- end -}} + + {{- /* nfs persistence type */ -}} + {{- else if eq $persistenceValues.type "nfs" -}} + {{- $_ := set $volume "nfs" dict -}} + {{- $_ := set $volume.nfs "server" (required "server not set" $persistenceValues.server) -}} + {{- $_ := set $volume.nfs "path" (required "path not set" $persistenceValues.path) -}} + + {{- /* custom persistence type */ -}} + {{- else if eq $persistenceValues.type "custom" -}} + {{- $volume = $persistenceValues.volumeSpec -}} + {{- $_ := set $volume "name" $identifier -}} + + {{- /* Fail otherwise */ -}} + {{- else -}} + {{- fail (printf "Not a valid persistence.type (%s)" $persistenceValues.type) -}} + {{- end -}} + + {{- $volumes = append $volumes $volume -}} + {{- end -}} + + {{- if not (empty $volumes) -}} + {{- $volumes | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/metadata/_annotations.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/metadata/_annotations.tpl new file mode 100644 index 000000000..86e6d25ff --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/metadata/_annotations.tpl @@ -0,0 +1,56 @@ +{{- /* +Returns the value for annotations +*/ -}} +{{- define "bjw-s.common.lib.pod.metadata.annotations" -}} + {{- $rootContext := .rootContext -}} + {{- $controllerObject := .controllerObject -}} + + {{- /* Default annotations */ -}} + {{- $annotations := dict -}} + + {{- /* Set to the default if it is set */ -}} + {{- $defaultOption := get $rootContext.Values.defaultPodOptions "annotations" -}} + {{- if not (empty $defaultOption) -}} + {{- $annotations = merge $defaultOption $annotations -}} + {{- end -}} + + {{- /* See if a pod-specific override is set */ -}} + {{- if hasKey $controllerObject "pod" -}} + {{- $podOption := get $controllerObject.pod "annotations" -}} + {{- if not (empty $podOption) -}} + {{- $annotations = merge $podOption $annotations -}} + {{- end -}} + {{- end -}} + + {{- /* Add configMaps checksum */ -}} + {{- $configMapsFound := dict -}} + {{- range $name, $configmap := $rootContext.Values.configMaps -}} + {{- if $configmap.enabled -}} + {{- $_ := set $configMapsFound $name (toYaml $configmap.data | sha256sum) -}} + {{- end -}} + {{- end -}} + {{- if $configMapsFound -}} + {{- $annotations = merge + (dict "checksum/configMaps" (toYaml $configMapsFound | sha256sum)) + $annotations + -}} + {{- end -}} + + {{- /* Add Secrets checksum */ -}} + {{- $secretsFound := dict -}} + {{- range $name, $secret := $rootContext.Values.secrets -}} + {{- if $secret.enabled -}} + {{- $_ := set $secretsFound $name (toYaml $secret.stringData | sha256sum) -}} + {{- end -}} + {{- end -}} + {{- if $secretsFound -}} + {{- $annotations = merge + (dict "checksum/secrets" (toYaml $secretsFound | sha256sum)) + $annotations + -}} + {{- end -}} + + {{- if not (empty $annotations) -}} + {{- $annotations | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/metadata/_labels.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/metadata/_labels.tpl new file mode 100644 index 000000000..82a1731be --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/metadata/_labels.tpl @@ -0,0 +1,36 @@ +{{- /* +Returns the value for labels +*/ -}} +{{- define "bjw-s.common.lib.pod.metadata.labels" -}} + {{- $rootContext := .rootContext -}} + {{- $controllerObject := .controllerObject -}} + + {{- /* Default labels */ -}} + {{- $labels := merge + (dict "app.kubernetes.io/component" $controllerObject.identifier) + -}} + + {{- /* Fetch the Pod selectorLabels */ -}} + {{- $selectorLabels := include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | fromYaml -}} + {{- if not (empty $selectorLabels) -}} + {{- $labels = merge $selectorLabels $labels -}} + {{- end -}} + + {{- /* Set to the default if it is set */ -}} + {{- $defaultOption := get $rootContext.Values.defaultPodOptions "labels" -}} + {{- if not (empty $defaultOption) -}} + {{- $labels = merge $defaultOption $labels -}} + {{- end -}} + + {{- /* See if a pod-specific override is set */ -}} + {{- if hasKey $controllerObject "pod" -}} + {{- $podOption := get $controllerObject.pod "labels" -}} + {{- if not (empty $podOption) -}} + {{- $labels = merge $podOption $labels -}} + {{- end -}} + {{- end -}} + + {{- if not (empty $labels) -}} + {{- $labels | toYaml -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pvc/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pvc/_validate.tpl new file mode 100644 index 000000000..23110faf0 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/pvc/_validate.tpl @@ -0,0 +1,7 @@ +{{/* +Validate PVC values +*/}} +{{- define "bjw-s.common.lib.pvc.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $pvcObject := .object -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pvc/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pvc/_valuesToObject.tpl new file mode 100644 index 000000000..99878382a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/pvc/_valuesToObject.tpl @@ -0,0 +1,24 @@ +{{/* +Convert PVC values to an object +*/}} +{{- define "bjw-s.common.lib.pvc.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Determine and inject the PVC name */ -}} + {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + + {{- if $objectValues.nameOverride -}} + {{- if ne $objectValues.nameOverride "-" -}} + {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} + {{- end -}} + {{- else -}} + {{- $objectName = printf "%s-%s" $objectName $identifier -}} + {{- end -}} + {{- $_ := set $objectValues "name" $objectName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Return the PVC object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_primary.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_primary.tpl new file mode 100644 index 000000000..ba6cd1a40 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_primary.tpl @@ -0,0 +1,21 @@ +{{/* Return the name of the primary route object */}} +{{- define "bjw-s.common.lib.route.primary" -}} + {{- $enabledRoutes := dict -}} + {{- range $name, $route := .Values.route -}} + {{- if $route.enabled -}} + {{- $_ := set $enabledRoutes $name . -}} + {{- end -}} + {{- end -}} + + {{- $result := "" -}} + {{- range $name, $route := $enabledRoutes -}} + {{- if and (hasKey $route "primary") $route.primary -}} + {{- $result = $name -}} + {{- end -}} + {{- end -}} + + {{- if not $result -}} + {{- $result = keys $enabledRoutes | first -}} + {{- end -}} + {{- $result -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_validate.tpl new file mode 100644 index 000000000..776494c0a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_validate.tpl @@ -0,0 +1,25 @@ +{{/* +Validate Route values +*/}} +{{- define "bjw-s.common.lib.route.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $routeObject := .object -}} + + {{/* Route Types */}} + {{- $routeKind := $routeObject.kind | default "HTTPRoute"}} + {{- if and (ne $routeKind "GRPCRoute") (ne $routeKind "HTTPRoute") (ne $routeKind "TCPRoute") (ne $routeKind "TLSRoute") (ne $routeKind "UDPRoute") }} + {{- fail (printf "Not a valid route kind (%s)" $routeKind) }} + {{- end }} + + {{/* Route Rules */}} + + {{- range $routeObject.rules }} + {{- if and (.filters) (.backendRefs) }} + {{- range .filters }} + {{- if eq .type "RequestRedirect" }} + {{- fail (printf "backend refs and request redirect filters cannot co-exist.")}} + {{- end }} + {{- end }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_valuesToObject.tpl new file mode 100644 index 000000000..1b4366312 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_valuesToObject.tpl @@ -0,0 +1,24 @@ +{{/* +Convert Route values to an object +*/}} +{{- define "bjw-s.common.lib.route.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Determine and inject the Route name */ -}} + {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + + {{- if $objectValues.nameOverride -}} + {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} + {{- else -}} + {{- if ne $identifier (include "bjw-s.common.lib.route.primary" $rootContext) -}} + {{- $objectName = printf "%s-%s" $objectName $identifier -}} + {{- end -}} + {{- end -}} + {{- $_ := set $objectValues "name" $objectName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Return the Route object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_getByIdentifier.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_getByIdentifier.tpl new file mode 100644 index 000000000..ddcb4547a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_getByIdentifier.tpl @@ -0,0 +1,12 @@ +{{/* +Return a secret Object by its Identifier. +*/}} +{{- define "bjw-s.common.lib.secret.getByIdentifier" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + + {{- $secretValues := dig $identifier nil $rootContext.Values.secrets -}} + {{- if not (empty $secretValues) -}} + {{- include "bjw-s.common.lib.secret.valuesToObject" (dict "rootContext" $rootContext "id" $identifier "values" $secretValues) -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_validate.tpl new file mode 100644 index 000000000..82603992f --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_validate.tpl @@ -0,0 +1,7 @@ +{{/* +Validate Secret values +*/}} +{{- define "bjw-s.common.lib.secret.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $secretValues := .object -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_valuesToObject.tpl new file mode 100644 index 000000000..59f89d17a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_valuesToObject.tpl @@ -0,0 +1,24 @@ +{{/* +Convert Secret values to an object +*/}} +{{- define "bjw-s.common.lib.secret.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Determine and inject the Secret name */ -}} + {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + + {{- if $objectValues.nameOverride -}} + {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} + {{- else -}} + {{- if ne $identifier "main" -}} + {{- $objectName = printf "%s-%s" $objectName $identifier -}} + {{- end -}} + {{- end -}} + {{- $_ := set $objectValues "name" $objectName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Return the Secret object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_enabled_ports.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_enabled_ports.tpl new file mode 100644 index 000000000..6de6c1b08 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_enabled_ports.tpl @@ -0,0 +1,22 @@ +{{/* +Return the enabled ports for a given Service object. +*/}} +{{- define "bjw-s.common.lib.service.enabledPorts" -}} + {{- $rootContext := .rootContext -}} + {{- $serviceObject := .serviceObject -}} + + {{- $enabledPorts := dict -}} + + {{- range $name, $port := $serviceObject.ports -}} + {{- if kindIs "map" $port -}} + {{- $portEnabled := true -}} + {{- if hasKey $port "enabled" -}} + {{- $portEnabled = $port.enabled -}} + {{- end -}} + {{- if $portEnabled -}} + {{- $_ := set $enabledPorts $name . -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- $enabledPorts | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_enabled_services.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_enabled_services.tpl new file mode 100644 index 000000000..74b4ea901 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_enabled_services.tpl @@ -0,0 +1,23 @@ +{{/* +Return the enabled services. +*/}} +{{- define "bjw-s.common.lib.service.enabledServices" -}} + {{- $rootContext := .rootContext -}} + {{- $enabledServices := dict -}} + + {{- range $name, $service := $rootContext.Values.service -}} + {{- if kindIs "map" $service -}} + {{- /* Enable Service by default, but allow override */ -}} + {{- $serviceEnabled := true -}} + {{- if hasKey $service "enabled" -}} + {{- $serviceEnabled = $service.enabled -}} + {{- end -}} + + {{- if $serviceEnabled -}} + {{- $_ := set $enabledServices $name . -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- $enabledServices | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_getByIdentifier.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_getByIdentifier.tpl new file mode 100644 index 000000000..c83351254 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_getByIdentifier.tpl @@ -0,0 +1,13 @@ +{{/* +Return a service Object by its Identifier. +*/}} +{{- define "bjw-s.common.lib.service.getByIdentifier" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + + {{- range $name, $serviceValues := $rootContext.Values.service -}} + {{- if eq $name $identifier -}} + {{- include "bjw-s.common.lib.service.valuesToObject" (dict "rootContext" $rootContext "id" $identifier "values" $serviceValues) -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_getPortNumberByName.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_getPortNumberByName.tpl new file mode 100644 index 000000000..0b9174702 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_getPortNumberByName.tpl @@ -0,0 +1,17 @@ +{{/* +Return a service port number by name for a Service object +*/}} +{{- define "bjw-s.common.lib.service.getPortNumberByName" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .serviceID -}} + {{- $portName := .portName -}} + + {{- $service := include "bjw-s.common.lib.service.getByIdentifier" (dict "rootContext" $rootContext "id" $identifier) | fromYaml -}} + + {{- if $service -}} + {{ $servicePort := dig "ports" $portName "port" nil $service -}} + {{- if not (eq $servicePort nil) -}} + {{- $servicePort -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_primaryForController.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_primaryForController.tpl new file mode 100644 index 000000000..ebc07067f --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_primaryForController.tpl @@ -0,0 +1,30 @@ +{{/* +Return the primary service object for a controller +*/}} +{{- define "bjw-s.common.lib.service.primaryForController" -}} + {{- $rootContext := .rootContext -}} + {{- $controllerIdentifier := .controllerIdentifier -}} + + {{- $identifier := "" -}} + {{- $result := dict -}} + + {{- /* Loop over all enabled services */ -}} + {{- $enabledServices := (include "bjw-s.common.lib.service.enabledServices" (dict "rootContext" $rootContext) | fromYaml ) }} + {{- if $enabledServices -}} + {{- range $name, $service := $enabledServices -}} + {{- /* Determine the Service that has been marked as primary */ -}} + {{- if and (hasKey $service "primary") $service.primary -}} + {{- $identifier = $name -}} + {{- $result = $service -}} + {{- end -}} + {{- end -}} + + {{- /* Return the first Service if none has been explicitly marked as primary */ -}} + {{- if not $result -}} + {{- $identifier = keys $enabledServices | first -}} + {{- $result = get $enabledServices $identifier -}} + {{- end -}} + + {{- include "bjw-s.common.lib.service.valuesToObject" (dict "rootContext" $rootContext "id" $identifier "values" $result) -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_primary_port.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_primary_port.tpl new file mode 100644 index 000000000..d921be1a7 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_primary_port.tpl @@ -0,0 +1,25 @@ +{{/* +Return the primary port for a given Service object. +*/}} +{{- define "bjw-s.common.lib.service.primaryPort" -}} + {{- $rootContext := .rootContext -}} + {{- $serviceObject := .serviceObject -}} + {{- $result := "" -}} + + {{- /* Loop over all enabled ports */ -}} + {{- $enabledPorts := include "bjw-s.common.lib.service.enabledPorts" (dict "rootContext" $rootContext "serviceObject" $serviceObject) | fromYaml }} + {{- range $name, $port := $enabledPorts -}} + {{- /* Determine the port that has been marked as primary */ -}} + {{- if and (hasKey $port "primary") $port.primary -}} + {{- $result = $port -}} + {{- end -}} + {{- end -}} + + {{- /* Return the first port if none has been explicitly marked as primary */ -}} + {{- if not $result -}} + {{- $firstPortKey := keys $enabledPorts | first -}} + {{- $result = get $enabledPorts $firstPortKey -}} + {{- end -}} + + {{- $result | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_validate.tpl new file mode 100644 index 000000000..e9558cea3 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_validate.tpl @@ -0,0 +1,37 @@ +{{/* +Validate Service values +*/}} +{{- define "bjw-s.common.lib.service.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $serviceObject := .object -}} + + {{- if empty (get $serviceObject "controller") -}} + {{- fail (printf "controller field is required for Service. (service: %s)" $serviceObject.identifier) -}} + {{- end -}} + + {{- /* Validate Service type */ -}} + {{- $validServiceTypes := (list "ClusterIP" "LoadBalancer" "NodePort" "ExternalName" "ExternalIP") -}} + {{- if and $serviceObject.type (not (mustHas $serviceObject.type $validServiceTypes)) -}} + {{- fail ( + printf "invalid service type \"%s\" for Service with key \"%s\". Allowed values are [%s]" + $serviceObject.type + $serviceObject.identifier + (join ", " $validServiceTypes) + ) -}} + {{- end -}} + + {{- if ne $serviceObject.type "ExternalName" -}} + {{- $enabledPorts := include "bjw-s.common.lib.service.enabledPorts" (dict "rootContext" $rootContext "serviceObject" $serviceObject) | fromYaml }} + {{- /* Validate at least one port is enabled */ -}} + {{- if not $enabledPorts -}} + {{- fail (printf "no ports are enabled for Service with key \"%s\"" $serviceObject.identifier) -}} + {{- end -}} + + {{- range $name, $port := $enabledPorts -}} + {{- /* Validate a port number is configured */ -}} + {{- if not $port.port -}} + {{- fail (printf "no port number is configured for port \"%s\" under Service with key \"%s\"" $name $serviceObject.identifier) -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_valuesToObject.tpl new file mode 100644 index 000000000..2b1417cbe --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_valuesToObject.tpl @@ -0,0 +1,24 @@ +{{/* +Convert Service values to an object +*/}} +{{- define "bjw-s.common.lib.service.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Determine and inject the Service name */ -}} + {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + + {{- if $objectValues.nameOverride -}} + {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} + {{- else -}} + {{- if not $objectValues.primary -}} + {{- $objectName = printf "%s-%s" $objectName $identifier -}} + {{- end -}} + {{- end -}} + {{- $_ := set $objectValues "name" $objectName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Return the Service object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceAccount/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceAccount/_validate.tpl new file mode 100644 index 000000000..8eeb37461 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceAccount/_validate.tpl @@ -0,0 +1,7 @@ +{{/* +Validate ServiceAccount values +*/}} +{{- define "bjw-s.common.lib.serviceAccount.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $serviceAccountValues := .object -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceAccount/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceAccount/_valuesToObject.tpl new file mode 100644 index 000000000..9451e1018 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceAccount/_valuesToObject.tpl @@ -0,0 +1,23 @@ +{{/* +Convert ServiceAccount values to an object +*/}} +{{- define "bjw-s.common.lib.serviceAccount.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Determine and inject the serviceAccount name */ -}} + {{- $serviceAccountName := "" -}} + {{- $defaultServiceAccountName := "default" -}} + {{- if $objectValues.create -}} + {{- $defaultServiceAccountName = (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + {{- end -}} + + {{- $serviceAccountName = default $defaultServiceAccountName $objectValues.name -}} + + {{- $_ := set $objectValues "name" $serviceAccountName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Return the serviceAccount object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceMonitor/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceMonitor/_validate.tpl new file mode 100644 index 000000000..c63527a17 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceMonitor/_validate.tpl @@ -0,0 +1,11 @@ +{{/* +Validate serviceMonitor values +*/}} +{{- define "bjw-s.common.lib.serviceMonitor.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $serviceMonitorObject := .object -}} + + {{- if not $serviceMonitorObject.endpoints -}} + {{- fail (printf "endpoints are required for serviceMonitor with key \"%v\"" $serviceMonitorObject.identifier) -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceMonitor/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceMonitor/_valuesToObject.tpl new file mode 100644 index 000000000..febce01da --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceMonitor/_valuesToObject.tpl @@ -0,0 +1,24 @@ +{{/* +Convert ServiceMonitor values to an object +*/}} +{{- define "bjw-s.common.lib.serviceMonitor.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- /* Determine and inject the ServiceMonitor name */ -}} + {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} + + {{- if $objectValues.nameOverride -}} + {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} + {{- else -}} + {{- if ne $identifier "main" -}} + {{- $objectName = printf "%s-%s" $objectName $identifier -}} + {{- end -}} + {{- end -}} + {{- $_ := set $objectValues "name" $objectName -}} + {{- $_ := set $objectValues "identifier" $identifier -}} + + {{- /* Return the ServiceMonitor object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_validate.tpl new file mode 100644 index 000000000..1bfcac738 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_validate.tpl @@ -0,0 +1,23 @@ +{{/* +Validate StatefulSet values +*/}} +{{- define "bjw-s.common.lib.statefulset.validate" -}} + {{- $rootContext := .rootContext -}} + {{- $statefulsetValues := .object -}} + + {{- if and (ne $statefulsetValues.strategy "OnDelete") (ne $statefulsetValues.strategy "RollingUpdate") -}} + {{- fail (printf "Not a valid strategy type for StatefulSet. (controller: %s, strategy: %s)" $statefulsetValues.identifier $statefulsetValues.strategy) -}} + {{- end -}} + + {{- if not (empty (dig "statefulset" "volumeClaimTemplates" "" $statefulsetValues)) -}} + {{- range $index, $volumeClaimTemplate := $statefulsetValues.statefulset.volumeClaimTemplates -}} + {{- if empty (get . "size") -}} + {{- fail (printf "size is required for volumeClaimTemplate. (controller: %s, volumeClaimTemplate: %s)" $statefulsetValues.identifier $volumeClaimTemplate.name) -}} + {{- end -}} + + {{- if empty (get . "accessMode") -}} + {{- fail (printf "accessMode is required for volumeClaimTemplate. (controller: %s, volumeClaimTemplate: %s)" $statefulsetValues.identifier $volumeClaimTemplate.name) -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_valuesToObject.tpl new file mode 100644 index 000000000..687f4ed86 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_valuesToObject.tpl @@ -0,0 +1,14 @@ +{{/* +Convert StatefulSet values to an object +*/}} +{{- define "bjw-s.common.lib.statefulset.valuesToObject" -}} + {{- $rootContext := .rootContext -}} + {{- $identifier := .id -}} + {{- $objectValues := .values -}} + + {{- $strategy := default "RollingUpdate" $objectValues.strategy -}} + {{- $_ := set $objectValues "strategy" $strategy -}} + + {{- /* Return the StatefulSet object */ -}} + {{- $objectValues | toYaml -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_volumeClaimTemplates.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_volumeClaimTemplates.tpl new file mode 100644 index 000000000..ab96ae799 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_volumeClaimTemplates.tpl @@ -0,0 +1,51 @@ +{{/* +Basic VolumeClaimTemplate template +*/}} +{{- define "bjw-s.common.lib.statefulset.volumeclaimtemplate" -}} + {{- $rootContext := .rootContext -}} + {{- $values := .values -}} + +metadata: + name: {{ $values.name }} + {{- with ($values.labels | default dict) }} + labels: {{- toYaml . | nindent 10 }} + {{- end }} + {{- with ($values.annotations | default dict) }} + annotations: {{- toYaml . | nindent 10 }} + {{- end }} +spec: + accessModes: + - {{ $values.accessMode | quote }} + resources: + requests: + storage: {{ $values.size | quote }} + {{- if $values.storageClass }} + storageClassName: {{ if (eq "-" $values.storageClass) }}""{{- else }}{{ $values.storageClass | quote }}{{- end }} + {{- end }} + {{- with $values.dataSource }} + dataSource: {{- tpl (toYaml .) $rootContext | nindent 10 }} + {{- end }} + {{- with $values.dataSourceRef }} + dataSourceRef: {{- tpl (toYaml .) $rootContext | nindent 10 }} + {{- end }} +{{- end -}} + +{{/* +VolumeClaimTemplates for StatefulSet +*/}} +{{- define "bjw-s.common.lib.statefulset.volumeclaimtemplates" -}} + {{- $rootContext := .rootContext -}} + {{- $statefulsetObject := .statefulsetObject -}} + + {{- /* Default to empty list */ -}} + {{- $volumeClaimTemplates := list -}} + + {{- range $index, $volumeClaimTemplate := (dig "statefulset" "volumeClaimTemplates" list $statefulsetObject) }} + {{- $vct := include "bjw-s.common.lib.statefulset.volumeclaimtemplate" (dict "rootContext" $rootContext "values" $volumeClaimTemplate) -}} + {{- $volumeClaimTemplates = append $volumeClaimTemplates ($vct | fromYaml) -}} + {{- end -}} + + {{- if not (empty $volumeClaimTemplates) -}} + {{ $volumeClaimTemplates | toYaml }} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/loader/_all.tpl b/thunder_deployment/infra/beta9/charts/common/templates/loader/_all.tpl new file mode 100644 index 000000000..f0b700788 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/loader/_all.tpl @@ -0,0 +1,10 @@ +{{/* +Main entrypoint for the common library chart. It will render all underlying templates based on the provided values. +*/}} +{{- define "bjw-s.common.loader.all" -}} + {{- /* Generate chart and dependency values */ -}} + {{- include "bjw-s.common.loader.init" . -}} + + {{- /* Generate remaining objects */ -}} + {{- include "bjw-s.common.loader.generate" . -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/loader/_generate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/loader/_generate.tpl new file mode 100644 index 000000000..43750162a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/loader/_generate.tpl @@ -0,0 +1,16 @@ +{{/* +Secondary entrypoint and primary loader for the common chart +*/}} +{{- define "bjw-s.common.loader.generate" -}} + {{- /* Build the templates */ -}} + {{- include "bjw-s.common.render.pvcs" . | nindent 0 -}} + {{- include "bjw-s.common.render.serviceAccount" . | nindent 0 -}} + {{- include "bjw-s.common.render.controllers" . | nindent 0 -}} + {{- include "bjw-s.common.render.services" . | nindent 0 -}} + {{- include "bjw-s.common.render.ingresses" . | nindent 0 -}} + {{- include "bjw-s.common.render.serviceMonitors" . | nindent 0 -}} + {{- include "bjw-s.common.render.routes" . | nindent 0 -}} + {{- include "bjw-s.common.render.configMaps" . | nindent 0 -}} + {{- include "bjw-s.common.render.secrets" . | nindent 0 -}} + {{- include "bjw-s.common.render.networkpolicies" . | nindent 0 -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/loader/_init.tpl b/thunder_deployment/infra/beta9/charts/common/templates/loader/_init.tpl new file mode 100644 index 000000000..95f63f62c --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/loader/_init.tpl @@ -0,0 +1,4 @@ +{{- define "bjw-s.common.loader.init" -}} + {{- /* Merge the local chart values and the common chart defaults */ -}} + {{- include "bjw-s.common.values.init" . }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_configmaps.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_configmaps.tpl new file mode 100644 index 000000000..7d69205df --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/render/_configmaps.tpl @@ -0,0 +1,26 @@ +{{/* +Renders the configMap objects required by the chart. +*/}} +{{- define "bjw-s.common.render.configMaps" -}} + {{- /* Generate named configMaps as required */ -}} + {{- range $key, $configMap := .Values.configMaps }} + {{- /* Enable configMap by default, but allow override */ -}} + {{- $configMapEnabled := true -}} + {{- if hasKey $configMap "enabled" -}} + {{- $configMapEnabled = $configMap.enabled -}} + {{- end -}} + + {{- if $configMapEnabled -}} + {{- $configMapValues := (mustDeepCopy $configMap) -}} + + {{- /* Create object from the raw configMap values */ -}} + {{- $configMapObject := (include "bjw-s.common.lib.configMap.valuesToObject" (dict "rootContext" $ "id" $key "values" $configMapValues)) | fromYaml -}} + + {{- /* Perform validations on the configMap before rendering */ -}} + {{- include "bjw-s.common.lib.configMap.validate" (dict "rootContext" $ "object" $configMapObject) -}} + + {{/* Include the configMap class */}} + {{- include "bjw-s.common.class.configMap" (dict "rootContext" $ "object" $configMapObject) | nindent 0 -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_controllers.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_controllers.tpl new file mode 100644 index 000000000..0d58998f4 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/render/_controllers.tpl @@ -0,0 +1,45 @@ +{{/* +Renders the controller objects required by the chart. +*/}} +{{- define "bjw-s.common.render.controllers" -}} + {{- /* Generate named controller objects as required */ -}} + {{- range $key, $controller := .Values.controllers -}} + {{- /* Enable controller by default, but allow override */ -}} + {{- $controllerEnabled := true -}} + {{- if hasKey $controller "enabled" -}} + {{- $controllerEnabled = $controller.enabled -}} + {{- end -}} + + {{- if $controllerEnabled -}} + {{- $controllerValues := $controller -}} + + {{- /* Create object from the raw controller values */ -}} + {{- $controllerObject := (include "bjw-s.common.lib.controller.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerValues)) | fromYaml -}} + + {{- /* Perform validations on the controller before rendering */ -}} + {{- include "bjw-s.common.lib.controller.validate" (dict "rootContext" $ "object" $controllerObject) -}} + + {{- if eq $controllerObject.type "deployment" -}} + {{- $deploymentObject := (include "bjw-s.common.lib.deployment.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} + {{- include "bjw-s.common.lib.deployment.validate" (dict "rootContext" $ "object" $deploymentObject) -}} + {{- include "bjw-s.common.class.deployment" (dict "rootContext" $ "object" $deploymentObject) | nindent 0 -}} + {{- else if eq $controllerObject.type "cronjob" -}} + {{- $cronjobObject := (include "bjw-s.common.lib.cronjob.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} + {{- include "bjw-s.common.lib.cronjob.validate" (dict "rootContext" $ "object" $cronjobObject) -}} + {{- include "bjw-s.common.class.cronjob" (dict "rootContext" $ "object" $cronjobObject) | nindent 0 -}} + {{- else if eq $controllerObject.type "daemonset" -}} + {{- $daemonsetObject := (include "bjw-s.common.lib.daemonset.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} + {{- include "bjw-s.common.lib.daemonset.validate" (dict "rootContext" $ "object" $daemonsetObject) -}} + {{- include "bjw-s.common.class.daemonset" (dict "rootContext" $ "object" $daemonsetObject) | nindent 0 -}} + {{- else if eq $controllerObject.type "statefulset" -}} + {{- $statefulsetObject := (include "bjw-s.common.lib.statefulset.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} + {{- include "bjw-s.common.lib.statefulset.validate" (dict "rootContext" $ "object" $statefulsetObject) -}} + {{- include "bjw-s.common.class.statefulset" (dict "rootContext" $ "object" $statefulsetObject) | nindent 0 -}} + {{- else if eq $controllerObject.type "job" -}} + {{- $jobObject := (include "bjw-s.common.lib.job.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} + {{- include "bjw-s.common.lib.job.validate" (dict "rootContext" $ "object" $jobObject) -}} + {{- include "bjw-s.common.class.job" (dict "rootContext" $ "object" $jobObject) | nindent 0 -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_ingresses.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_ingresses.tpl new file mode 100644 index 000000000..c0cbc24a0 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/render/_ingresses.tpl @@ -0,0 +1,26 @@ +{{/* +Renders the Ingress objects required by the chart. +*/}} +{{- define "bjw-s.common.render.ingresses" -}} + {{- /* Generate named Ingresses as required */ -}} + {{- range $key, $ingress := .Values.ingress }} + {{- /* Enable Ingress by default, but allow override */ -}} + {{- $ingressEnabled := true -}} + {{- if hasKey $ingress "enabled" -}} + {{- $ingressEnabled = $ingress.enabled -}} + {{- end -}} + + {{- if $ingressEnabled -}} + {{- $ingressValues := (mustDeepCopy $ingress) -}} + + {{- /* Create object from the raw ingress values */ -}} + {{- $ingressObject := (include "bjw-s.common.lib.ingress.valuesToObject" (dict "rootContext" $ "id" $key "values" $ingressValues)) | fromYaml -}} + + {{- /* Perform validations on the ingress before rendering */ -}} + {{- include "bjw-s.common.lib.ingress.validate" (dict "rootContext" $ "object" $ingressObject) -}} + + {{/* Include the ingress class */}} + {{- include "bjw-s.common.class.ingress" (dict "rootContext" $ "object" $ingressObject) | nindent 0 -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_networkpolicies.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_networkpolicies.tpl new file mode 100644 index 000000000..d35a591ba --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/render/_networkpolicies.tpl @@ -0,0 +1,26 @@ +{{/* +Renders the networkPolicy objects required by the chart. +*/}} +{{- define "bjw-s.common.render.networkpolicies" -}} + {{- /* Generate named networkPolicy as required */ -}} + {{- range $key, $networkPolicy := .Values.networkpolicies }} + {{- /* Enable networkPolicy by default, but allow override */ -}} + {{- $networkPolicyEnabled := true -}} + {{- if hasKey $networkPolicy "enabled" -}} + {{- $networkPolicyEnabled = $networkPolicy.enabled -}} + {{- end -}} + + {{- if $networkPolicyEnabled -}} + {{- $networkPolicyValues := (mustDeepCopy $networkPolicy) -}} + + {{- /* Create object from the raw networkPolicy values */ -}} + {{- $networkPolicyObject := (include "bjw-s.common.lib.networkpolicy.valuesToObject" (dict "rootContext" $ "id" $key "values" $networkPolicyValues)) | fromYaml -}} + + {{- /* Perform validations on the networkPolicy before rendering */ -}} + {{- include "bjw-s.common.lib.networkpolicy.validate" (dict "rootContext" $ "object" $networkPolicyObject) -}} + + {{/* Include the networkPolicy class */}} + {{- include "bjw-s.common.class.networkpolicy" (dict "rootContext" $ "object" $networkPolicyObject) | nindent 0 -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_pvcs.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_pvcs.tpl new file mode 100644 index 000000000..98d7df5e3 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/render/_pvcs.tpl @@ -0,0 +1,26 @@ +{{/* +Renders the Persistent Volume Claim objects required by the chart. +*/}} +{{- define "bjw-s.common.render.pvcs" -}} + {{- /* Generate pvc as required */ -}} + {{- range $key, $pvc := .Values.persistence -}} + {{- /* Enable PVC by default, but allow override */ -}} + {{- $pvcEnabled := true -}} + {{- if hasKey $pvc "enabled" -}} + {{- $pvcEnabled = $pvc.enabled -}} + {{- end -}} + + {{- if and $pvcEnabled (eq (default "persistentVolumeClaim" $pvc.type) "persistentVolumeClaim") (not $pvc.existingClaim) -}} + {{- $pvcValues := (mustDeepCopy $pvc) -}} + + {{- /* Create object from the raw PVC values */ -}} + {{- $pvcObject := (include "bjw-s.common.lib.pvc.valuesToObject" (dict "rootContext" $ "id" $key "values" $pvcValues)) | fromYaml -}} + + {{- /* Perform validations on the PVC before rendering */ -}} + {{- include "bjw-s.common.lib.pvc.validate" (dict "rootContext" $ "object" $pvcValues) -}} + + {{- /* Include the PVC class */ -}} + {{- include "bjw-s.common.class.pvc" (dict "rootContext" $ "object" $pvcValues) | nindent 0 -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_routes.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_routes.tpl new file mode 100644 index 000000000..12e89caac --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/render/_routes.tpl @@ -0,0 +1,24 @@ +{{/* Renders the Route objects required by the chart */}} +{{- define "bjw-s.common.render.routes" -}} + {{- /* Generate named routes as required */ -}} + {{- range $key, $route := .Values.route }} + {{- /* Enable Route by default, but allow override */ -}} + {{- $routeEnabled := true -}} + {{- if hasKey $route "enabled" -}} + {{- $routeEnabled = $route.enabled -}} + {{- end -}} + + {{- if $routeEnabled -}} + {{- $routeValues := (mustDeepCopy $route) -}} + + {{- /* Create object from the raw Route values */ -}} + {{- $routeObject := (include "bjw-s.common.lib.route.valuesToObject" (dict "rootContext" $ "id" $key "values" $routeValues)) | fromYaml -}} + + {{- /* Perform validations on the Route before rendering */ -}} + {{- include "bjw-s.common.lib.route.validate" (dict "rootContext" $ "object" $routeObject) -}} + + {{- /* Include the Route class */ -}} + {{- include "bjw-s.common.class.route" (dict "rootContext" $ "object" $routeObject) | nindent 0 -}} + {{- end }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_secrets.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_secrets.tpl new file mode 100644 index 000000000..feaaed2db --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/render/_secrets.tpl @@ -0,0 +1,26 @@ +{{/* +Renders the Secret objects required by the chart. +*/}} +{{- define "bjw-s.common.render.secrets" -}} + {{- /* Generate named Secrets as required */ -}} + {{- range $key, $secret := .Values.secrets }} + {{- /* Enable Secret by default, but allow override */ -}} + {{- $secretEnabled := true -}} + {{- if hasKey $secret "enabled" -}} + {{- $secretEnabled = $secret.enabled -}} + {{- end -}} + + {{- if $secretEnabled -}} + {{- $secretValues := (mustDeepCopy $secret) -}} + + {{- /* Create object from the raw Secret values */ -}} + {{- $secretObject := (include "bjw-s.common.lib.secret.valuesToObject" (dict "rootContext" $ "id" $key "values" $secretValues)) | fromYaml -}} + + {{- /* Perform validations on the Secret before rendering */ -}} + {{- include "bjw-s.common.lib.secret.validate" (dict "rootContext" $ "object" $secretObject) -}} + + {{/* Include the Secret class */}} + {{- include "bjw-s.common.class.secret" (dict "rootContext" $ "object" $secretObject) | nindent 0 -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_serviceMonitors.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_serviceMonitors.tpl new file mode 100644 index 000000000..ab8c1ff24 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/render/_serviceMonitors.tpl @@ -0,0 +1,26 @@ +{{/* +Renders the serviceMonitor objects required by the chart. +*/}} +{{- define "bjw-s.common.render.serviceMonitors" -}} + {{- /* Generate named serviceMonitors as required */ -}} + {{- range $key, $serviceMonitor := .Values.serviceMonitor -}} + {{- /* Enable ServiceMonitor by default, but allow override */ -}} + {{- $serviceMonitorEnabled := true -}} + {{- if hasKey $serviceMonitor "enabled" -}} + {{- $serviceMonitorEnabled = $serviceMonitor.enabled -}} + {{- end -}} + + {{- if $serviceMonitorEnabled -}} + {{- $serviceMonitorValues := (mustDeepCopy $serviceMonitor) -}} + + {{- /* Create object from the raw ServiceMonitor values */ -}} + {{- $serviceMonitorObject := (include "bjw-s.common.lib.serviceMonitor.valuesToObject" (dict "rootContext" $ "id" $key "values" $serviceMonitorValues)) | fromYaml -}} + + {{- /* Perform validations on the serviceMonitor before rendering */ -}} + {{- include "bjw-s.common.lib.serviceMonitor.validate" (dict "rootContext" $ "object" $serviceMonitorObject) -}} + + {{/* Include the serviceMonitor class */}} + {{- include "bjw-s.common.class.serviceMonitor" (dict "rootContext" $ "object" $serviceMonitorObject) | nindent 0 -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_serviceaccount.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_serviceaccount.tpl new file mode 100644 index 000000000..ad6f49a65 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/render/_serviceaccount.tpl @@ -0,0 +1,20 @@ +{{/* +Renders the serviceAccount object required by the chart. +*/}} +{{- define "bjw-s.common.render.serviceAccount" -}} + {{- if .Values.serviceAccount.create -}} + {{- $serviceAccountValues := (mustDeepCopy .Values.serviceAccount) -}} + + {{- /* Create object from the raw ServiceAccount values */ -}} + {{- $serviceAccountObject := (include "bjw-s.common.lib.serviceAccount.valuesToObject" (dict "rootContext" $ "id" "default" "values" $serviceAccountValues)) | fromYaml -}} + + {{- /* Perform validations on the ServiceAccount before rendering */ -}} + {{- include "bjw-s.common.lib.serviceAccount.validate" (dict "rootContext" $ "object" $serviceAccountObject) -}} + + {{/* Include the serviceAccount class */}} + {{- include "bjw-s.common.class.serviceAccount" (dict "rootContext" $ "object" $serviceAccountObject) | nindent 0 -}} + + {{- /* Create a service account secret */ -}} + {{- $_ := set .Values.secrets "sa-token" (dict "enabled" true "annotations" (dict "kubernetes.io/service-account.name" $serviceAccountObject.name) "type" "kubernetes.io/service-account-token") -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_services.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_services.tpl new file mode 100644 index 000000000..cf6f6ee8b --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/render/_services.tpl @@ -0,0 +1,19 @@ +{{/* +Renders the Service objects required by the chart. +*/}} +{{- define "bjw-s.common.render.services" -}} + {{- /* Generate named Services as required */ -}} + {{- $enabledServices := (include "bjw-s.common.lib.service.enabledServices" (dict "rootContext" $) | fromYaml ) -}} + {{- range $key, $svc := $enabledServices -}} + {{- $serviceValues := (mustDeepCopy $svc) -}} + + {{- /* Create object from the raw Service values */ -}} + {{- $serviceObject := (include "bjw-s.common.lib.service.valuesToObject" (dict "rootContext" $ "id" $key "values" $serviceValues)) | fromYaml -}} + + {{- /* Perform validations on the Service before rendering */ -}} + {{- include "bjw-s.common.lib.service.validate" (dict "rootContext" $ "object" $serviceObject) -}} + + {{- /* Include the Service class */ -}} + {{- include "bjw-s.common.class.service" (dict "rootContext" $ "object" $serviceObject) | nindent 0 -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/values/_init.tpl b/thunder_deployment/infra/beta9/charts/common/templates/values/_init.tpl new file mode 100644 index 000000000..e9a7af8f1 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/templates/values/_init.tpl @@ -0,0 +1,11 @@ +{{/* +Merge the local chart values and the common chart defaults +*/}} +{{- define "bjw-s.common.values.init" -}} + {{- if .Values.common -}} + {{- $defaultValues := deepCopy .Values.common -}} + {{- $userValues := deepCopy (omit .Values "common") -}} + {{- $mergedValues := mustMergeOverwrite $defaultValues $userValues -}} + {{- $_ := set . "Values" (deepCopy $mergedValues) -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/values.yaml b/thunder_deployment/infra/beta9/charts/common/values.yaml new file mode 100644 index 000000000..30b1bd135 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/common/values.yaml @@ -0,0 +1,740 @@ +--- +global: + # -- Set an override for the prefix of the fullname + nameOverride: + # -- Set the entire name definition + fullnameOverride: + # -- Set additional global labels. Helm templates can be used. + labels: {} + # -- Set additional global annotations. Helm templates can be used. + annotations: {} + +# -- Set default options for all controllers / pods here +# Each of these options can be overridden on a Controller level +defaultPodOptions: + # -- Defines affinity constraint rules. + # [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity) + affinity: {} + + # -- Set annotations on the Pod. Pod-specific values will be merged with this. + annotations: {} + + # -- Specifies whether a service account token should be automatically mounted. + automountServiceAccountToken: true + + # -- Configuring the ndots option may resolve nslookup issues on some Kubernetes setups. + dnsConfig: + {} + # options: + # - name: ndots + # value: "1" + + # -- Defaults to "ClusterFirst" if hostNetwork is false + # and "ClusterFirstWithHostNet" if hostNetwork is true. + dnsPolicy: # ClusterFirst + + # -- Enable/disable the generation of environment variables for services. + # [[ref]](https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#accessing-the-service) + enableServiceLinks: true + + # -- Allows specifying explicit hostname setting + hostname: + + # -- Use hostAliases to add custom entries to /etc/hosts - mapping IP addresses to hostnames. + # [[ref]](https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/) + hostAliases: [] + # - ip: "192.168.1.100" + # hostnames: + # - "example.com" + # - "www.example.com" + + # -- Use the host's ipc namespace + hostIPC: false + + # -- When using hostNetwork make sure you set dnsPolicy to `ClusterFirstWithHostNet` + hostNetwork: false + + # -- Use the host's pid namespace + hostPID: false + + # -- Set image pull secrets + imagePullSecrets: [] + + # -- Set labels on the Pod. Pod-specific values will be merged with this. + labels: {} + + # -- Node selection constraint + # [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector) + nodeSelector: {} + + # -- Custom priority class for different treatment by the scheduler + priorityClassName: # system-node-critical + + # -- Set Container restart policy. + # @default -- `Always`. When `controller.type` is `cronjob` it defaults to `Never`. + restartPolicy: + + # -- Allow specifying a runtimeClassName other than the default one (ie: nvidia) + runtimeClassName: # nvidia + + # -- Allows specifying a custom scheduler name + schedulerName: # awkward-dangerous-scheduler + + # -- Configure the Security Context for the Pod + securityContext: {} + + # -- Duration in seconds the pod needs to terminate gracefully + # -- [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle)] + terminationGracePeriodSeconds: + + # -- Specify taint tolerations + # [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) + tolerations: [] + + # -- Defines topologySpreadConstraint rules. + # [[ref]](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) + topologySpreadConstraints: [] + # - maxSkew: + # topologyKey: + # whenUnsatisfiable: + # labelSelector: + +controllers: + main: + # -- enable the controller. + enabled: true + + # -- Set the controller type. + # Valid options are deployment, daemonset, statefulset, cronjob or job + type: deployment + # -- Set annotations on the deployment/statefulset/daemonset/cronjob/job + annotations: {} + # -- Set labels on the deployment/statefulset/daemonset/cronjob/job + labels: {} + # -- Number of desired pods. When using a HorizontalPodAutoscaler, set this to `null`. + replicas: 1 + # -- Set the controller upgrade strategy + # For Deployments, valid values are Recreate (default) and RollingUpdate. + # For StatefulSets, valid values are OnDelete and RollingUpdate (default). + # DaemonSets/CronJobs/Jobs ignore this. + strategy: + + rollingUpdate: + # -- Set deployment RollingUpdate max unavailable + unavailable: + # -- Set deployment RollingUpdate max surge + surge: + # -- Set statefulset RollingUpdate partition + partition: + # -- ReplicaSet revision history limit + revisionHistoryLimit: 3 + + # -- CronJob configuration. Required only when using `controller.type: cronjob`. + # @default -- See below + cronjob: + # -- Suspends the CronJob + # [[ref]](https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#schedule-suspension) + # @default -- false + suspend: + # -- Specifies how to treat concurrent executions of a job that is created by this cron job + # valid values are Allow, Forbid or Replace + concurrencyPolicy: Forbid + # -- Sets the CronJob timezone (only works in Kubernetes >= 1.27) + timeZone: + # -- Sets the CronJob time when to execute your jobs + schedule: "*/20 * * * *" + # -- The deadline in seconds for starting the job if it misses its scheduled time for any reason + startingDeadlineSeconds: 30 + # -- The number of succesful Jobs to keep + successfulJobsHistory: 1 + # -- The number of failed Jobs to keep + failedJobsHistory: 1 + # -- If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to + # be automatically deleted. + ttlSecondsAfterFinished: + # -- Limits the number of times a failed job will be retried + backoffLimit: 6 + + # -- Job configuration. Required only when using `controller.type: job`. + # @default -- See below + job: + # -- Suspends the Job + # [[ref]](https://kubernetes.io/docs/concepts/workloads/controllers/job/#suspending-a-job) + # @default -- false + suspend: + # -- If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to + # be automatically deleted. + ttlSecondsAfterFinished: + # -- Limits the number of times a failed job will be retried + backoffLimit: 6 + + # -- StatefulSet configuration. Required only when using `controller.type: statefulset`. + statefulset: + # -- Set podManagementPolicy, valid values are Parallel and OrderedReady (default). + podManagementPolicy: + + # -- Used to create individual disks for each instance. + volumeClaimTemplates: [] + # - name: data + # labels: {} + # annotations: {} + # globalMounts: + # - path: /data + # accessMode: "ReadWriteOnce" + # dataSourceRef: + # apiGroup: snapshot.storage.k8s.io + # kind: VolumeSnapshot + # name: MySnapshot + # size: 1Gi + # - name: backup + # labels: {} + # annotations: {} + # globalMounts: + # - path: /backup + # subPath: theSubPath + # accessMode: "ReadWriteOnce" + # size: 2Gi + # storageClass: cheap-storage-class + + # Controller-specific overrides for `defaultPodOptions` keys + pod: {} + + containers: + main: + # -- Override the container name + nameOverride: + + # -- Override the default container order + # Containers get sorted alphanumerically by the `-` combination. + # @default -- 99 + order: 1 + + # -- Specify if this container depends on any other containers + # This is used to determine the order in which the containers are rendered. + # The use of "dependsOn" completely disables the "order" field within the controller. + dependsOn: [] + + image: + # -- image repository + repository: + # -- image tag + tag: + # -- image pull policy + pullPolicy: + + # -- Override the command(s) for the default container + command: [] + # -- Override the args for the default container + args: [] + # -- Override the working directory for the default container + workingDir: + + # -- Environment variables. Template enabled. + # Syntax options: + # A) TZ: UTC + # B) PASSWD: '{{ .Release.Name }}' + # B) TZ: + # value: UTC + # dependsOn: otherVar + # D) PASSWD: + # configMapKeyRef: + # name: config-map-name + # key: key-name + # E) PASSWD: + # dependsOn: + # - otherVar1 + # - otherVar2 + # valueFrom: + # secretKeyRef: + # name: secret-name + # key: key-name + # ... + # F) - name: TZ + # value: UTC + # G) - name: TZ + # value: '{{ .Release.Name }}' + env: + + # -- Secrets and/or ConfigMaps that will be loaded as environment variables. + # Syntax options: + # A) Pass an app-template configMap identifier: + # - config: config + # B) Pass any configMap name that is not also an identifier (Template enabled): + # - config: random-configmap-name + # C) Pass an app-template configMap identifier, explicit syntax: + # - configMapRef: + # identifier: config + # D) Pass any configMap name, explicit syntax (Template enabled): + # - configMapRef: + # name: "{{ .Release.Name }}-config" + # E) Pass an app-template secret identifier: + # - secret: secret + # F) Pass any secret name that is not also an identifier (Template enabled): + # - secret: random-secret-name + # G) Pass an app-template secret identifier, explicit syntax: + # - secretRef: + # identifier: secret + # H) Pass any secret name, explicit syntax (Template enabled): + # - secretRef: + # name: "{{ .Release.Name }}-secret" + envFrom: [] + + # -- Probe configuration + # -- [[ref]](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) + # @default -- See below + probes: + # -- Liveness probe configuration + # @default -- See below + liveness: + # -- Enable the liveness probe + enabled: true + # -- Set this to `true` if you wish to specify your own livenessProbe + custom: false + # -- sets the probe type when not using a custom probe + # @default -- "TCP" + type: TCP + # -- The spec field contains the values for the default livenessProbe. + # If you selected `custom: true`, this field holds the definition of the livenessProbe. + # @default -- See below + spec: + initialDelaySeconds: 0 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + + # -- Redainess probe configuration + # @default -- See below + readiness: + # -- Enable the readiness probe + enabled: true + # -- Set this to `true` if you wish to specify your own readinessProbe + custom: false + # -- sets the probe type when not using a custom probe + # @default -- "TCP" + type: TCP + # -- The spec field contains the values for the default readinessProbe. + # If you selected `custom: true`, this field holds the definition of the readinessProbe. + # @default -- See below + spec: + initialDelaySeconds: 0 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + + # -- Startup probe configuration + # @default -- See below + startup: + # -- Enable the startup probe + enabled: true + # -- Set this to `true` if you wish to specify your own startupProbe + custom: false + # -- sets the probe type when not using a custom probe + # @default -- "TCP" + type: TCP + # -- The spec field contains the values for the default startupProbe. + # If you selected `custom: true`, this field holds the definition of the startupProbe. + # @default -- See below + spec: + initialDelaySeconds: 0 + timeoutSeconds: 1 + ## This means it has a maximum of 5*30=150 seconds to start up before it fails + periodSeconds: 5 + failureThreshold: 30 + + # -- Set the resource requests / limits for the container. + resources: + {} + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + # -- Configure the Security Context for the container + securityContext: {} + + # -- Configure the lifecycle event hooks for the container + # -- [[ref](https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/)] + lifecycle: {} + + # -- Configure the path at which the file to which the containers termination message will be written. + # -- [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle-1)] + terminationMessagePath: + + # -- Indicate how the containers termination message should be populated. + # Valid options are `File` and `FallbackToLogsOnError`. + # -- [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle-1)] + terminationMessagePolicy: + + # -- Specify any initContainers here as dictionary items. + # Each initContainer should have its own key + # initContainers get sorted alphanumerically by the `-` combination + # if no order or dependsOn has been configured for them. + initContainers: {} + +serviceAccount: + # -- Specifies whether a service account should be created + create: false + + # -- Annotations to add to the service account + annotations: {} + + # -- Labels to add to the service account + labels: {} + + # -- The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +# -- Use this to populate secrets with the values you specify. +# Be aware that these values are not encrypted by default, and could therefore visible +# to anybody with access to the values.yaml file. +# Additional Secrets can be added by adding a dictionary key similar to the 'secret' object. +# @default -- See below +secrets: + secret: + # -- Enables or disables the Secret + enabled: false + # -- Labels to add to the Secret + labels: {} + # -- Annotations to add to the Secret + annotations: {} + # -- Secret stringData content. Helm template enabled. + stringData: + {} + # foo: bar + +# -- Configure configMaps for the chart here. +# Additional configMaps can be added by adding a dictionary key similar to the 'config' object. +# @default -- See below +configMaps: + config: + # -- Enables or disables the configMap + enabled: false + # -- Labels to add to the configMap + labels: {} + # -- Annotations to add to the configMap + annotations: {} + # -- configMap data content. Helm template enabled. + data: + {} + # foo: bar + +# -- Configure the services for the chart here. +# Additional services can be added by adding a dictionary key similar to the 'main' service. +# @default -- See below +service: + main: + # -- Enables or disables the service + enabled: true + + # -- Override the name suffix that is used for this service + nameOverride: + + # -- Configure which controller this service should target + controller: main + + # -- Make this the primary service for this controller (used in probes, notes, etc...). + # If there is more than 1 service targeting the controller, make sure that only 1 service is + # marked as primary. + primary: true + + # -- Set the service type + type: ClusterIP + + # -- Specify the externalTrafficPolicy for the service. Options: Cluster, Local + # -- [[ref](https://kubernetes.io/docs/tutorials/services/source-ip/)] + externalTrafficPolicy: + + # -- Specify the ip policy. Options: SingleStack, PreferDualStack, RequireDualStack + ipFamilyPolicy: + # -- The ip families that should be used. Options: IPv4, IPv6 + ipFamilies: [] + + # -- Provide additional annotations which may be required. + annotations: {} + + # -- Provide additional labels which may be required. + labels: {} + + # -- Allow adding additional match labels + extraSelectorLabels: {} + + # -- Configure the Service port information here. + # Additional ports can be added by adding a dictionary key similar to the 'http' service. + # @default -- See below + ports: + http: + # -- Enables or disables the port + enabled: true + + # -- Make this the primary port (used in probes, notes, etc...) + # If there is more than 1 service, make sure that only 1 port is marked as primary. + primary: true + + # -- The port number + port: + + # -- Port protocol. + # Support values are `HTTP`, `HTTPS`, `TCP` and `UDP`. + # HTTP and HTTPS spawn a TCP service and get used for internal URL and name generation + protocol: HTTP + + # -- Specify a service targetPort if you wish to differ the service port from the application port. + # If `targetPort` is specified, this port number is used in the container definition instead of + # the `port` value. Therefore named ports are not supported for this field. + targetPort: + + # -- Specify the nodePort value for the LoadBalancer and NodePort service types. + # [[ref]](https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport) + nodePort: + + # -- Specify the appProtocol value for the Service. + # [[ref]](https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol) + appProtocol: + +# -- Configure the ServiceMonitors for the chart here. +# Additional ServiceMonitors can be added by adding a dictionary key similar to the 'main' ServiceMonitors. +# @default -- See below +serviceMonitor: + main: + # -- Enables or disables the serviceMonitor. + enabled: false + + # -- Override the name suffix that is used for this serviceMonitor. + nameOverride: + + # -- Provide additional annotations which may be required. + annotations: {} + + # -- Provide additional labels which may be required. + labels: {} + + # -- Configures a custom selector for the serviceMonitor, this takes precedence over + # specifying a service name. + # Helm templates can be used. + selector: {} + + # -- Configures the target Service for the serviceMonitor. Helm templates can be used. + serviceName: '{{ include "bjw-s.common.lib.chart.names.fullname" $ }}' + + # -- Configures the endpoints for the serviceMonitor. + # @default -- See values.yaml + endpoints: + - port: http + scheme: http + path: /metrics + interval: 1m + scrapeTimeout: 10s + + # -- Configures custom targetLabels for the serviceMonitor. (All collected + # meterics will have these labels, taking the value from the target service) + # [[ref]](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#servicemonitorspec/) + targetLabels: [] + +# -- Configure the ingresses for the chart here. +# Additional ingresses can be added by adding a dictionary key similar to the 'main' ingress. +# @default -- See below +ingress: + main: + # -- Enables or disables the ingress + enabled: false + + # -- Make this the primary ingress (used in probes, notes, etc...). + # If there is more than 1 ingress, make sure that only 1 ingress is marked as primary. + primary: true + + # -- Override the name suffix that is used for this ingress. + nameOverride: + + # -- Provide additional annotations which may be required. + annotations: + {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + + # -- Provide additional labels which may be required. + labels: {} + + # -- Set the ingressClass that is used for this ingress. + className: # "nginx" + + # -- Configure the defaultBackend for this ingress. This will disable any other rules for the ingress. + defaultBackend: + + ## Configure the hosts for the ingress + hosts: + - # -- Host address. Helm template can be passed. + host: chart-example.local + ## Configure the paths for the host + paths: + - # -- Path. Helm template can be passed. + path: / + pathType: Prefix + service: + # -- Overrides the service name reference for this path + # This can be an actual service name, or reference a service identifier + # from this values.yaml + name: main + # -- Overrides the service port number reference for this path + port: + + # -- Configure TLS for the ingress. Both secretName and hosts can process a Helm template. + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +# -- Configure the gateway routes for the chart here. +# Additional routes can be added by adding a dictionary key similar to the 'main' route. +# [[ref]](https://gateway-api.sigs.k8s.io/references/spec/) +# @default -- See below +route: + main: + # -- Enables or disables the route + enabled: false + + # -- Set the route kind + # Valid options are GRPCRoute, HTTPRoute, TCPRoute, TLSRoute, UDPRoute + kind: HTTPRoute + + # -- Override the name suffix that is used for this route. + nameOverride: + + # -- Provide additional annotations which may be required. + annotations: {} + + # -- Provide additional labels which may be required. + labels: {} + + # -- Configure the resource the route attaches to. + parentRefs: + - # Group of the referent resource. + group: gateway.networking.k8s.io + # Kind of the referent resource. + kind: Gateway + # Name of the referent resource + name: + # Namespace of the referent resource + namespace: + # Name of the section within the target resource. + sectionName: + + # -- Host addresses. Helm template can be passed. + hostnames: [] + + # -- Configure rules for routing. Defaults to the primary service. + rules: + - # -- Configure backends where matching requests should be sent. + backendRefs: [] + ## Configure conditions used for matching incoming requests. Only for HTTPRoutes + matches: + - path: + type: PathPrefix + value: / + ## Request filters that are applied to the rules. + filters: [] + ## Request timeout that are applied to the rules. + timeouts: {} + +# -- Configure persistence for the chart here. +# Additional items can be added by adding a dictionary key similar to the 'config' key. +# [[ref]](https://bjw-s.github.io/helm-charts/docs/common-library/common-library-storage) +# @default -- See below +persistence: + config: + # -- Enables or disables the persistence item. Defaults to true + enabled: false + + # -- Sets the persistence type + # Valid options are persistentVolumeClaim, emptyDir, nfs, hostPath, secret, configMap or custom + type: persistentVolumeClaim + + # -- Storage Class for the config volume. + # If set to `-`, dynamic provisioning is disabled. + # If set to something else, the given storageClass is used. + # If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. + storageClass: # "-" + + # -- If you want to reuse an existing claim, the name of the existing PVC can be passed here. + existingClaim: # your-claim + + # -- The optional data source for the persistentVolumeClaim. + # [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-populators-and-data-sources) + dataSource: {} + + # -- The optional volume populator for the persistentVolumeClaim. + # [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-populators-and-data-sources) + dataSourceRef: {} + + # -- AccessMode for the persistent volume. + # Make sure to select an access mode that is supported by your storage provider! + # [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes) + accessMode: ReadWriteOnce + + # -- The amount of storage that is requested for the persistent volume. + size: 1Gi + + # -- Set to true to retain the PVC upon `helm uninstall` + retain: false + + # -- Configure mounts to all controllers and containers. By default the persistence item + # will be mounted to `/`. + # Example: + # globalMounts: + # - path: /config + # readOnly: false + globalMounts: [] + + # -- Explicitly configure mounts for specific controllers and containers. + # Example: + # advancedMounts: + # main: # the controller with the "main" identifier + # main: # the container with the "main" identifier + # - path: /data/config.yaml + # readOnly: true + # mountPropagation: None + # subPath: config.yaml + # second-container: # the container with the "second-container" identifier + # - path: /appdata/config + # readOnly: true + # second-controller: # the controller with the "second-controller" identifier + # main: # the container with the "main" identifier + # - path: /data/config.yaml + # readOnly: false + # subPath: config.yaml + advancedMounts: {} + +# -- Configure the networkPolicies for the chart here. +# Additional networkPolicies can be added by adding a dictionary key similar to the 'main' networkPolicy. +# @default -- See below +networkpolicies: + main: + # -- Enables or disables the networkPolicy item. Defaults to true + enabled: false + + # -- Configure which controller this networkPolicy should target + controller: main + + # -- Define a custom podSelector for the networkPolicy. This takes precedence over targeting a controller. + # podSelector: {} + + # -- The policyTypes for this networkPolicy + policyTypes: + - Ingress + - Egress + + # -- The rulesets for this networkPolicy + # [[ref]](https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource) + rules: + # -- The ingress rules for this networkPolicy. Allows all ingress traffic by default. + ingress: + - {} + # -- The egress rules for this networkPolicy. Allows all egress traffic by default. + egress: + - {} diff --git a/thunder_deployment/infra/beta9/charts/grafana/.helmignore b/thunder_deployment/infra/beta9/charts/grafana/.helmignore new file mode 100644 index 000000000..8cade1318 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.vscode +.project +.idea/ +*.tmproj +OWNERS diff --git a/thunder_deployment/infra/beta9/charts/grafana/Chart.yaml b/thunder_deployment/infra/beta9/charts/grafana/Chart.yaml new file mode 100644 index 000000000..5398b764d --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/Chart.yaml @@ -0,0 +1,33 @@ +annotations: + artifacthub.io/license: Apache-2.0 + artifacthub.io/links: | + - name: Chart Source + url: https://github.com/grafana/helm-charts + - name: Upstream Project + url: https://github.com/grafana/grafana +apiVersion: v2 +appVersion: 10.3.1 +description: The leading tool for querying and visualizing time series and metrics. +home: https://grafana.com +icon: https://artifacthub.io/image/b4fed1a7-6c8f-4945-b99d-096efa3e4116 +keywords: +- monitoring +- metric +kubeVersion: ^1.8.0-0 +maintainers: +- email: zanhsieh@gmail.com + name: zanhsieh +- email: rluckie@cisco.com + name: rtluckie +- email: maor.friedman@redhat.com + name: maorfr +- email: miroslav.hadzhiev@gmail.com + name: Xtigyro +- email: mail@torstenwalter.de + name: torstenwalter +name: grafana +sources: +- https://github.com/grafana/grafana +- https://github.com/grafana/helm-charts +type: application +version: 7.3.0 diff --git a/thunder_deployment/infra/beta9/charts/grafana/README.md b/thunder_deployment/infra/beta9/charts/grafana/README.md new file mode 100644 index 000000000..6f645c564 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/README.md @@ -0,0 +1,769 @@ +# Grafana Helm Chart + +* Installs the web dashboarding system [Grafana](http://grafana.org/) + +## Get Repo Info + +```console +helm repo add grafana https://grafana.github.io/helm-charts +helm repo update +``` + +_See [helm repo](https://helm.sh/docs/helm/helm_repo/) for command documentation._ + +## Installing the Chart + +To install the chart with the release name `my-release`: + +```console +helm install my-release grafana/grafana +``` + +## Uninstalling the Chart + +To uninstall/delete the my-release deployment: + +```console +helm delete my-release +``` + +The command removes all the Kubernetes components associated with the chart and deletes the release. + +## Upgrading an existing Release to a new major version + +A major chart version change (like v1.2.3 -> v2.0.0) indicates that there is an +incompatible breaking change needing manual actions. + +### To 4.0.0 (And 3.12.1) + +This version requires Helm >= 2.12.0. + +### To 5.0.0 + +You have to add --force to your helm upgrade command as the labels of the chart have changed. + +### To 6.0.0 + +This version requires Helm >= 3.1.0. + +### To 7.0.0 + +For consistency with other Helm charts, the `global.image.registry` parameter was renamed +to `global.imageRegistry`. If you were not previously setting `global.image.registry`, no action +is required on upgrade. If you were previously setting `global.image.registry`, you will +need to instead set `global.imageRegistry`. + +## Configuration + +| Parameter | Description | Default | +|-------------------------------------------|-----------------------------------------------|---------------------------------------------------------| +| `replicas` | Number of nodes | `1` | +| `podDisruptionBudget.minAvailable` | Pod disruption minimum available | `nil` | +| `podDisruptionBudget.maxUnavailable` | Pod disruption maximum unavailable | `nil` | +| `podDisruptionBudget.apiVersion` | Pod disruption apiVersion | `nil` | +| `deploymentStrategy` | Deployment strategy | `{ "type": "RollingUpdate" }` | +| `livenessProbe` | Liveness Probe settings | `{ "httpGet": { "path": "/api/health", "port": 3000 } "initialDelaySeconds": 60, "timeoutSeconds": 30, "failureThreshold": 10 }` | +| `readinessProbe` | Readiness Probe settings | `{ "httpGet": { "path": "/api/health", "port": 3000 } }`| +| `securityContext` | Deployment securityContext | `{"runAsUser": 472, "runAsGroup": 472, "fsGroup": 472}` | +| `priorityClassName` | Name of Priority Class to assign pods | `nil` | +| `image.registry` | Image registry | `docker.io` | +| `image.repository` | Image repository | `grafana/grafana` | +| `image.tag` | Overrides the Grafana image tag whose default is the chart appVersion (`Must be >= 5.0.0`) | `` | +| `image.sha` | Image sha (optional) | `` | +| `image.pullPolicy` | Image pull policy | `IfNotPresent` | +| `image.pullSecrets` | Image pull secrets (can be templated) | `[]` | +| `service.enabled` | Enable grafana service | `true` | +| `service.type` | Kubernetes service type | `ClusterIP` | +| `service.port` | Kubernetes port where service is exposed | `80` | +| `service.portName` | Name of the port on the service | `service` | +| `service.appProtocol` | Adds the appProtocol field to the service | `` | +| `service.targetPort` | Internal service is port | `3000` | +| `service.nodePort` | Kubernetes service nodePort | `nil` | +| `service.annotations` | Service annotations (can be templated) | `{}` | +| `service.labels` | Custom labels | `{}` | +| `service.clusterIP` | internal cluster service IP | `nil` | +| `service.loadBalancerIP` | IP address to assign to load balancer (if supported) | `nil` | +| `service.loadBalancerSourceRanges` | list of IP CIDRs allowed access to lb (if supported) | `[]` | +| `service.externalIPs` | service external IP addresses | `[]` | +| `service.externalTrafficPolicy` | change the default externalTrafficPolicy | `nil` | +| `headlessService` | Create a headless service | `false` | +| `extraExposePorts` | Additional service ports for sidecar containers| `[]` | +| `hostAliases` | adds rules to the pod's /etc/hosts | `[]` | +| `ingress.enabled` | Enables Ingress | `false` | +| `ingress.annotations` | Ingress annotations (values are templated) | `{}` | +| `ingress.labels` | Custom labels | `{}` | +| `ingress.path` | Ingress accepted path | `/` | +| `ingress.pathType` | Ingress type of path | `Prefix` | +| `ingress.hosts` | Ingress accepted hostnames | `["chart-example.local"]` | +| `ingress.extraPaths` | Ingress extra paths to prepend to every host configuration. Useful when configuring [custom actions with AWS ALB Ingress Controller](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.6/guide/ingress/annotations/#actions). Requires `ingress.hosts` to have one or more host entries. | `[]` | +| `ingress.tls` | Ingress TLS configuration | `[]` | +| `ingress.ingressClassName` | Ingress Class Name. MAY be required for Kubernetes versions >= 1.18 | `""` | +| `resources` | CPU/Memory resource requests/limits | `{}` | +| `nodeSelector` | Node labels for pod assignment | `{}` | +| `tolerations` | Toleration labels for pod assignment | `[]` | +| `affinity` | Affinity settings for pod assignment | `{}` | +| `extraInitContainers` | Init containers to add to the grafana pod | `{}` | +| `extraContainers` | Sidecar containers to add to the grafana pod | `""` | +| `extraContainerVolumes` | Volumes that can be mounted in sidecar containers | `[]` | +| `extraLabels` | Custom labels for all manifests | `{}` | +| `schedulerName` | Name of the k8s scheduler (other than default) | `nil` | +| `persistence.enabled` | Use persistent volume to store data | `false` | +| `persistence.type` | Type of persistence (`pvc` or `statefulset`) | `pvc` | +| `persistence.size` | Size of persistent volume claim | `10Gi` | +| `persistence.existingClaim` | Use an existing PVC to persist data (can be templated) | `nil` | +| `persistence.storageClassName` | Type of persistent volume claim | `nil` | +| `persistence.accessModes` | Persistence access modes | `[ReadWriteOnce]` | +| `persistence.annotations` | PersistentVolumeClaim annotations | `{}` | +| `persistence.finalizers` | PersistentVolumeClaim finalizers | `[ "kubernetes.io/pvc-protection" ]` | +| `persistence.extraPvcLabels` | Extra labels to apply to a PVC. | `{}` | +| `persistence.subPath` | Mount a sub dir of the persistent volume (can be templated) | `nil` | +| `persistence.inMemory.enabled` | If persistence is not enabled, whether to mount the local storage in-memory to improve performance | `false` | +| `persistence.inMemory.sizeLimit` | SizeLimit for the in-memory local storage | `nil` | +| `initChownData.enabled` | If false, don't reset data ownership at startup | true | +| `initChownData.image.registry` | init-chown-data container image registry | `docker.io` | +| `initChownData.image.repository` | init-chown-data container image repository | `busybox` | +| `initChownData.image.tag` | init-chown-data container image tag | `1.31.1` | +| `initChownData.image.sha` | init-chown-data container image sha (optional)| `""` | +| `initChownData.image.pullPolicy` | init-chown-data container image pull policy | `IfNotPresent` | +| `initChownData.resources` | init-chown-data pod resource requests & limits | `{}` | +| `schedulerName` | Alternate scheduler name | `nil` | +| `env` | Extra environment variables passed to pods | `{}` | +| `envValueFrom` | Environment variables from alternate sources. See the API docs on [EnvVarSource](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#envvarsource-v1-core) for format details. Can be templated | `{}` | +| `envFromSecret` | Name of a Kubernetes secret (must be manually created in the same namespace) containing values to be added to the environment. Can be templated | `""` | +| `envFromSecrets` | List of Kubernetes secrets (must be manually created in the same namespace) containing values to be added to the environment. Can be templated | `[]` | +| `envFromConfigMaps` | List of Kubernetes ConfigMaps (must be manually created in the same namespace) containing values to be added to the environment. Can be templated | `[]` | +| `envRenderSecret` | Sensible environment variables passed to pods and stored as secret. (passed through [tpl](https://helm.sh/docs/howto/charts_tips_and_tricks/#using-the-tpl-function)) | `{}` | +| `enableServiceLinks` | Inject Kubernetes services as environment variables. | `true` | +| `extraSecretMounts` | Additional grafana server secret mounts | `[]` | +| `extraVolumeMounts` | Additional grafana server volume mounts | `[]` | +| `extraVolumes` | Additional Grafana server volumes | `[]` | +| `createConfigmap` | Enable creating the grafana configmap | `true` | +| `extraConfigmapMounts` | Additional grafana server configMap volume mounts (values are templated) | `[]` | +| `extraEmptyDirMounts` | Additional grafana server emptyDir volume mounts | `[]` | +| `plugins` | Plugins to be loaded along with Grafana | `[]` | +| `datasources` | Configure grafana datasources (passed through tpl) | `{}` | +| `alerting` | Configure grafana alerting (passed through tpl) | `{}` | +| `notifiers` | Configure grafana notifiers | `{}` | +| `dashboardProviders` | Configure grafana dashboard providers | `{}` | +| `dashboards` | Dashboards to import | `{}` | +| `dashboardsConfigMaps` | ConfigMaps reference that contains dashboards | `{}` | +| `grafana.ini` | Grafana's primary configuration | `{}` | +| `global.imageRegistry` | Global image pull registry for all images. | `null` | +| `global.imagePullSecrets` | Global image pull secrets (can be templated). Allows either an array of {name: pullSecret} maps (k8s-style), or an array of strings (more common helm-style). | `[]` | +| `ldap.enabled` | Enable LDAP authentication | `false` | +| `ldap.existingSecret` | The name of an existing secret containing the `ldap.toml` file, this must have the key `ldap-toml`. | `""` | +| `ldap.config` | Grafana's LDAP configuration | `""` | +| `annotations` | Deployment annotations | `{}` | +| `labels` | Deployment labels | `{}` | +| `podAnnotations` | Pod annotations | `{}` | +| `podLabels` | Pod labels | `{}` | +| `podPortName` | Name of the grafana port on the pod | `grafana` | +| `lifecycleHooks` | Lifecycle hooks for podStart and preStop [Example](https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/#define-poststart-and-prestop-handlers) | `{}` | +| `sidecar.image.registry` | Sidecar image registry | `quay.io` | +| `sidecar.image.repository` | Sidecar image repository | `kiwigrid/k8s-sidecar` | +| `sidecar.image.tag` | Sidecar image tag | `1.24.6` | +| `sidecar.image.sha` | Sidecar image sha (optional) | `""` | +| `sidecar.imagePullPolicy` | Sidecar image pull policy | `IfNotPresent` | +| `sidecar.resources` | Sidecar resources | `{}` | +| `sidecar.securityContext` | Sidecar securityContext | `{}` | +| `sidecar.enableUniqueFilenames` | Sets the kiwigrid/k8s-sidecar UNIQUE_FILENAMES environment variable. If set to `true` the sidecar will create unique filenames where duplicate data keys exist between ConfigMaps and/or Secrets within the same or multiple Namespaces. | `false` | +| `sidecar.alerts.enabled` | Enables the cluster wide search for alerts and adds/updates/deletes them in grafana |`false` | +| `sidecar.alerts.label` | Label that config maps with alerts should have to be added | `grafana_alert` | +| `sidecar.alerts.labelValue` | Label value that config maps with alerts should have to be added | `""` | +| `sidecar.alerts.searchNamespace` | Namespaces list. If specified, the sidecar will search for alerts config-maps inside these namespaces. Otherwise the namespace in which the sidecar is running will be used. It's also possible to specify ALL to search in all namespaces. | `nil` | +| `sidecar.alerts.watchMethod` | Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. | `WATCH` | +| `sidecar.alerts.resource` | Should the sidecar looks into secrets, configmaps or both. | `both` | +| `sidecar.alerts.reloadURL` | Full url of datasource configuration reload API endpoint, to invoke after a config-map change | `"http://localhost:3000/api/admin/provisioning/alerting/reload"` | +| `sidecar.alerts.skipReload` | Enabling this omits defining the REQ_URL and REQ_METHOD environment variables | `false` | +| `sidecar.alerts.initAlerts` | Set to true to deploy the alerts sidecar as an initContainer. This is needed if skipReload is true, to load any alerts defined at startup time. | `false` | +| `sidecar.alerts.extraMounts` | Additional alerts sidecar volume mounts. | `[]` | +| `sidecar.dashboards.enabled` | Enables the cluster wide search for dashboards and adds/updates/deletes them in grafana | `false` | +| `sidecar.dashboards.SCProvider` | Enables creation of sidecar provider | `true` | +| `sidecar.dashboards.provider.name` | Unique name of the grafana provider | `sidecarProvider` | +| `sidecar.dashboards.provider.orgid` | Id of the organisation, to which the dashboards should be added | `1` | +| `sidecar.dashboards.provider.folder` | Logical folder in which grafana groups dashboards | `""` | +| `sidecar.dashboards.provider.disableDelete` | Activate to avoid the deletion of imported dashboards | `false` | +| `sidecar.dashboards.provider.allowUiUpdates` | Allow updating provisioned dashboards from the UI | `false` | +| `sidecar.dashboards.provider.type` | Provider type | `file` | +| `sidecar.dashboards.provider.foldersFromFilesStructure` | Allow Grafana to replicate dashboard structure from filesystem. | `false` | +| `sidecar.dashboards.watchMethod` | Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. | `WATCH` | +| `sidecar.skipTlsVerify` | Set to true to skip tls verification for kube api calls | `nil` | +| `sidecar.dashboards.label` | Label that config maps with dashboards should have to be added | `grafana_dashboard` | +| `sidecar.dashboards.labelValue` | Label value that config maps with dashboards should have to be added | `""` | +| `sidecar.dashboards.folder` | Folder in the pod that should hold the collected dashboards (unless `sidecar.dashboards.defaultFolderName` is set). This path will be mounted. | `/tmp/dashboards` | +| `sidecar.dashboards.folderAnnotation` | The annotation the sidecar will look for in configmaps to override the destination folder for files | `nil` | +| `sidecar.dashboards.defaultFolderName` | The default folder name, it will create a subfolder under the `sidecar.dashboards.folder` and put dashboards in there instead | `nil` | +| `sidecar.dashboards.searchNamespace` | Namespaces list. If specified, the sidecar will search for dashboards config-maps inside these namespaces. Otherwise the namespace in which the sidecar is running will be used. It's also possible to specify ALL to search in all namespaces. | `nil` | +| `sidecar.dashboards.script` | Absolute path to shell script to execute after a configmap got reloaded. | `nil` | +| `sidecar.dashboards.reloadURL` | Full url of dashboards configuration reload API endpoint, to invoke after a config-map change | `"http://localhost:3000/api/admin/provisioning/dashboards/reload"` | +| `sidecar.dashboards.skipReload` | Enabling this omits defining the REQ_USERNAME, REQ_PASSWORD, REQ_URL and REQ_METHOD environment variables | `false` | +| `sidecar.dashboards.resource` | Should the sidecar looks into secrets, configmaps or both. | `both` | +| `sidecar.dashboards.extraMounts` | Additional dashboard sidecar volume mounts. | `[]` | +| `sidecar.datasources.enabled` | Enables the cluster wide search for datasources and adds/updates/deletes them in grafana |`false` | +| `sidecar.datasources.label` | Label that config maps with datasources should have to be added | `grafana_datasource` | +| `sidecar.datasources.labelValue` | Label value that config maps with datasources should have to be added | `""` | +| `sidecar.datasources.searchNamespace` | Namespaces list. If specified, the sidecar will search for datasources config-maps inside these namespaces. Otherwise the namespace in which the sidecar is running will be used. It's also possible to specify ALL to search in all namespaces. | `nil` | +| `sidecar.datasources.watchMethod` | Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. | `WATCH` | +| `sidecar.datasources.resource` | Should the sidecar looks into secrets, configmaps or both. | `both` | +| `sidecar.datasources.reloadURL` | Full url of datasource configuration reload API endpoint, to invoke after a config-map change | `"http://localhost:3000/api/admin/provisioning/datasources/reload"` | +| `sidecar.datasources.skipReload` | Enabling this omits defining the REQ_URL and REQ_METHOD environment variables | `false` | +| `sidecar.datasources.initDatasources` | Set to true to deploy the datasource sidecar as an initContainer in addition to a container. This is needed if skipReload is true, to load any datasources defined at startup time. | `false` | +| `sidecar.notifiers.enabled` | Enables the cluster wide search for notifiers and adds/updates/deletes them in grafana | `false` | +| `sidecar.notifiers.label` | Label that config maps with notifiers should have to be added | `grafana_notifier` | +| `sidecar.notifiers.labelValue` | Label value that config maps with notifiers should have to be added | `""` | +| `sidecar.notifiers.searchNamespace` | Namespaces list. If specified, the sidecar will search for notifiers config-maps (or secrets) inside these namespaces. Otherwise the namespace in which the sidecar is running will be used. It's also possible to specify ALL to search in all namespaces. | `nil` | +| `sidecar.notifiers.watchMethod` | Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. | `WATCH` | +| `sidecar.notifiers.resource` | Should the sidecar looks into secrets, configmaps or both. | `both` | +| `sidecar.notifiers.reloadURL` | Full url of notifier configuration reload API endpoint, to invoke after a config-map change | `"http://localhost:3000/api/admin/provisioning/notifications/reload"` | +| `sidecar.notifiers.skipReload` | Enabling this omits defining the REQ_URL and REQ_METHOD environment variables | `false` | +| `sidecar.notifiers.initNotifiers` | Set to true to deploy the notifier sidecar as an initContainer in addition to a container. This is needed if skipReload is true, to load any notifiers defined at startup time. | `false` | +| `smtp.existingSecret` | The name of an existing secret containing the SMTP credentials. | `""` | +| `smtp.userKey` | The key in the existing SMTP secret containing the username. | `"user"` | +| `smtp.passwordKey` | The key in the existing SMTP secret containing the password. | `"password"` | +| `admin.existingSecret` | The name of an existing secret containing the admin credentials (can be templated). | `""` | +| `admin.userKey` | The key in the existing admin secret containing the username. | `"admin-user"` | +| `admin.passwordKey` | The key in the existing admin secret containing the password. | `"admin-password"` | +| `serviceAccount.autoMount` | Automount the service account token in the pod| `true` | +| `serviceAccount.annotations` | ServiceAccount annotations | | +| `serviceAccount.create` | Create service account | `true` | +| `serviceAccount.labels` | ServiceAccount labels | `{}` | +| `serviceAccount.name` | Service account name to use, when empty will be set to created account if `serviceAccount.create` is set else to `default` | `` | +| `serviceAccount.nameTest` | Service account name to use for test, when empty will be set to created account if `serviceAccount.create` is set else to `default` | `nil` | +| `rbac.create` | Create and use RBAC resources | `true` | +| `rbac.namespaced` | Creates Role and Rolebinding instead of the default ClusterRole and ClusteRoleBindings for the grafana instance | `false` | +| `rbac.useExistingRole` | Set to a rolename to use existing role - skipping role creating - but still doing serviceaccount and rolebinding to the rolename set here. | `nil` | +| `rbac.pspEnabled` | Create PodSecurityPolicy (with `rbac.create`, grant roles permissions as well) | `false` | +| `rbac.pspUseAppArmor` | Enforce AppArmor in created PodSecurityPolicy (requires `rbac.pspEnabled`) | `false` | +| `rbac.extraRoleRules` | Additional rules to add to the Role | [] | +| `rbac.extraClusterRoleRules` | Additional rules to add to the ClusterRole | [] | +| `command` | Define command to be executed by grafana container at startup | `nil` | +| `args` | Define additional args if command is used | `nil` | +| `testFramework.enabled` | Whether to create test-related resources | `true` | +| `testFramework.image.registry` | `test-framework` image registry. | `docker.io` | +| `testFramework.image.repository` | `test-framework` image repository. | `bats/bats` | +| `testFramework.image.tag` | `test-framework` image tag. | `v1.4.1` | +| `testFramework.imagePullPolicy` | `test-framework` image pull policy. | `IfNotPresent` | +| `testFramework.securityContext` | `test-framework` securityContext | `{}` | +| `downloadDashboards.env` | Environment variables to be passed to the `download-dashboards` container | `{}` | +| `downloadDashboards.envFromSecret` | Name of a Kubernetes secret (must be manually created in the same namespace) containing values to be added to the environment. Can be templated | `""` | +| `downloadDashboards.resources` | Resources of `download-dashboards` container | `{}` | +| `downloadDashboardsImage.registry` | Curl docker image registry | `docker.io` | +| `downloadDashboardsImage.repository` | Curl docker image repository | `curlimages/curl` | +| `downloadDashboardsImage.tag` | Curl docker image tag | `7.73.0` | +| `downloadDashboardsImage.sha` | Curl docker image sha (optional) | `""` | +| `downloadDashboardsImage.pullPolicy` | Curl docker image pull policy | `IfNotPresent` | +| `namespaceOverride` | Override the deployment namespace | `""` (`Release.Namespace`) | +| `serviceMonitor.enabled` | Use servicemonitor from prometheus operator | `false` | +| `serviceMonitor.namespace` | Namespace this servicemonitor is installed in | | +| `serviceMonitor.interval` | How frequently Prometheus should scrape | `1m` | +| `serviceMonitor.path` | Path to scrape | `/metrics` | +| `serviceMonitor.scheme` | Scheme to use for metrics scraping | `http` | +| `serviceMonitor.tlsConfig` | TLS configuration block for the endpoint | `{}` | +| `serviceMonitor.labels` | Labels for the servicemonitor passed to Prometheus Operator | `{}` | +| `serviceMonitor.scrapeTimeout` | Timeout after which the scrape is ended | `30s` | +| `serviceMonitor.relabelings` | RelabelConfigs to apply to samples before scraping. | `[]` | +| `serviceMonitor.metricRelabelings` | MetricRelabelConfigs to apply to samples before ingestion. | `[]` | +| `revisionHistoryLimit` | Number of old ReplicaSets to retain | `10` | +| `imageRenderer.enabled` | Enable the image-renderer deployment & service | `false` | +| `imageRenderer.image.registry` | image-renderer Image registry | `docker.io` | +| `imageRenderer.image.repository` | image-renderer Image repository | `grafana/grafana-image-renderer` | +| `imageRenderer.image.tag` | image-renderer Image tag | `latest` | +| `imageRenderer.image.sha` | image-renderer Image sha (optional) | `""` | +| `imageRenderer.image.pullPolicy` | image-renderer ImagePullPolicy | `Always` | +| `imageRenderer.env` | extra env-vars for image-renderer | `{}` | +| `imageRenderer.envValueFrom` | Environment variables for image-renderer from alternate sources. See the API docs on [EnvVarSource](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#envvarsource-v1-core) for format details. Can be templated | `{}` | +| `imageRenderer.serviceAccountName` | image-renderer deployment serviceAccountName | `""` | +| `imageRenderer.securityContext` | image-renderer deployment securityContext | `{}` | +| `imageRenderer.podAnnotations ` | image-renderer image-renderer pod annotation | `{}` | +| `imageRenderer.hostAliases` | image-renderer deployment Host Aliases | `[]` | +| `imageRenderer.priorityClassName` | image-renderer deployment priority class | `''` | +| `imageRenderer.service.enabled` | Enable the image-renderer service | `true` | +| `imageRenderer.service.portName` | image-renderer service port name | `http` | +| `imageRenderer.service.port` | image-renderer port used by deployment | `8081` | +| `imageRenderer.service.targetPort` | image-renderer service port used by service | `8081` | +| `imageRenderer.appProtocol` | Adds the appProtocol field to the service | `` | +| `imageRenderer.grafanaSubPath` | Grafana sub path to use for image renderer callback url | `''` | +| `imageRenderer.podPortName` | name of the image-renderer port on the pod | `http` | +| `imageRenderer.revisionHistoryLimit` | number of image-renderer replica sets to keep | `10` | +| `imageRenderer.networkPolicy.limitIngress` | Enable a NetworkPolicy to limit inbound traffic from only the created grafana pods | `true` | +| `imageRenderer.networkPolicy.limitEgress` | Enable a NetworkPolicy to limit outbound traffic to only the created grafana pods | `false` | +| `imageRenderer.resources` | Set resource limits for image-renderer pods | `{}` | +| `imageRenderer.nodeSelector` | Node labels for pod assignment | `{}` | +| `imageRenderer.tolerations` | Toleration labels for pod assignment | `[]` | +| `imageRenderer.affinity` | Affinity settings for pod assignment | `{}` | +| `networkPolicy.enabled` | Enable creation of NetworkPolicy resources. | `false` | +| `networkPolicy.allowExternal` | Don't require client label for connections | `true` | +| `networkPolicy.explicitNamespacesSelector` | A Kubernetes LabelSelector to explicitly select namespaces from which traffic could be allowed | `{}` | +| `networkPolicy.ingress` | Enable the creation of an ingress network policy | `true` | +| `networkPolicy.egress.enabled` | Enable the creation of an egress network policy | `false` | +| `networkPolicy.egress.ports` | An array of ports to allow for the egress | `[]` | +| `enableKubeBackwardCompatibility` | Enable backward compatibility of kubernetes where pod's defintion version below 1.13 doesn't have the enableServiceLinks option | `false` | + +### Example ingress with path + +With grafana 6.3 and above + +```yaml +grafana.ini: + server: + domain: monitoring.example.com + root_url: "%(protocol)s://%(domain)s/grafana" + serve_from_sub_path: true +ingress: + enabled: true + hosts: + - "monitoring.example.com" + path: "/grafana" +``` + +### Example of extraVolumeMounts and extraVolumes + +Configure additional volumes with `extraVolumes` and volume mounts with `extraVolumeMounts`. + +Example for `extraVolumeMounts` and corresponding `extraVolumes`: + +```yaml +extraVolumeMounts: + - name: plugins + mountPath: /var/lib/grafana/plugins + subPath: configs/grafana/plugins + readOnly: false + - name: dashboards + mountPath: /var/lib/grafana/dashboards + hostPath: /usr/shared/grafana/dashboards + readOnly: false + +extraVolumes: + - name: plugins + existingClaim: existing-grafana-claim + - name: dashboards + hostPath: /usr/shared/grafana/dashboards +``` + +Volumes default to `emptyDir`. Set to `persistentVolumeClaim`, +`hostPath`, `csi`, or `configMap` for other types. For a +`persistentVolumeClaim`, specify an existing claim name with +`existingClaim`. + +## Import dashboards + +There are a few methods to import dashboards to Grafana. Below are some examples and explanations as to how to use each method: + +```yaml +dashboards: + default: + some-dashboard: + json: | + { + "annotations": + + ... + # Complete json file here + ... + + "title": "Some Dashboard", + "uid": "abcd1234", + "version": 1 + } + custom-dashboard: + # This is a path to a file inside the dashboards directory inside the chart directory + file: dashboards/custom-dashboard.json + prometheus-stats: + # Ref: https://grafana.com/dashboards/2 + gnetId: 2 + revision: 2 + datasource: Prometheus + loki-dashboard-quick-search: + gnetId: 12019 + revision: 2 + datasource: + - name: DS_PROMETHEUS + value: Prometheus + - name: DS_LOKI + value: Loki + local-dashboard: + url: https://raw.githubusercontent.com/user/repository/master/dashboards/dashboard.json +``` + +## BASE64 dashboards + +Dashboards could be stored on a server that does not return JSON directly and instead of it returns a Base64 encoded file (e.g. Gerrit) +A new parameter has been added to the url use case so if you specify a b64content value equals to true after the url entry a Base64 decoding is applied before save the file to disk. +If this entry is not set or is equals to false not decoding is applied to the file before saving it to disk. + +### Gerrit use case + +Gerrit API for download files has the following schema: where {project-name} and +{file-id} usually has '/' in their values and so they MUST be replaced by %2F so if project-name is user/repo, branch-id is master and file-id is equals to dir1/dir2/dashboard +the url value is + +## Sidecar for dashboards + +If the parameter `sidecar.dashboards.enabled` is set, a sidecar container is deployed in the grafana +pod. This container watches all configmaps (or secrets) in the cluster and filters out the ones with +a label as defined in `sidecar.dashboards.label`. The files defined in those configmaps are written +to a folder and accessed by grafana. Changes to the configmaps are monitored and the imported +dashboards are deleted/updated. + +A recommendation is to use one configmap per dashboard, as a reduction of multiple dashboards inside +one configmap is currently not properly mirrored in grafana. + +Example dashboard config: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: sample-grafana-dashboard + labels: + grafana_dashboard: "1" +data: + k8s-dashboard.json: |- + [...] +``` + +## Sidecar for datasources + +If the parameter `sidecar.datasources.enabled` is set, an init container is deployed in the grafana +pod. This container lists all secrets (or configmaps, though not recommended) in the cluster and +filters out the ones with a label as defined in `sidecar.datasources.label`. The files defined in +those secrets are written to a folder and accessed by grafana on startup. Using these yaml files, +the data sources in grafana can be imported. + +Should you aim for reloading datasources in Grafana each time the config is changed, set `sidecar.datasources.skipReload: false` and adjust `sidecar.datasources.reloadURL` to `http://..svc.cluster.local/api/admin/provisioning/datasources/reload`. + +Secrets are recommended over configmaps for this usecase because datasources usually contain private +data like usernames and passwords. Secrets are the more appropriate cluster resource to manage those. + +Example values to add a postgres datasource as a kubernetes secret: +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: grafana-datasources + labels: + grafana_datasource: 'true' # default value for: sidecar.datasources.label +stringData: + pg-db.yaml: |- + apiVersion: 1 + datasources: + - name: My pg db datasource + type: postgres + url: my-postgresql-db:5432 + user: db-readonly-user + secureJsonData: + password: 'SUperSEcretPa$$word' + jsonData: + database: my_datase + sslmode: 'disable' # disable/require/verify-ca/verify-full + maxOpenConns: 0 # Grafana v5.4+ + maxIdleConns: 2 # Grafana v5.4+ + connMaxLifetime: 14400 # Grafana v5.4+ + postgresVersion: 1000 # 903=9.3, 904=9.4, 905=9.5, 906=9.6, 1000=10 + timescaledb: false + # allow users to edit datasources from the UI. + editable: false +``` + +Example values to add a datasource adapted from [Grafana](http://docs.grafana.org/administration/provisioning/#example-datasource-config-file): + +```yaml +datasources: + datasources.yaml: + apiVersion: 1 + datasources: + # name of the datasource. Required + - name: Graphite + # datasource type. Required + type: graphite + # access mode. proxy or direct (Server or Browser in the UI). Required + access: proxy + # org id. will default to orgId 1 if not specified + orgId: 1 + # url + url: http://localhost:8080 + # database password, if used + password: + # database user, if used + user: + # database name, if used + database: + # enable/disable basic auth + basicAuth: + # basic auth username + basicAuthUser: + # basic auth password + basicAuthPassword: + # enable/disable with credentials headers + withCredentials: + # mark as default datasource. Max one per org + isDefault: + # fields that will be converted to json and stored in json_data + jsonData: + graphiteVersion: "1.1" + tlsAuth: true + tlsAuthWithCACert: true + # json object of data that will be encrypted. + secureJsonData: + tlsCACert: "..." + tlsClientCert: "..." + tlsClientKey: "..." + version: 1 + # allow users to edit datasources from the UI. + editable: false +``` + +## Sidecar for notifiers + +If the parameter `sidecar.notifiers.enabled` is set, an init container is deployed in the grafana +pod. This container lists all secrets (or configmaps, though not recommended) in the cluster and +filters out the ones with a label as defined in `sidecar.notifiers.label`. The files defined in +those secrets are written to a folder and accessed by grafana on startup. Using these yaml files, +the notification channels in grafana can be imported. The secrets must be created before +`helm install` so that the notifiers init container can list the secrets. + +Secrets are recommended over configmaps for this usecase because alert notification channels usually contain +private data like SMTP usernames and passwords. Secrets are the more appropriate cluster resource to manage those. + +Example datasource config adapted from [Grafana](https://grafana.com/docs/grafana/latest/administration/provisioning/#alert-notification-channels): + +```yaml +notifiers: + - name: notification-channel-1 + type: slack + uid: notifier1 + # either + org_id: 2 + # or + org_name: Main Org. + is_default: true + send_reminder: true + frequency: 1h + disable_resolve_message: false + # See `Supported Settings` section for settings supporter for each + # alert notification type. + settings: + recipient: 'XXX' + token: 'xoxb' + uploadImage: true + url: https://slack.com + +delete_notifiers: + - name: notification-channel-1 + uid: notifier1 + org_id: 2 + - name: notification-channel-2 + # default org_id: 1 +``` + +## Sidecar for alerting resources + +If the parameter `sidecar.alerts.enabled` is set, a sidecar container is deployed in the grafana +pod. This container watches all configmaps (or secrets) in the cluster (namespace defined by `sidecar.alerts.searchNamespace`) and filters out the ones with +a label as defined in `sidecar.alerts.label` (default is `grafana_alert`). The files defined in those configmaps are written +to a folder and accessed by grafana. Changes to the configmaps are monitored and the imported alerting resources are updated, however, deletions are a little more complicated (see below). + +This sidecar can be used to provision alert rules, contact points, notification policies, notification templates and mute timings as shown in [Grafana Documentation](https://grafana.com/docs/grafana/next/alerting/set-up/provision-alerting-resources/file-provisioning/). + +To fetch the alert config which will be provisioned, use the alert provisioning API ([Grafana Documentation](https://grafana.com/docs/grafana/next/developers/http_api/alerting_provisioning/)). +You can use either JSON or YAML format. + +Example config for an alert rule: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: sample-grafana-alert + labels: + grafana_alert: "1" +data: + k8s-alert.yml: |- + apiVersion: 1 + groups: + - orgId: 1 + name: k8s-alert + [...] +``` + +To delete provisioned alert rules is a two step process, you need to delete the configmap which defined the alert rule +and then create a configuration which deletes the alert rule. + +Example deletion configuration: +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: delete-sample-grafana-alert + namespace: monitoring + labels: + grafana_alert: "1" +data: + delete-k8s-alert.yml: |- + apiVersion: 1 + deleteRules: + - orgId: 1 + uid: 16624780-6564-45dc-825c-8bded4ad92d3 +``` + +## Statically provision alerting resources +If you don't need to change alerting resources (alert rules, contact points, notification policies and notification templates) regularly you could use the `alerting` config option instead of the sidecar option above. +This will grab the alerting config and apply it statically at build time for the helm file. + +There are two methods to statically provision alerting configuration in Grafana. Below are some examples and explanations as to how to use each method: + +```yaml +alerting: + team1-alert-rules.yaml: + file: alerting/team1/rules.yaml + team2-alert-rules.yaml: + file: alerting/team2/rules.yaml + team3-alert-rules.yaml: + file: alerting/team3/rules.yaml + notification-policies.yaml: + file: alerting/shared/notification-policies.yaml + notification-templates.yaml: + file: alerting/shared/notification-templates.yaml + contactpoints.yaml: + apiVersion: 1 + contactPoints: + - orgId: 1 + name: Slack channel + receivers: + - uid: default-receiver + type: slack + settings: + # Webhook URL to be filled in + url: "" + # We need to escape double curly braces for the tpl function. + text: '{{ `{{ template "default.message" . }}` }}' + title: '{{ `{{ template "default.title" . }}` }}' +``` + +The two possibilities for static alerting resource provisioning are: + +* Inlining the file contents as shown for contact points in the above example. +* Importing a file using a relative path starting from the chart root directory as shown for the alert rules in the above example. + +### Important notes on file provisioning + +* The format of the files is defined in the [Grafana documentation](https://grafana.com/docs/grafana/next/alerting/set-up/provision-alerting-resources/file-provisioning/) on file provisioning. +* The chart supports importing YAML and JSON files. +* The filename must be unique, otherwise one volume mount will overwrite the other. +* In case of inlining, double curly braces that arise from the Grafana configuration format and are not intended as templates for the chart must be escaped. +* The number of total files under `alerting:` is not limited. Each file will end up as a volume mount in the corresponding provisioning folder of the deployed Grafana instance. +* The file size for each import is limited by what the function `.Files.Get` can handle, which suffices for most cases. + +## How to serve Grafana with a path prefix (/grafana) + +In order to serve Grafana with a prefix (e.g., ), add the following to your values.yaml. + +```yaml +ingress: + enabled: true + annotations: + kubernetes.io/ingress.class: "nginx" + nginx.ingress.kubernetes.io/rewrite-target: /$1 + nginx.ingress.kubernetes.io/use-regex: "true" + + path: /grafana/?(.*) + hosts: + - k8s.example.dev + +grafana.ini: + server: + root_url: http://localhost:3000/grafana # this host can be localhost +``` + +## How to securely reference secrets in grafana.ini + +This example uses Grafana [file providers](https://grafana.com/docs/grafana/latest/administration/configuration/#file-provider) for secret values and the `extraSecretMounts` configuration flag (Additional grafana server secret mounts) to mount the secrets. + +In grafana.ini: + +```yaml +grafana.ini: + [auth.generic_oauth] + enabled = true + client_id = $__file{/etc/secrets/auth_generic_oauth/client_id} + client_secret = $__file{/etc/secrets/auth_generic_oauth/client_secret} +``` + +Existing secret, or created along with helm: + +```yaml +--- +apiVersion: v1 +kind: Secret +metadata: + name: auth-generic-oauth-secret +type: Opaque +stringData: + client_id: + client_secret: +``` + +Include in the `extraSecretMounts` configuration flag: + +```yaml +- extraSecretMounts: + - name: auth-generic-oauth-secret-mount + secretName: auth-generic-oauth-secret + defaultMode: 0440 + mountPath: /etc/secrets/auth_generic_oauth + readOnly: true +``` + +### extraSecretMounts using a Container Storage Interface (CSI) provider + +This example uses a CSI driver e.g. retrieving secrets using [Azure Key Vault Provider](https://github.com/Azure/secrets-store-csi-driver-provider-azure) + +```yaml +- extraSecretMounts: + - name: secrets-store-inline + mountPath: /run/secrets + readOnly: true + csi: + driver: secrets-store.csi.k8s.io + readOnly: true + volumeAttributes: + secretProviderClass: "my-provider" + nodePublishSecretRef: + name: akv-creds +``` + +## Image Renderer Plug-In + +This chart supports enabling [remote image rendering](https://github.com/grafana/grafana-image-renderer/blob/master/README.md#run-in-docker) + +```yaml +imageRenderer: + enabled: true +``` + +### Image Renderer NetworkPolicy + +By default the image-renderer pods will have a network policy which only allows ingress traffic from the created grafana instance + +### High Availability for unified alerting + +If you want to run Grafana in a high availability cluster you need to enable +the headless service by setting `headlessService: true` in your `values.yaml` +file. + +As next step you have to setup the `grafana.ini` in your `values.yaml` in a way +that it will make use of the headless service to obtain all the IPs of the +cluster. You should replace ``{{ Name }}`` with the name of your helm deployment. + +```yaml +grafana.ini: + ... + unified_alerting: + enabled: true + ha_peers: {{ Name }}-headless:9094 + ha_listen_address: ${POD_IP}:9094 + ha_advertise_address: ${POD_IP}:9094 + + alerting: + enabled: false +``` diff --git a/thunder_deployment/infra/beta9/charts/grafana/ci/default-values.yaml b/thunder_deployment/infra/beta9/charts/grafana/ci/default-values.yaml new file mode 100644 index 000000000..fc2ba605a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/ci/default-values.yaml @@ -0,0 +1 @@ +# Leave this file empty to ensure that CI runs builds against the default configuration in values.yaml. diff --git a/thunder_deployment/infra/beta9/charts/grafana/ci/with-affinity-values.yaml b/thunder_deployment/infra/beta9/charts/grafana/ci/with-affinity-values.yaml new file mode 100644 index 000000000..f5b9b53e7 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/ci/with-affinity-values.yaml @@ -0,0 +1,16 @@ +affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + app.kubernetes.io/instance: grafana-test + app.kubernetes.io/name: grafana + topologyKey: failure-domain.beta.kubernetes.io/zone + weight: 100 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/instance: grafana-test + app.kubernetes.io/name: grafana + topologyKey: kubernetes.io/hostname diff --git a/thunder_deployment/infra/beta9/charts/grafana/ci/with-dashboard-json-values.yaml b/thunder_deployment/infra/beta9/charts/grafana/ci/with-dashboard-json-values.yaml new file mode 100644 index 000000000..e0c4e4168 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/ci/with-dashboard-json-values.yaml @@ -0,0 +1,53 @@ +dashboards: + my-provider: + my-awesome-dashboard: + # An empty but valid dashboard + json: | + { + "__inputs": [], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "6.3.5" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "id": null, + "links": [], + "panels": [], + "schemaVersion": 19, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": ["5s"] + }, + "timezone": "", + "title": "Dummy Dashboard", + "uid": "IdcYQooWk", + "version": 1 + } + datasource: Prometheus diff --git a/thunder_deployment/infra/beta9/charts/grafana/ci/with-dashboard-values.yaml b/thunder_deployment/infra/beta9/charts/grafana/ci/with-dashboard-values.yaml new file mode 100644 index 000000000..7b662c5fd --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/ci/with-dashboard-values.yaml @@ -0,0 +1,19 @@ +dashboards: + my-provider: + my-awesome-dashboard: + gnetId: 10000 + revision: 1 + datasource: Prometheus +dashboardProviders: + dashboardproviders.yaml: + apiVersion: 1 + providers: + - name: 'my-provider' + orgId: 1 + folder: '' + type: file + updateIntervalSeconds: 10 + disableDeletion: true + editable: true + options: + path: /var/lib/grafana/dashboards/my-provider diff --git a/thunder_deployment/infra/beta9/charts/grafana/ci/with-extraconfigmapmounts-values.yaml b/thunder_deployment/infra/beta9/charts/grafana/ci/with-extraconfigmapmounts-values.yaml new file mode 100644 index 000000000..5cc44a056 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/ci/with-extraconfigmapmounts-values.yaml @@ -0,0 +1,7 @@ +extraConfigmapMounts: + - name: '{{ include "grafana.fullname" . }}' + configMap: '{{ include "grafana.fullname" . }}' + mountPath: /var/lib/grafana/dashboards/test-dashboard.json + # This is not a realistic test, but for this we only care about extraConfigmapMounts not being empty and pointing to an existing ConfigMap + subPath: grafana.ini + readOnly: true diff --git a/thunder_deployment/infra/beta9/charts/grafana/ci/with-image-renderer-values.yaml b/thunder_deployment/infra/beta9/charts/grafana/ci/with-image-renderer-values.yaml new file mode 100644 index 000000000..32f307434 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/ci/with-image-renderer-values.yaml @@ -0,0 +1,19 @@ +podLabels: + customLableA: Aaaaa +imageRenderer: + enabled: true + env: + RENDERING_ARGS: --disable-gpu,--window-size=1280x758 + RENDERING_MODE: clustered + podLabels: + customLableB: Bbbbb + networkPolicy: + limitIngress: true + limitEgress: true + resources: + limits: + cpu: 1000m + memory: 1000Mi + requests: + cpu: 500m + memory: 50Mi diff --git a/thunder_deployment/infra/beta9/charts/grafana/ci/with-persistence.yaml b/thunder_deployment/infra/beta9/charts/grafana/ci/with-persistence.yaml new file mode 100644 index 000000000..b92ca02c9 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/ci/with-persistence.yaml @@ -0,0 +1,3 @@ +persistence: + type: pvc + enabled: true diff --git a/thunder_deployment/infra/beta9/charts/grafana/dashboards/custom-dashboard.json b/thunder_deployment/infra/beta9/charts/grafana/dashboards/custom-dashboard.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/dashboards/custom-dashboard.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/NOTES.txt b/thunder_deployment/infra/beta9/charts/grafana/templates/NOTES.txt new file mode 100644 index 000000000..d86419fe2 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/NOTES.txt @@ -0,0 +1,55 @@ +1. Get your '{{ .Values.adminUser }}' user password by running: + + kubectl get secret --namespace {{ include "grafana.namespace" . }} {{ .Values.admin.existingSecret | default (include "grafana.fullname" .) }} -o jsonpath="{.data.{{ .Values.admin.passwordKey | default "admin-password" }}}" | base64 --decode ; echo + + +2. The Grafana server can be accessed via port {{ .Values.service.port }} on the following DNS name from within your cluster: + + {{ include "grafana.fullname" . }}.{{ include "grafana.namespace" . }}.svc.cluster.local +{{ if .Values.ingress.enabled }} + If you bind grafana to 80, please update values in values.yaml and reinstall: + ``` + securityContext: + runAsUser: 0 + runAsGroup: 0 + fsGroup: 0 + + command: + - "setcap" + - "'cap_net_bind_service=+ep'" + - "/usr/sbin/grafana-server &&" + - "sh" + - "/run.sh" + ``` + Details refer to https://grafana.com/docs/installation/configuration/#http-port. + Or grafana would always crash. + + From outside the cluster, the server URL(s) are: + {{- range .Values.ingress.hosts }} + http://{{ . }} + {{- end }} +{{- else }} + Get the Grafana URL to visit by running these commands in the same shell: + {{- if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ include "grafana.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "grafana.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ include "grafana.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT + {{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get svc --namespace {{ include "grafana.namespace" . }} -w {{ include "grafana.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ include "grafana.namespace" . }} {{ include "grafana.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') + http://$SERVICE_IP:{{ .Values.service.port -}} + {{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ include "grafana.namespace" . }} -l "app.kubernetes.io/name={{ include "grafana.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + kubectl --namespace {{ include "grafana.namespace" . }} port-forward $POD_NAME 3000 + {{- end }} +{{- end }} + +3. Login with the password from step 1 and the username: {{ .Values.adminUser }} + +{{- if not .Values.persistence.enabled }} +################################################################################# +###### WARNING: Persistence is disabled!!! You will lose your data when ##### +###### the Grafana pod is terminated. ##### +################################################################################# +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/_config.tpl b/thunder_deployment/infra/beta9/charts/grafana/templates/_config.tpl new file mode 100644 index 000000000..19df19cd2 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/_config.tpl @@ -0,0 +1,171 @@ +{{/* + Generate config map data + */}} +{{- define "grafana.configData" -}} +{{ include "grafana.assertNoLeakedSecrets" . }} +{{- $files := .Files }} +{{- $root := . -}} +{{- with .Values.plugins }} +plugins: {{ join "," . }} +{{- end }} +grafana.ini: | +{{- range $elem, $elemVal := index .Values "grafana.ini" }} + {{- if not (kindIs "map" $elemVal) }} + {{- if kindIs "invalid" $elemVal }} + {{ $elem }} = + {{- else if kindIs "string" $elemVal }} + {{ $elem }} = {{ tpl $elemVal $ }} + {{- else }} + {{ $elem }} = {{ $elemVal }} + {{- end }} + {{- end }} +{{- end }} +{{- range $key, $value := index .Values "grafana.ini" }} + {{- if kindIs "map" $value }} + [{{ $key }}] + {{- range $elem, $elemVal := $value }} + {{- if kindIs "invalid" $elemVal }} + {{ $elem }} = + {{- else if kindIs "string" $elemVal }} + {{ $elem }} = {{ tpl $elemVal $ }} + {{- else }} + {{ $elem }} = {{ $elemVal }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} + +{{- range $key, $value := .Values.datasources }} +{{- if not (hasKey $value "secret") }} +{{ $key }}: | + {{- tpl (toYaml $value | nindent 2) $root }} +{{- end }} +{{- end }} + +{{- range $key, $value := .Values.notifiers }} +{{- if not (hasKey $value "secret") }} +{{ $key }}: | + {{- toYaml $value | nindent 2 }} +{{- end }} +{{- end }} + +{{- range $key, $value := .Values.alerting }} +{{- if (hasKey $value "file") }} +{{ $key }}: +{{- toYaml ( $files.Get $value.file ) | nindent 2 }} +{{- else if (or (hasKey $value "secret") (hasKey $value "secretFile"))}} +{{/* will be stored inside secret generated by "configSecret.yaml"*/}} +{{- else }} +{{ $key }}: | + {{- tpl (toYaml $value | nindent 2) $root }} +{{- end }} +{{- end }} + +{{- range $key, $value := .Values.dashboardProviders }} +{{ $key }}: | + {{- toYaml $value | nindent 2 }} +{{- end }} + +{{- if .Values.dashboards }} +download_dashboards.sh: | + #!/usr/bin/env sh + set -euf + {{- if .Values.dashboardProviders }} + {{- range $key, $value := .Values.dashboardProviders }} + {{- range $value.providers }} + mkdir -p {{ .options.path }} + {{- end }} + {{- end }} + {{- end }} +{{ $dashboardProviders := .Values.dashboardProviders }} +{{- range $provider, $dashboards := .Values.dashboards }} + {{- range $key, $value := $dashboards }} + {{- if (or (hasKey $value "gnetId") (hasKey $value "url")) }} + curl -skf \ + --connect-timeout 60 \ + --max-time 60 \ + {{- if not $value.b64content }} + {{- if not $value.acceptHeader }} + -H "Accept: application/json" \ + {{- else }} + -H "Accept: {{ $value.acceptHeader }}" \ + {{- end }} + {{- if $value.token }} + -H "Authorization: token {{ $value.token }}" \ + {{- end }} + {{- if $value.bearerToken }} + -H "Authorization: Bearer {{ $value.bearerToken }}" \ + {{- end }} + {{- if $value.basic }} + -H "Authorization: Basic {{ $value.basic }}" \ + {{- end }} + {{- if $value.gitlabToken }} + -H "PRIVATE-TOKEN: {{ $value.gitlabToken }}" \ + {{- end }} + -H "Content-Type: application/json;charset=UTF-8" \ + {{- end }} + {{- $dpPath := "" -}} + {{- range $kd := (index $dashboardProviders "dashboardproviders.yaml").providers }} + {{- if eq $kd.name $provider }} + {{- $dpPath = $kd.options.path }} + {{- end }} + {{- end }} + {{- if $value.url }} + "{{ $value.url }}" \ + {{- else }} + "https://grafana.com/api/dashboards/{{ $value.gnetId }}/revisions/{{- if $value.revision -}}{{ $value.revision }}{{- else -}}1{{- end -}}/download" \ + {{- end }} + {{- if $value.datasource }} + {{- if kindIs "string" $value.datasource }} + | sed '/-- .* --/! s/"datasource":.*,/"datasource": "{{ $value.datasource }}",/g' \ + {{- end }} + {{- if kindIs "slice" $value.datasource }} + {{- range $value.datasource }} + | sed '/-- .* --/! s/${{"{"}}{{ .name }}}/{{ .value }}/g' \ + {{- end }} + {{- end }} + {{- end }} + {{- if $value.b64content }} + | base64 -d \ + {{- end }} + > "{{- if $dpPath -}}{{ $dpPath }}{{- else -}}/var/lib/grafana/dashboards/{{ $provider }}{{- end -}}/{{ $key }}.json" + {{ end }} + {{- end }} +{{- end }} +{{- end }} +{{- end -}} + +{{/* + Generate dashboard json config map data + */}} +{{- define "grafana.configDashboardProviderData" -}} +provider.yaml: |- + apiVersion: 1 + providers: + - name: '{{ .Values.sidecar.dashboards.provider.name }}' + orgId: {{ .Values.sidecar.dashboards.provider.orgid }} + {{- if not .Values.sidecar.dashboards.provider.foldersFromFilesStructure }} + folder: '{{ .Values.sidecar.dashboards.provider.folder }}' + {{- end }} + type: {{ .Values.sidecar.dashboards.provider.type }} + disableDeletion: {{ .Values.sidecar.dashboards.provider.disableDelete }} + allowUiUpdates: {{ .Values.sidecar.dashboards.provider.allowUiUpdates }} + updateIntervalSeconds: {{ .Values.sidecar.dashboards.provider.updateIntervalSeconds | default 30 }} + options: + foldersFromFilesStructure: {{ .Values.sidecar.dashboards.provider.foldersFromFilesStructure }} + path: {{ .Values.sidecar.dashboards.folder }}{{- with .Values.sidecar.dashboards.defaultFolderName }}/{{ . }}{{- end }} +{{- end -}} + +{{- define "grafana.secretsData" -}} +{{- if and (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) (not .Values.admin.existingSecret) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) }} +admin-user: {{ .Values.adminUser | b64enc | quote }} +{{- if .Values.adminPassword }} +admin-password: {{ .Values.adminPassword | b64enc | quote }} +{{- else }} +admin-password: {{ include "grafana.password" . }} +{{- end }} +{{- end }} +{{- if not .Values.ldap.existingSecret }} +ldap-toml: {{ tpl .Values.ldap.config $ | b64enc | quote }} +{{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/_helpers.tpl b/thunder_deployment/infra/beta9/charts/grafana/templates/_helpers.tpl new file mode 100644 index 000000000..790d5a293 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/_helpers.tpl @@ -0,0 +1,278 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "grafana.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "grafana.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "grafana.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create the name of the service account +*/}} +{{- define "grafana.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "grafana.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} + +{{- define "grafana.serviceAccountNameTest" -}} +{{- if .Values.serviceAccount.create }} +{{- default (print (include "grafana.fullname" .) "-test") .Values.serviceAccount.nameTest }} +{{- else }} +{{- default "default" .Values.serviceAccount.nameTest }} +{{- end }} +{{- end }} + +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts +*/}} +{{- define "grafana.namespace" -}} +{{- if .Values.namespaceOverride }} +{{- .Values.namespaceOverride }} +{{- else }} +{{- .Release.Namespace }} +{{- end }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "grafana.labels" -}} +helm.sh/chart: {{ include "grafana.chart" . }} +{{ include "grafana.selectorLabels" . }} +{{- if or .Chart.AppVersion .Values.image.tag }} +app.kubernetes.io/version: {{ mustRegexReplaceAllLiteral "@sha.*" .Values.image.tag "" | default .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- with .Values.extraLabels }} +{{ toYaml . }} +{{- end }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "grafana.selectorLabels" -}} +app.kubernetes.io/name: {{ include "grafana.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "grafana.imageRenderer.labels" -}} +helm.sh/chart: {{ include "grafana.chart" . }} +{{ include "grafana.imageRenderer.selectorLabels" . }} +{{- if or .Chart.AppVersion .Values.image.tag }} +app.kubernetes.io/version: {{ mustRegexReplaceAllLiteral "@sha.*" .Values.image.tag "" | default .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels ImageRenderer +*/}} +{{- define "grafana.imageRenderer.selectorLabels" -}} +app.kubernetes.io/name: {{ include "grafana.name" . }}-image-renderer +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Looks if there's an existing secret and reuse its password. If not it generates +new password and use it. +*/}} +{{- define "grafana.password" -}} +{{- $secret := (lookup "v1" "Secret" (include "grafana.namespace" .) (include "grafana.fullname" .) ) }} +{{- if $secret }} +{{- index $secret "data" "admin-password" }} +{{- else }} +{{- (randAlphaNum 40) | b64enc | quote }} +{{- end }} +{{- end }} + +{{/* +Return the appropriate apiVersion for rbac. +*/}} +{{- define "grafana.rbac.apiVersion" -}} +{{- if $.Capabilities.APIVersions.Has "rbac.authorization.k8s.io/v1" }} +{{- print "rbac.authorization.k8s.io/v1" }} +{{- else }} +{{- print "rbac.authorization.k8s.io/v1beta1" }} +{{- end }} +{{- end }} + +{{/* +Return the appropriate apiVersion for ingress. +*/}} +{{- define "grafana.ingress.apiVersion" -}} +{{- if and ($.Capabilities.APIVersions.Has "networking.k8s.io/v1") (semverCompare ">= 1.19-0" .Capabilities.KubeVersion.Version) }} +{{- print "networking.k8s.io/v1" }} +{{- else if $.Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }} +{{- print "networking.k8s.io/v1beta1" }} +{{- else }} +{{- print "extensions/v1beta1" }} +{{- end }} +{{- end }} + +{{/* +Return the appropriate apiVersion for Horizontal Pod Autoscaler. +*/}} +{{- define "grafana.hpa.apiVersion" -}} +{{- if $.Capabilities.APIVersions.Has "autoscaling/v2/HorizontalPodAutoscaler" }} +{{- print "autoscaling/v2" }} +{{- else if $.Capabilities.APIVersions.Has "autoscaling/v2beta2/HorizontalPodAutoscaler" }} +{{- print "autoscaling/v2beta2" }} +{{- else }} +{{- print "autoscaling/v2beta1" }} +{{- end }} +{{- end }} + +{{/* +Return the appropriate apiVersion for podDisruptionBudget. +*/}} +{{- define "grafana.podDisruptionBudget.apiVersion" -}} +{{- if $.Values.podDisruptionBudget.apiVersion }} +{{- print $.Values.podDisruptionBudget.apiVersion }} +{{- else if $.Capabilities.APIVersions.Has "policy/v1/PodDisruptionBudget" }} +{{- print "policy/v1" }} +{{- else }} +{{- print "policy/v1beta1" }} +{{- end }} +{{- end }} + +{{/* +Return if ingress is stable. +*/}} +{{- define "grafana.ingress.isStable" -}} +{{- eq (include "grafana.ingress.apiVersion" .) "networking.k8s.io/v1" }} +{{- end }} + +{{/* +Return if ingress supports ingressClassName. +*/}} +{{- define "grafana.ingress.supportsIngressClassName" -}} +{{- or (eq (include "grafana.ingress.isStable" .) "true") (and (eq (include "grafana.ingress.apiVersion" .) "networking.k8s.io/v1beta1") (semverCompare ">= 1.18-0" .Capabilities.KubeVersion.Version)) }} +{{- end }} + +{{/* +Return if ingress supports pathType. +*/}} +{{- define "grafana.ingress.supportsPathType" -}} +{{- or (eq (include "grafana.ingress.isStable" .) "true") (and (eq (include "grafana.ingress.apiVersion" .) "networking.k8s.io/v1beta1") (semverCompare ">= 1.18-0" .Capabilities.KubeVersion.Version)) }} +{{- end }} + +{{/* +Formats imagePullSecrets. Input is (dict "root" . "imagePullSecrets" .{specific imagePullSecrets}) +*/}} +{{- define "grafana.imagePullSecrets" -}} +{{- $root := .root }} +{{- range (concat .root.Values.global.imagePullSecrets .imagePullSecrets) }} +{{- if eq (typeOf .) "map[string]interface {}" }} +- {{ toYaml (dict "name" (tpl .name $root)) | trim }} +{{- else }} +- name: {{ tpl . $root }} +{{- end }} +{{- end }} +{{- end }} + + +{{/* + Checks whether or not the configSecret secret has to be created + */}} +{{- define "grafana.shouldCreateConfigSecret" -}} +{{- $secretFound := false -}} +{{- range $key, $value := .Values.datasources }} + {{- if hasKey $value "secret" }} + {{- $secretFound = true}} + {{- end }} +{{- end }} +{{- range $key, $value := .Values.notifiers }} + {{- if hasKey $value "secret" }} + {{- $secretFound = true}} + {{- end }} +{{- end }} +{{- range $key, $value := .Values.alerting }} + {{- if (or (hasKey $value "secret") (hasKey $value "secretFile")) }} + {{- $secretFound = true}} + {{- end }} +{{- end }} +{{- $secretFound}} +{{- end -}} + +{{/* + Checks whether the user is attempting to store secrets in plaintext + in the grafana.ini configmap +*/}} +{{/* grafana.assertNoLeakedSecrets checks for sensitive keys in values */}} +{{- define "grafana.assertNoLeakedSecrets" -}} + {{- $sensitiveKeysYaml := ` +sensitiveKeys: +- path: ["database", "password"] +- path: ["smtp", "password"] +- path: ["security", "secret_key"] +- path: ["security", "admin_password"] +- path: ["auth.basic", "password"] +- path: ["auth.ldap", "bind_password"] +- path: ["auth.google", "client_secret"] +- path: ["auth.github", "client_secret"] +- path: ["auth.gitlab", "client_secret"] +- path: ["auth.generic_oauth", "client_secret"] +- path: ["auth.okta", "client_secret"] +- path: ["auth.azuread", "client_secret"] +- path: ["auth.grafana_com", "client_secret"] +- path: ["auth.grafananet", "client_secret"] +- path: ["azure", "user_identity_client_secret"] +- path: ["unified_alerting", "ha_redis_password"] +- path: ["metrics", "basic_auth_password"] +- path: ["external_image_storage.s3", "secret_key"] +- path: ["external_image_storage.webdav", "password"] +- path: ["external_image_storage.azure_blob", "account_key"] +` | fromYaml -}} + {{- if $.Values.assertNoLeakedSecrets -}} + {{- $grafanaIni := index .Values "grafana.ini" -}} + {{- range $_, $secret := $sensitiveKeysYaml.sensitiveKeys -}} + {{- $currentMap := $grafanaIni -}} + {{- $shouldContinue := true -}} + {{- range $index, $elem := $secret.path -}} + {{- if and $shouldContinue (hasKey $currentMap $elem) -}} + {{- if eq (len $secret.path) (add1 $index) -}} + {{- if not (regexMatch "\\$(?:__(?:env|file|vault))?{[^}]+}" (index $currentMap $elem)) -}} + {{- fail (printf "Sensitive key '%s' should not be defined explicitly in values. Use variable expansion instead. You can disable this client-side validation by changing the value of assertNoLeakedSecrets." (join "." $secret.path)) -}} + {{- end -}} + {{- else -}} + {{- $currentMap = index $currentMap $elem -}} + {{- end -}} + {{- else -}} + {{- $shouldContinue = false -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/_pod.tpl b/thunder_deployment/infra/beta9/charts/grafana/templates/_pod.tpl new file mode 100644 index 000000000..80fb46609 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/_pod.tpl @@ -0,0 +1,1296 @@ +{{- define "grafana.pod" -}} +{{- $sts := list "sts" "StatefulSet" "statefulset" -}} +{{- $root := . -}} +{{- with .Values.schedulerName }} +schedulerName: "{{ . }}" +{{- end }} +serviceAccountName: {{ include "grafana.serviceAccountName" . }} +automountServiceAccountToken: {{ .Values.serviceAccount.autoMount }} +{{- with .Values.securityContext }} +securityContext: + {{- toYaml . | nindent 2 }} +{{- end }} +{{- with .Values.hostAliases }} +hostAliases: + {{- toYaml . | nindent 2 }} +{{- end }} +{{- if .Values.dnsPolicy }} +dnsPolicy: {{ .Values.dnsPolicy }} +{{- end }} +{{- with .Values.dnsConfig }} +dnsConfig: + {{- toYaml . | nindent 2 }} +{{- end }} +{{- with .Values.priorityClassName }} +priorityClassName: {{ . }} +{{- end }} +{{- if ( or .Values.persistence.enabled .Values.dashboards .Values.extraInitContainers (and .Values.sidecar.alerts.enabled .Values.sidecar.alerts.initAlerts) (and .Values.sidecar.datasources.enabled .Values.sidecar.datasources.initDatasources) (and .Values.sidecar.notifiers.enabled .Values.sidecar.notifiers.initNotifiers)) }} +initContainers: +{{- end }} +{{- if ( and .Values.persistence.enabled .Values.initChownData.enabled ) }} + - name: init-chown-data + {{- $registry := .Values.global.imageRegistry | default .Values.initChownData.image.registry -}} + {{- if .Values.initChownData.image.sha }} + image: "{{ $registry }}/{{ .Values.initChownData.image.repository }}:{{ .Values.initChownData.image.tag }}@sha256:{{ .Values.initChownData.image.sha }}" + {{- else }} + image: "{{ $registry }}/{{ .Values.initChownData.image.repository }}:{{ .Values.initChownData.image.tag }}" + {{- end }} + imagePullPolicy: {{ .Values.initChownData.image.pullPolicy }} + {{- with .Values.initChownData.securityContext }} + securityContext: + {{- toYaml . | nindent 6 }} + {{- end }} + command: + - chown + - -R + - {{ .Values.securityContext.runAsUser }}:{{ .Values.securityContext.runAsGroup }} + - /var/lib/grafana + {{- with .Values.initChownData.resources }} + resources: + {{- toYaml . | nindent 6 }} + {{- end }} + volumeMounts: + - name: storage + mountPath: "/var/lib/grafana" + {{- with .Values.persistence.subPath }} + subPath: {{ tpl . $root }} + {{- end }} +{{- end }} +{{- if .Values.dashboards }} + - name: download-dashboards + {{- $registry := .Values.global.imageRegistry | default .Values.downloadDashboardsImage.registry -}} + {{- if .Values.downloadDashboardsImage.sha }} + image: "{{ $registry }}/{{ .Values.downloadDashboardsImage.repository }}:{{ .Values.downloadDashboardsImage.tag }}@sha256:{{ .Values.downloadDashboardsImage.sha }}" + {{- else }} + image: "{{ $registry }}/{{ .Values.downloadDashboardsImage.repository }}:{{ .Values.downloadDashboardsImage.tag }}" + {{- end }} + imagePullPolicy: {{ .Values.downloadDashboardsImage.pullPolicy }} + command: ["/bin/sh"] + args: [ "-c", "mkdir -p /var/lib/grafana/dashboards/default && /bin/sh -x /etc/grafana/download_dashboards.sh" ] + {{- with .Values.downloadDashboards.resources }} + resources: + {{- toYaml . | nindent 6 }} + {{- end }} + env: + {{- range $key, $value := .Values.downloadDashboards.env }} + - name: "{{ $key }}" + value: "{{ $value }}" + {{- end }} + {{- range $key, $value := .Values.downloadDashboards.envValueFrom }} + - name: {{ $key | quote }} + valueFrom: + {{- tpl (toYaml $value) $ | nindent 10 }} + {{- end }} + {{- with .Values.downloadDashboards.securityContext }} + securityContext: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.downloadDashboards.envFromSecret }} + envFrom: + - secretRef: + name: {{ tpl . $root }} + {{- end }} + volumeMounts: + - name: config + mountPath: "/etc/grafana/download_dashboards.sh" + subPath: download_dashboards.sh + - name: storage + mountPath: "/var/lib/grafana" + {{- with .Values.persistence.subPath }} + subPath: {{ tpl . $root }} + {{- end }} + {{- range .Values.extraSecretMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + readOnly: {{ .readOnly }} + {{- end }} +{{- end }} +{{- if and .Values.sidecar.alerts.enabled .Values.sidecar.alerts.initAlerts }} + - name: {{ include "grafana.name" . }}-init-sc-alerts + {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} + {{- if .Values.sidecar.image.sha }} + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" + {{- else }} + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" + {{- end }} + imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} + env: + {{- range $key, $value := .Values.sidecar.alerts.env }} + - name: "{{ $key }}" + value: "{{ $value }}" + {{- end }} + {{- if .Values.sidecar.alerts.ignoreAlreadyProcessed }} + - name: IGNORE_ALREADY_PROCESSED + value: "true" + {{- end }} + - name: METHOD + value: "LIST" + - name: LABEL + value: "{{ .Values.sidecar.alerts.label }}" + {{- with .Values.sidecar.alerts.labelValue }} + - name: LABEL_VALUE + value: {{ quote . }} + {{- end }} + {{- if or .Values.sidecar.logLevel .Values.sidecar.alerts.logLevel }} + - name: LOG_LEVEL + value: {{ default .Values.sidecar.logLevel .Values.sidecar.alerts.logLevel }} + {{- end }} + - name: FOLDER + value: "/etc/grafana/provisioning/alerting" + - name: RESOURCE + value: {{ quote .Values.sidecar.alerts.resource }} + {{- with .Values.sidecar.enableUniqueFilenames }} + - name: UNIQUE_FILENAMES + value: "{{ . }}" + {{- end }} + {{- with .Values.sidecar.alerts.searchNamespace }} + - name: NAMESPACE + value: {{ . | join "," | quote }} + {{- end }} + {{- with .Values.sidecar.alerts.skipTlsVerify }} + - name: SKIP_TLS_VERIFY + value: {{ quote . }} + {{- end }} + {{- with .Values.sidecar.alerts.script }} + - name: SCRIPT + value: {{ quote . }} + {{- end }} + {{- with .Values.sidecar.livenessProbe }} + livenessProbe: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.readinessProbe }} + readinessProbe: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.resources }} + resources: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.securityContext }} + securityContext: + {{- toYaml . | nindent 6 }} + {{- end }} + volumeMounts: + - name: sc-alerts-volume + mountPath: "/etc/grafana/provisioning/alerting" + {{- with .Values.sidecar.alerts.extraMounts }} + {{- toYaml . | trim | nindent 6 }} + {{- end }} +{{- end }} +{{- if and .Values.sidecar.datasources.enabled .Values.sidecar.datasources.initDatasources }} + - name: {{ include "grafana.name" . }}-init-sc-datasources + {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} + {{- if .Values.sidecar.image.sha }} + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" + {{- else }} + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" + {{- end }} + imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} + env: + {{- range $key, $value := .Values.sidecar.datasources.env }} + - name: "{{ $key }}" + value: "{{ $value }}" + {{- end }} + {{- if .Values.sidecar.datasources.ignoreAlreadyProcessed }} + - name: IGNORE_ALREADY_PROCESSED + value: "true" + {{- end }} + - name: METHOD + value: "LIST" + - name: LABEL + value: "{{ .Values.sidecar.datasources.label }}" + {{- with .Values.sidecar.datasources.labelValue }} + - name: LABEL_VALUE + value: {{ quote . }} + {{- end }} + {{- if or .Values.sidecar.logLevel .Values.sidecar.datasources.logLevel }} + - name: LOG_LEVEL + value: {{ default .Values.sidecar.logLevel .Values.sidecar.datasources.logLevel }} + {{- end }} + - name: FOLDER + value: "/etc/grafana/provisioning/datasources" + - name: RESOURCE + value: {{ quote .Values.sidecar.datasources.resource }} + {{- with .Values.sidecar.enableUniqueFilenames }} + - name: UNIQUE_FILENAMES + value: "{{ . }}" + {{- end }} + {{- if .Values.sidecar.datasources.searchNamespace }} + - name: NAMESPACE + value: "{{ tpl (.Values.sidecar.datasources.searchNamespace | join ",") . }}" + {{- end }} + {{- with .Values.sidecar.skipTlsVerify }} + - name: SKIP_TLS_VERIFY + value: "{{ . }}" + {{- end }} + {{- with .Values.sidecar.resources }} + resources: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.securityContext }} + securityContext: + {{- toYaml . | nindent 6 }} + {{- end }} + volumeMounts: + - name: sc-datasources-volume + mountPath: "/etc/grafana/provisioning/datasources" +{{- end }} +{{- if and .Values.sidecar.notifiers.enabled .Values.sidecar.notifiers.initNotifiers }} + - name: {{ include "grafana.name" . }}-init-sc-notifiers + {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} + {{- if .Values.sidecar.image.sha }} + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" + {{- else }} + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" + {{- end }} + imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} + env: + {{- range $key, $value := .Values.sidecar.notifiers.env }} + - name: "{{ $key }}" + value: "{{ $value }}" + {{- end }} + {{- if .Values.sidecar.notifiers.ignoreAlreadyProcessed }} + - name: IGNORE_ALREADY_PROCESSED + value: "true" + {{- end }} + - name: METHOD + value: LIST + - name: LABEL + value: "{{ .Values.sidecar.notifiers.label }}" + {{- with .Values.sidecar.notifiers.labelValue }} + - name: LABEL_VALUE + value: {{ quote . }} + {{- end }} + {{- if or .Values.sidecar.logLevel .Values.sidecar.notifiers.logLevel }} + - name: LOG_LEVEL + value: {{ default .Values.sidecar.logLevel .Values.sidecar.notifiers.logLevel }} + {{- end }} + - name: FOLDER + value: "/etc/grafana/provisioning/notifiers" + - name: RESOURCE + value: {{ quote .Values.sidecar.notifiers.resource }} + {{- with .Values.sidecar.enableUniqueFilenames }} + - name: UNIQUE_FILENAMES + value: "{{ . }}" + {{- end }} + {{- with .Values.sidecar.notifiers.searchNamespace }} + - name: NAMESPACE + value: "{{ tpl (. | join ",") $root }}" + {{- end }} + {{- with .Values.sidecar.skipTlsVerify }} + - name: SKIP_TLS_VERIFY + value: "{{ . }}" + {{- end }} + {{- with .Values.sidecar.livenessProbe }} + livenessProbe: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.readinessProbe }} + readinessProbe: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.resources }} + resources: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.securityContext }} + securityContext: + {{- toYaml . | nindent 6 }} + {{- end }} + volumeMounts: + - name: sc-notifiers-volume + mountPath: "/etc/grafana/provisioning/notifiers" +{{- end}} +{{- with .Values.extraInitContainers }} + {{- tpl (toYaml .) $root | nindent 2 }} +{{- end }} +{{- if or .Values.image.pullSecrets .Values.global.imagePullSecrets }} +imagePullSecrets: + {{- include "grafana.imagePullSecrets" (dict "root" $root "imagePullSecrets" .Values.image.pullSecrets) | nindent 2 }} +{{- end }} +{{- if not .Values.enableKubeBackwardCompatibility }} +enableServiceLinks: {{ .Values.enableServiceLinks }} +{{- end }} +containers: +{{- if and .Values.sidecar.alerts.enabled (not .Values.sidecar.alerts.initAlerts) }} + - name: {{ include "grafana.name" . }}-sc-alerts + {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} + {{- if .Values.sidecar.image.sha }} + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" + {{- else }} + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" + {{- end }} + imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} + env: + {{- range $key, $value := .Values.sidecar.alerts.env }} + - name: "{{ $key }}" + value: "{{ $value }}" + {{- end }} + {{- if .Values.sidecar.alerts.ignoreAlreadyProcessed }} + - name: IGNORE_ALREADY_PROCESSED + value: "true" + {{- end }} + - name: METHOD + value: {{ .Values.sidecar.alerts.watchMethod }} + - name: LABEL + value: "{{ .Values.sidecar.alerts.label }}" + {{- with .Values.sidecar.alerts.labelValue }} + - name: LABEL_VALUE + value: {{ quote . }} + {{- end }} + {{- if or .Values.sidecar.logLevel .Values.sidecar.alerts.logLevel }} + - name: LOG_LEVEL + value: {{ default .Values.sidecar.logLevel .Values.sidecar.alerts.logLevel }} + {{- end }} + - name: FOLDER + value: "/etc/grafana/provisioning/alerting" + - name: RESOURCE + value: {{ quote .Values.sidecar.alerts.resource }} + {{- with .Values.sidecar.enableUniqueFilenames }} + - name: UNIQUE_FILENAMES + value: "{{ . }}" + {{- end }} + {{- with .Values.sidecar.alerts.searchNamespace }} + - name: NAMESPACE + value: {{ . | join "," | quote }} + {{- end }} + {{- with .Values.sidecar.alerts.skipTlsVerify }} + - name: SKIP_TLS_VERIFY + value: {{ quote . }} + {{- end }} + {{- with .Values.sidecar.alerts.script }} + - name: SCRIPT + value: {{ quote . }} + {{- end }} + {{- if and (not .Values.env.GF_SECURITY_ADMIN_USER) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} + - name: REQ_USERNAME + valueFrom: + secretKeyRef: + name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} + key: {{ .Values.admin.userKey | default "admin-user" }} + {{- end }} + {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} + - name: REQ_PASSWORD + valueFrom: + secretKeyRef: + name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} + key: {{ .Values.admin.passwordKey | default "admin-password" }} + {{- end }} + {{- if not .Values.sidecar.alerts.skipReload }} + - name: REQ_URL + value: {{ .Values.sidecar.alerts.reloadURL }} + - name: REQ_METHOD + value: POST + {{- end }} + {{- if .Values.sidecar.alerts.watchServerTimeout }} + {{- if ne .Values.sidecar.alerts.watchMethod "WATCH" }} + {{- fail (printf "Cannot use .Values.sidecar.alerts.watchServerTimeout with .Values.sidecar.alerts.watchMethod %s" .Values.sidecar.alerts.watchMethod) }} + {{- end }} + - name: WATCH_SERVER_TIMEOUT + value: "{{ .Values.sidecar.alerts.watchServerTimeout }}" + {{- end }} + {{- if .Values.sidecar.alerts.watchClientTimeout }} + {{- if ne .Values.sidecar.alerts.watchMethod "WATCH" }} + {{- fail (printf "Cannot use .Values.sidecar.alerts.watchClientTimeout with .Values.sidecar.alerts.watchMethod %s" .Values.sidecar.alerts.watchMethod) }} + {{- end }} + - name: WATCH_CLIENT_TIMEOUT + value: "{{ .Values.sidecar.alerts.watchClientTimeout }}" + {{- end }} + {{- with .Values.sidecar.livenessProbe }} + livenessProbe: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.readinessProbe }} + readinessProbe: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.resources }} + resources: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.securityContext }} + securityContext: + {{- toYaml . | nindent 6 }} + {{- end }} + volumeMounts: + - name: sc-alerts-volume + mountPath: "/etc/grafana/provisioning/alerting" + {{- with .Values.sidecar.alerts.extraMounts }} + {{- toYaml . | trim | nindent 6 }} + {{- end }} +{{- end}} +{{- if .Values.sidecar.dashboards.enabled }} + - name: {{ include "grafana.name" . }}-sc-dashboard + {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} + {{- if .Values.sidecar.image.sha }} + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" + {{- else }} + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" + {{- end }} + imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} + env: + {{- range $key, $value := .Values.sidecar.dashboards.env }} + - name: "{{ $key }}" + value: "{{ $value }}" + {{- end }} + {{- range $key, $value := .Values.sidecar.datasources.envValueFrom }} + - name: {{ $key | quote }} + valueFrom: + {{- tpl (toYaml $value) $ | nindent 10 }} + {{- end }} + {{- if .Values.sidecar.dashboards.ignoreAlreadyProcessed }} + - name: IGNORE_ALREADY_PROCESSED + value: "true" + {{- end }} + - name: METHOD + value: {{ .Values.sidecar.dashboards.watchMethod }} + - name: LABEL + value: "{{ .Values.sidecar.dashboards.label }}" + {{- with .Values.sidecar.dashboards.labelValue }} + - name: LABEL_VALUE + value: {{ quote . }} + {{- end }} + {{- if or .Values.sidecar.logLevel .Values.sidecar.dashboards.logLevel }} + - name: LOG_LEVEL + value: {{ default .Values.sidecar.logLevel .Values.sidecar.dashboards.logLevel }} + {{- end }} + - name: FOLDER + value: "{{ .Values.sidecar.dashboards.folder }}{{- with .Values.sidecar.dashboards.defaultFolderName }}/{{ . }}{{- end }}" + - name: RESOURCE + value: {{ quote .Values.sidecar.dashboards.resource }} + {{- with .Values.sidecar.enableUniqueFilenames }} + - name: UNIQUE_FILENAMES + value: "{{ . }}" + {{- end }} + {{- with .Values.sidecar.dashboards.searchNamespace }} + - name: NAMESPACE + value: "{{ tpl (. | join ",") $root }}" + {{- end }} + {{- with .Values.sidecar.skipTlsVerify }} + - name: SKIP_TLS_VERIFY + value: "{{ . }}" + {{- end }} + {{- with .Values.sidecar.dashboards.folderAnnotation }} + - name: FOLDER_ANNOTATION + value: "{{ . }}" + {{- end }} + {{- with .Values.sidecar.dashboards.script }} + - name: SCRIPT + value: "{{ . }}" + {{- end }} + {{- if not .Values.sidecar.dashboards.skipReload }} + {{- if and (not .Values.env.GF_SECURITY_ADMIN_USER) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} + - name: REQ_USERNAME + valueFrom: + secretKeyRef: + name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} + key: {{ .Values.admin.userKey | default "admin-user" }} + {{- end }} + {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} + - name: REQ_PASSWORD + valueFrom: + secretKeyRef: + name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} + key: {{ .Values.admin.passwordKey | default "admin-password" }} + {{- end }} + - name: REQ_URL + value: {{ .Values.sidecar.dashboards.reloadURL }} + - name: REQ_METHOD + value: POST + {{- end }} + {{- if .Values.sidecar.dashboards.watchServerTimeout }} + {{- if ne .Values.sidecar.dashboards.watchMethod "WATCH" }} + {{- fail (printf "Cannot use .Values.sidecar.dashboards.watchServerTimeout with .Values.sidecar.dashboards.watchMethod %s" .Values.sidecar.dashboards.watchMethod) }} + {{- end }} + - name: WATCH_SERVER_TIMEOUT + value: "{{ .Values.sidecar.dashboards.watchServerTimeout }}" + {{- end }} + {{- if .Values.sidecar.dashboards.watchClientTimeout }} + {{- if ne .Values.sidecar.dashboards.watchMethod "WATCH" }} + {{- fail (printf "Cannot use .Values.sidecar.dashboards.watchClientTimeout with .Values.sidecar.dashboards.watchMethod %s" .Values.sidecar.dashboards.watchMethod) }} + {{- end }} + - name: WATCH_CLIENT_TIMEOUT + value: {{ .Values.sidecar.dashboards.watchClientTimeout | quote }} + {{- end }} + {{- with .Values.sidecar.livenessProbe }} + livenessProbe: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.readinessProbe }} + readinessProbe: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.resources }} + resources: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.securityContext }} + securityContext: + {{- toYaml . | nindent 6 }} + {{- end }} + volumeMounts: + - name: sc-dashboard-volume + mountPath: {{ .Values.sidecar.dashboards.folder | quote }} + {{- with .Values.sidecar.dashboards.extraMounts }} + {{- toYaml . | trim | nindent 6 }} + {{- end }} +{{- end}} +{{- if and .Values.sidecar.datasources.enabled (not .Values.sidecar.datasources.initDatasources) }} + - name: {{ include "grafana.name" . }}-sc-datasources + {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} + {{- if .Values.sidecar.image.sha }} + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" + {{- else }} + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" + {{- end }} + imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} + env: + {{- range $key, $value := .Values.sidecar.datasources.env }} + - name: "{{ $key }}" + value: "{{ $value }}" + {{- end }} + {{- if .Values.sidecar.datasources.ignoreAlreadyProcessed }} + - name: IGNORE_ALREADY_PROCESSED + value: "true" + {{- end }} + - name: METHOD + value: {{ .Values.sidecar.datasources.watchMethod }} + - name: LABEL + value: "{{ .Values.sidecar.datasources.label }}" + {{- with .Values.sidecar.datasources.labelValue }} + - name: LABEL_VALUE + value: {{ quote . }} + {{- end }} + {{- if or .Values.sidecar.logLevel .Values.sidecar.datasources.logLevel }} + - name: LOG_LEVEL + value: {{ default .Values.sidecar.logLevel .Values.sidecar.datasources.logLevel }} + {{- end }} + - name: FOLDER + value: "/etc/grafana/provisioning/datasources" + - name: RESOURCE + value: {{ quote .Values.sidecar.datasources.resource }} + {{- with .Values.sidecar.enableUniqueFilenames }} + - name: UNIQUE_FILENAMES + value: "{{ . }}" + {{- end }} + {{- with .Values.sidecar.datasources.searchNamespace }} + - name: NAMESPACE + value: "{{ tpl (. | join ",") $root }}" + {{- end }} + {{- if .Values.sidecar.skipTlsVerify }} + - name: SKIP_TLS_VERIFY + value: "{{ .Values.sidecar.skipTlsVerify }}" + {{- end }} + {{- if .Values.sidecar.datasources.script }} + - name: SCRIPT + value: "{{ .Values.sidecar.datasources.script }}" + {{- end }} + {{- if and (not .Values.env.GF_SECURITY_ADMIN_USER) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} + - name: REQ_USERNAME + valueFrom: + secretKeyRef: + name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} + key: {{ .Values.admin.userKey | default "admin-user" }} + {{- end }} + {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} + - name: REQ_PASSWORD + valueFrom: + secretKeyRef: + name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} + key: {{ .Values.admin.passwordKey | default "admin-password" }} + {{- end }} + {{- if not .Values.sidecar.datasources.skipReload }} + - name: REQ_URL + value: {{ .Values.sidecar.datasources.reloadURL }} + - name: REQ_METHOD + value: POST + {{- end }} + {{- if .Values.sidecar.datasources.watchServerTimeout }} + {{- if ne .Values.sidecar.datasources.watchMethod "WATCH" }} + {{- fail (printf "Cannot use .Values.sidecar.datasources.watchServerTimeout with .Values.sidecar.datasources.watchMethod %s" .Values.sidecar.datasources.watchMethod) }} + {{- end }} + - name: WATCH_SERVER_TIMEOUT + value: "{{ .Values.sidecar.datasources.watchServerTimeout }}" + {{- end }} + {{- if .Values.sidecar.datasources.watchClientTimeout }} + {{- if ne .Values.sidecar.datasources.watchMethod "WATCH" }} + {{- fail (printf "Cannot use .Values.sidecar.datasources.watchClientTimeout with .Values.sidecar.datasources.watchMethod %s" .Values.sidecar.datasources.watchMethod) }} + {{- end }} + - name: WATCH_CLIENT_TIMEOUT + value: "{{ .Values.sidecar.datasources.watchClientTimeout }}" + {{- end }} + {{- with .Values.sidecar.livenessProbe }} + livenessProbe: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.readinessProbe }} + readinessProbe: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.resources }} + resources: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.securityContext }} + securityContext: + {{- toYaml . | nindent 6 }} + {{- end }} + volumeMounts: + - name: sc-datasources-volume + mountPath: "/etc/grafana/provisioning/datasources" +{{- end}} +{{- if .Values.sidecar.notifiers.enabled }} + - name: {{ include "grafana.name" . }}-sc-notifiers + {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} + {{- if .Values.sidecar.image.sha }} + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" + {{- else }} + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" + {{- end }} + imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} + env: + {{- range $key, $value := .Values.sidecar.notifiers.env }} + - name: "{{ $key }}" + value: "{{ $value }}" + {{- end }} + {{- if .Values.sidecar.notifiers.ignoreAlreadyProcessed }} + - name: IGNORE_ALREADY_PROCESSED + value: "true" + {{- end }} + - name: METHOD + value: {{ .Values.sidecar.notifiers.watchMethod }} + - name: LABEL + value: "{{ .Values.sidecar.notifiers.label }}" + {{- with .Values.sidecar.notifiers.labelValue }} + - name: LABEL_VALUE + value: {{ quote . }} + {{- end }} + {{- if or .Values.sidecar.logLevel .Values.sidecar.notifiers.logLevel }} + - name: LOG_LEVEL + value: {{ default .Values.sidecar.logLevel .Values.sidecar.notifiers.logLevel }} + {{- end }} + - name: FOLDER + value: "/etc/grafana/provisioning/notifiers" + - name: RESOURCE + value: {{ quote .Values.sidecar.notifiers.resource }} + {{- if .Values.sidecar.enableUniqueFilenames }} + - name: UNIQUE_FILENAMES + value: "{{ .Values.sidecar.enableUniqueFilenames }}" + {{- end }} + {{- with .Values.sidecar.notifiers.searchNamespace }} + - name: NAMESPACE + value: "{{ tpl (. | join ",") $root }}" + {{- end }} + {{- with .Values.sidecar.skipTlsVerify }} + - name: SKIP_TLS_VERIFY + value: "{{ . }}" + {{- end }} + {{- if .Values.sidecar.notifiers.script }} + - name: SCRIPT + value: "{{ .Values.sidecar.notifiers.script }}" + {{- end }} + {{- if and (not .Values.env.GF_SECURITY_ADMIN_USER) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} + - name: REQ_USERNAME + valueFrom: + secretKeyRef: + name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} + key: {{ .Values.admin.userKey | default "admin-user" }} + {{- end }} + {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} + - name: REQ_PASSWORD + valueFrom: + secretKeyRef: + name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} + key: {{ .Values.admin.passwordKey | default "admin-password" }} + {{- end }} + {{- if not .Values.sidecar.notifiers.skipReload }} + - name: REQ_URL + value: {{ .Values.sidecar.notifiers.reloadURL }} + - name: REQ_METHOD + value: POST + {{- end }} + {{- if .Values.sidecar.notifiers.watchServerTimeout }} + {{- if ne .Values.sidecar.notifiers.watchMethod "WATCH" }} + {{- fail (printf "Cannot use .Values.sidecar.notifiers.watchServerTimeout with .Values.sidecar.notifiers.watchMethod %s" .Values.sidecar.notifiers.watchMethod) }} + {{- end }} + - name: WATCH_SERVER_TIMEOUT + value: "{{ .Values.sidecar.notifiers.watchServerTimeout }}" + {{- end }} + {{- if .Values.sidecar.notifiers.watchClientTimeout }} + {{- if ne .Values.sidecar.notifiers.watchMethod "WATCH" }} + {{- fail (printf "Cannot use .Values.sidecar.notifiers.watchClientTimeout with .Values.sidecar.notifiers.watchMethod %s" .Values.sidecar.notifiers.watchMethod) }} + {{- end }} + - name: WATCH_CLIENT_TIMEOUT + value: "{{ .Values.sidecar.notifiers.watchClientTimeout }}" + {{- end }} + {{- with .Values.sidecar.livenessProbe }} + livenessProbe: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.readinessProbe }} + readinessProbe: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.resources }} + resources: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.securityContext }} + securityContext: + {{- toYaml . | nindent 6 }} + {{- end }} + volumeMounts: + - name: sc-notifiers-volume + mountPath: "/etc/grafana/provisioning/notifiers" +{{- end}} +{{- if .Values.sidecar.plugins.enabled }} + - name: {{ include "grafana.name" . }}-sc-plugins + {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} + {{- if .Values.sidecar.image.sha }} + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" + {{- else }} + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" + {{- end }} + imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} + env: + {{- range $key, $value := .Values.sidecar.plugins.env }} + - name: "{{ $key }}" + value: "{{ $value }}" + {{- end }} + {{- if .Values.sidecar.plugins.ignoreAlreadyProcessed }} + - name: IGNORE_ALREADY_PROCESSED + value: "true" + {{- end }} + - name: METHOD + value: {{ .Values.sidecar.plugins.watchMethod }} + - name: LABEL + value: "{{ .Values.sidecar.plugins.label }}" + {{- if .Values.sidecar.plugins.labelValue }} + - name: LABEL_VALUE + value: {{ quote .Values.sidecar.plugins.labelValue }} + {{- end }} + {{- if or .Values.sidecar.logLevel .Values.sidecar.plugins.logLevel }} + - name: LOG_LEVEL + value: {{ default .Values.sidecar.logLevel .Values.sidecar.plugins.logLevel }} + {{- end }} + - name: FOLDER + value: "/etc/grafana/provisioning/plugins" + - name: RESOURCE + value: {{ quote .Values.sidecar.plugins.resource }} + {{- with .Values.sidecar.enableUniqueFilenames }} + - name: UNIQUE_FILENAMES + value: "{{ . }}" + {{- end }} + {{- with .Values.sidecar.plugins.searchNamespace }} + - name: NAMESPACE + value: "{{ tpl (. | join ",") $root }}" + {{- end }} + {{- with .Values.sidecar.plugins.script }} + - name: SCRIPT + value: "{{ . }}" + {{- end }} + {{- with .Values.sidecar.skipTlsVerify }} + - name: SKIP_TLS_VERIFY + value: "{{ . }}" + {{- end }} + {{- if and (not .Values.env.GF_SECURITY_ADMIN_USER) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} + - name: REQ_USERNAME + valueFrom: + secretKeyRef: + name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} + key: {{ .Values.admin.userKey | default "admin-user" }} + {{- end }} + {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} + - name: REQ_PASSWORD + valueFrom: + secretKeyRef: + name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} + key: {{ .Values.admin.passwordKey | default "admin-password" }} + {{- end }} + {{- if not .Values.sidecar.plugins.skipReload }} + - name: REQ_URL + value: {{ .Values.sidecar.plugins.reloadURL }} + - name: REQ_METHOD + value: POST + {{- end }} + {{- if .Values.sidecar.plugins.watchServerTimeout }} + {{- if ne .Values.sidecar.plugins.watchMethod "WATCH" }} + {{- fail (printf "Cannot use .Values.sidecar.plugins.watchServerTimeout with .Values.sidecar.plugins.watchMethod %s" .Values.sidecar.plugins.watchMethod) }} + {{- end }} + - name: WATCH_SERVER_TIMEOUT + value: "{{ .Values.sidecar.plugins.watchServerTimeout }}" + {{- end }} + {{- if .Values.sidecar.plugins.watchClientTimeout }} + {{- if ne .Values.sidecar.plugins.watchMethod "WATCH" }} + {{- fail (printf "Cannot use .Values.sidecar.plugins.watchClientTimeout with .Values.sidecar.plugins.watchMethod %s" .Values.sidecar.plugins.watchMethod) }} + {{- end }} + - name: WATCH_CLIENT_TIMEOUT + value: "{{ .Values.sidecar.plugins.watchClientTimeout }}" + {{- end }} + {{- with .Values.sidecar.livenessProbe }} + livenessProbe: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.readinessProbe }} + readinessProbe: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.resources }} + resources: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.securityContext }} + securityContext: + {{- toYaml . | nindent 6 }} + {{- end }} + volumeMounts: + - name: sc-plugins-volume + mountPath: "/etc/grafana/provisioning/plugins" +{{- end}} + - name: {{ .Chart.Name }} + {{- $registry := .Values.global.imageRegistry | default .Values.image.registry -}} + {{- if .Values.image.sha }} + image: "{{ $registry }}/{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}@sha256:{{ .Values.image.sha }}" + {{- else }} + image: "{{ $registry }}/{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + {{- end }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + {{- if .Values.command }} + command: + {{- range .Values.command }} + - {{ . | quote }} + {{- end }} + {{- end }} + {{- if .Values.args }} + args: + {{- range .Values.args }} + - {{ . | quote }} + {{- end }} + {{- end }} + {{- with .Values.containerSecurityContext }} + securityContext: + {{- toYaml . | nindent 6 }} + {{- end }} + volumeMounts: + - name: config + mountPath: "/etc/grafana/grafana.ini" + subPath: grafana.ini + {{- if .Values.ldap.enabled }} + - name: ldap + mountPath: "/etc/grafana/ldap.toml" + subPath: ldap.toml + {{- end }} + {{- range .Values.extraConfigmapMounts }} + - name: {{ tpl .name $root }} + mountPath: {{ tpl .mountPath $root }} + subPath: {{ tpl (.subPath | default "") $root }} + readOnly: {{ .readOnly }} + {{- end }} + - name: storage + mountPath: "/var/lib/grafana" + {{- with .Values.persistence.subPath }} + subPath: {{ tpl . $root }} + {{- end }} + {{- with .Values.dashboards }} + {{- range $provider, $dashboards := . }} + {{- range $key, $value := $dashboards }} + {{- if (or (hasKey $value "json") (hasKey $value "file")) }} + - name: dashboards-{{ $provider }} + mountPath: "/var/lib/grafana/dashboards/{{ $provider }}/{{ $key }}.json" + subPath: "{{ $key }}.json" + {{- end }} + {{- end }} + {{- end }} + {{- end }} + {{- with .Values.dashboardsConfigMaps }} + {{- range (keys . | sortAlpha) }} + - name: dashboards-{{ . }} + mountPath: "/var/lib/grafana/dashboards/{{ . }}" + {{- end }} + {{- end }} + {{- with .Values.datasources }} + {{- $datasources := . }} + {{- range (keys . | sortAlpha) }} + {{- if (or (hasKey (index $datasources .) "secret")) }} {{/*check if current datasource should be handeled as secret */}} + - name: config-secret + mountPath: "/etc/grafana/provisioning/datasources/{{ . }}" + subPath: {{ . | quote }} + {{- else }} + - name: config + mountPath: "/etc/grafana/provisioning/datasources/{{ . }}" + subPath: {{ . | quote }} + {{- end }} + {{- end }} + {{- end }} + {{- with .Values.notifiers }} + {{- $notifiers := . }} + {{- range (keys . | sortAlpha) }} + {{- if (or (hasKey (index $notifiers .) "secret")) }} {{/*check if current notifier should be handeled as secret */}} + - name: config-secret + mountPath: "/etc/grafana/provisioning/notifiers/{{ . }}" + subPath: {{ . | quote }} + {{- else }} + - name: config + mountPath: "/etc/grafana/provisioning/notifiers/{{ . }}" + subPath: {{ . | quote }} + {{- end }} + {{- end }} + {{- end }} + {{- with .Values.alerting }} + {{- $alertingmap := .}} + {{- range (keys . | sortAlpha) }} + {{- if (or (hasKey (index $.Values.alerting .) "secret") (hasKey (index $.Values.alerting .) "secretFile")) }} {{/*check if current alerting entry should be handeled as secret */}} + - name: config-secret + mountPath: "/etc/grafana/provisioning/alerting/{{ . }}" + subPath: {{ . | quote }} + {{- else }} + - name: config + mountPath: "/etc/grafana/provisioning/alerting/{{ . }}" + subPath: {{ . | quote }} + {{- end }} + {{- end }} + {{- end }} + {{- with .Values.dashboardProviders }} + {{- range (keys . | sortAlpha) }} + - name: config + mountPath: "/etc/grafana/provisioning/dashboards/{{ . }}" + subPath: {{ . | quote }} + {{- end }} + {{- end }} + {{- with .Values.sidecar.alerts.enabled }} + - name: sc-alerts-volume + mountPath: "/etc/grafana/provisioning/alerting" + {{- end}} + {{- if .Values.sidecar.dashboards.enabled }} + - name: sc-dashboard-volume + mountPath: {{ .Values.sidecar.dashboards.folder | quote }} + {{- if .Values.sidecar.dashboards.SCProvider }} + - name: sc-dashboard-provider + mountPath: "/etc/grafana/provisioning/dashboards/sc-dashboardproviders.yaml" + subPath: provider.yaml + {{- end}} + {{- end}} + {{- if .Values.sidecar.datasources.enabled }} + - name: sc-datasources-volume + mountPath: "/etc/grafana/provisioning/datasources" + {{- end}} + {{- if .Values.sidecar.plugins.enabled }} + - name: sc-plugins-volume + mountPath: "/etc/grafana/provisioning/plugins" + {{- end}} + {{- if .Values.sidecar.notifiers.enabled }} + - name: sc-notifiers-volume + mountPath: "/etc/grafana/provisioning/notifiers" + {{- end}} + {{- range .Values.extraSecretMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + readOnly: {{ .readOnly }} + subPath: {{ .subPath | default "" }} + {{- end }} + {{- range .Values.extraVolumeMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath | default "" }} + readOnly: {{ .readOnly }} + {{- end }} + {{- range .Values.extraEmptyDirMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + {{- end }} + ports: + - name: {{ .Values.podPortName }} + containerPort: {{ .Values.service.targetPort }} + protocol: TCP + - name: {{ .Values.gossipPortName }}-tcp + containerPort: 9094 + protocol: TCP + - name: {{ .Values.gossipPortName }}-udp + containerPort: 9094 + protocol: UDP + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + {{- if and (not .Values.env.GF_SECURITY_ADMIN_USER) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} + - name: GF_SECURITY_ADMIN_USER + valueFrom: + secretKeyRef: + name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} + key: {{ .Values.admin.userKey | default "admin-user" }} + {{- end }} + {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} + - name: GF_SECURITY_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} + key: {{ .Values.admin.passwordKey | default "admin-password" }} + {{- end }} + {{- if .Values.plugins }} + - name: GF_INSTALL_PLUGINS + valueFrom: + configMapKeyRef: + name: {{ include "grafana.fullname" . }} + key: plugins + {{- end }} + {{- if .Values.smtp.existingSecret }} + - name: GF_SMTP_USER + valueFrom: + secretKeyRef: + name: {{ .Values.smtp.existingSecret }} + key: {{ .Values.smtp.userKey | default "user" }} + - name: GF_SMTP_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.smtp.existingSecret }} + key: {{ .Values.smtp.passwordKey | default "password" }} + {{- end }} + {{- if .Values.imageRenderer.enabled }} + - name: GF_RENDERING_SERVER_URL + value: http://{{ include "grafana.fullname" . }}-image-renderer.{{ include "grafana.namespace" . }}:{{ .Values.imageRenderer.service.port }}/render + - name: GF_RENDERING_CALLBACK_URL + value: {{ .Values.imageRenderer.grafanaProtocol }}://{{ include "grafana.fullname" . }}.{{ include "grafana.namespace" . }}:{{ .Values.service.port }}/{{ .Values.imageRenderer.grafanaSubPath }} + {{- end }} + - name: GF_PATHS_DATA + value: {{ (get .Values "grafana.ini").paths.data }} + - name: GF_PATHS_LOGS + value: {{ (get .Values "grafana.ini").paths.logs }} + - name: GF_PATHS_PLUGINS + value: {{ (get .Values "grafana.ini").paths.plugins }} + - name: GF_PATHS_PROVISIONING + value: {{ (get .Values "grafana.ini").paths.provisioning }} + {{- range $key, $value := .Values.envValueFrom }} + - name: {{ $key | quote }} + valueFrom: + {{- tpl (toYaml $value) $ | nindent 10 }} + {{- end }} + {{- range $key, $value := .Values.env }} + - name: "{{ tpl $key $ }}" + value: "{{ tpl (print $value) $ }}" + {{- end }} + {{- if or .Values.envFromSecret (or .Values.envRenderSecret .Values.envFromSecrets) .Values.envFromConfigMaps }} + envFrom: + {{- if .Values.envFromSecret }} + - secretRef: + name: {{ tpl .Values.envFromSecret . }} + {{- end }} + {{- if .Values.envRenderSecret }} + - secretRef: + name: {{ include "grafana.fullname" . }}-env + {{- end }} + {{- range .Values.envFromSecrets }} + - secretRef: + name: {{ tpl .name $ }} + optional: {{ .optional | default false }} + {{- if .prefix }} + prefix: {{ tpl .prefix $ }} + {{- end }} + {{- end }} + {{- range .Values.envFromConfigMaps }} + - configMapRef: + name: {{ tpl .name $ }} + optional: {{ .optional | default false }} + {{- if .prefix }} + prefix: {{ tpl .prefix $ }} + {{- end }} + {{- end }} + {{- end }} + {{- with .Values.livenessProbe }} + livenessProbe: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.readinessProbe }} + readinessProbe: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.lifecycleHooks }} + lifecycle: + {{- tpl (toYaml .) $root | nindent 6 }} + {{- end }} + {{- with .Values.resources }} + resources: + {{- toYaml . | nindent 6 }} + {{- end }} +{{- with .Values.extraContainers }} + {{- tpl . $ | nindent 2 }} +{{- end }} +{{- with .Values.nodeSelector }} +nodeSelector: + {{- toYaml . | nindent 2 }} +{{- end }} +{{- with .Values.affinity }} +affinity: + {{- tpl (toYaml .) $root | nindent 2 }} +{{- end }} +{{- with .Values.topologySpreadConstraints }} +topologySpreadConstraints: + {{- toYaml . | nindent 2 }} +{{- end }} +{{- with .Values.tolerations }} +tolerations: + {{- toYaml . | nindent 2 }} +{{- end }} +volumes: + - name: config + configMap: + name: {{ include "grafana.fullname" . }} + {{- $createConfigSecret := eq (include "grafana.shouldCreateConfigSecret" .) "true" -}} + {{- if and .Values.createConfigmap $createConfigSecret }} + - name: config-secret + secret: + secretName: {{ include "grafana.fullname" . }}-config-secret + {{- end }} + {{- range .Values.extraConfigmapMounts }} + - name: {{ tpl .name $root }} + configMap: + name: {{ tpl .configMap $root }} + {{- with .items }} + items: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.dashboards }} + {{- range (keys .Values.dashboards | sortAlpha) }} + - name: dashboards-{{ . }} + configMap: + name: {{ include "grafana.fullname" $ }}-dashboards-{{ . }} + {{- end }} + {{- end }} + {{- if .Values.dashboardsConfigMaps }} + {{- range $provider, $name := .Values.dashboardsConfigMaps }} + - name: dashboards-{{ $provider }} + configMap: + name: {{ tpl $name $root }} + {{- end }} + {{- end }} + {{- if .Values.ldap.enabled }} + - name: ldap + secret: + {{- if .Values.ldap.existingSecret }} + secretName: {{ .Values.ldap.existingSecret }} + {{- else }} + secretName: {{ include "grafana.fullname" . }} + {{- end }} + items: + - key: ldap-toml + path: ldap.toml + {{- end }} + {{- if and .Values.persistence.enabled (eq .Values.persistence.type "pvc") }} + - name: storage + persistentVolumeClaim: + claimName: {{ tpl (.Values.persistence.existingClaim | default (include "grafana.fullname" .)) . }} + {{- else if and .Values.persistence.enabled (has .Values.persistence.type $sts) }} + {{/* nothing */}} + {{- else }} + - name: storage + {{- if .Values.persistence.inMemory.enabled }} + emptyDir: + medium: Memory + {{- with .Values.persistence.inMemory.sizeLimit }} + sizeLimit: {{ . }} + {{- end }} + {{- else }} + emptyDir: {} + {{- end }} + {{- end }} + {{- if .Values.sidecar.alerts.enabled }} + - name: sc-alerts-volume + emptyDir: + {{- with .Values.sidecar.alerts.sizeLimit }} + sizeLimit: {{ . }} + {{- else }} + {} + {{- end }} + {{- end }} + {{- if .Values.sidecar.dashboards.enabled }} + - name: sc-dashboard-volume + emptyDir: + {{- with .Values.sidecar.dashboards.sizeLimit }} + sizeLimit: {{ . }} + {{- else }} + {} + {{- end }} + {{- if .Values.sidecar.dashboards.SCProvider }} + - name: sc-dashboard-provider + configMap: + name: {{ include "grafana.fullname" . }}-config-dashboards + {{- end }} + {{- end }} + {{- if .Values.sidecar.datasources.enabled }} + - name: sc-datasources-volume + emptyDir: + {{- with .Values.sidecar.datasources.sizeLimit }} + sizeLimit: {{ . }} + {{- else }} + {} + {{- end }} + {{- end }} + {{- if .Values.sidecar.plugins.enabled }} + - name: sc-plugins-volume + emptyDir: + {{- with .Values.sidecar.plugins.sizeLimit }} + sizeLimit: {{ . }} + {{- else }} + {} + {{- end }} + {{- end }} + {{- if .Values.sidecar.notifiers.enabled }} + - name: sc-notifiers-volume + emptyDir: + {{- with .Values.sidecar.notifiers.sizeLimit }} + sizeLimit: {{ . }} + {{- else }} + {} + {{- end }} + {{- end }} + {{- range .Values.extraSecretMounts }} + {{- if .secretName }} + - name: {{ .name }} + secret: + secretName: {{ .secretName }} + defaultMode: {{ .defaultMode }} + {{- with .items }} + items: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- else if .projected }} + - name: {{ .name }} + projected: + {{- toYaml .projected | nindent 6 }} + {{- else if .csi }} + - name: {{ .name }} + csi: + {{- toYaml .csi | nindent 6 }} + {{- end }} + {{- end }} + {{- range .Values.extraVolumes }} + - name: {{ .name }} + {{- if .existingClaim }} + persistentVolumeClaim: + claimName: {{ .existingClaim }} + {{- else if .hostPath }} + hostPath: + {{ toYaml .hostPath | nindent 6 }} + {{- else if .csi }} + csi: + {{- toYaml .csi | nindent 6 }} + {{- else if .configMap }} + configMap: + {{- toYaml .configMap | nindent 6 }} + {{- else if .emptyDir }} + emptyDir: + {{- toYaml .emptyDir | nindent 6 }} + {{- else }} + emptyDir: {} + {{- end }} + {{- end }} + {{- range .Values.extraEmptyDirMounts }} + - name: {{ .name }} + emptyDir: {} + {{- end }} + {{- with .Values.extraContainerVolumes }} + {{- tpl (toYaml .) $root | nindent 2 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/clusterrole.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/clusterrole.yaml new file mode 100644 index 000000000..3af4b62b6 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/clusterrole.yaml @@ -0,0 +1,25 @@ +{{- if and .Values.rbac.create (or (not .Values.rbac.namespaced) .Values.rbac.extraClusterRoleRules) (not .Values.rbac.useExistingClusterRole) }} +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "grafana.fullname" . }}-clusterrole +{{- if or .Values.sidecar.dashboards.enabled .Values.rbac.extraClusterRoleRules .Values.sidecar.datasources.enabled .Values.sidecar.plugins.enabled .Values.sidecar.alerts.enabled }} +rules: + {{- if or .Values.sidecar.dashboards.enabled .Values.sidecar.datasources.enabled .Values.sidecar.plugins.enabled .Values.sidecar.alerts.enabled }} + - apiGroups: [""] # "" indicates the core API group + resources: ["configmaps", "secrets"] + verbs: ["get", "watch", "list"] + {{- end}} + {{- with .Values.rbac.extraClusterRoleRules }} + {{- toYaml . | nindent 2 }} + {{- end}} +{{- else }} +rules: [] +{{- end}} +{{- end}} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/clusterrolebinding.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/clusterrolebinding.yaml new file mode 100644 index 000000000..bda9431a2 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/clusterrolebinding.yaml @@ -0,0 +1,24 @@ +{{- if and .Values.rbac.create (or (not .Values.rbac.namespaced) .Values.rbac.extraClusterRoleRules) }} +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ include "grafana.fullname" . }}-clusterrolebinding + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +subjects: + - kind: ServiceAccount + name: {{ include "grafana.serviceAccountName" . }} + namespace: {{ include "grafana.namespace" . }} +roleRef: + kind: ClusterRole + {{- if .Values.rbac.useExistingClusterRole }} + name: {{ .Values.rbac.useExistingClusterRole }} + {{- else }} + name: {{ include "grafana.fullname" . }}-clusterrole + {{- end }} + apiGroup: rbac.authorization.k8s.io +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/configSecret.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/configSecret.yaml new file mode 100644 index 000000000..55574b9bb --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/configSecret.yaml @@ -0,0 +1,43 @@ +{{- $createConfigSecret := eq (include "grafana.shouldCreateConfigSecret" .) "true" -}} +{{- if and .Values.createConfigmap $createConfigSecret }} +{{- $files := .Files }} +{{- $root := . -}} +apiVersion: v1 +kind: Secret +metadata: + name: "{{ include "grafana.fullname" . }}-config-secret" + namespace: {{ include "grafana.namespace" . }} + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +data: +{{- range $key, $value := .Values.alerting }} + {{- if (hasKey $value "secretFile") }} + {{- $key | nindent 2 }}: + {{- toYaml ( $files.Get $value.secretFile ) | b64enc | nindent 4}} + {{/* as of https://helm.sh/docs/chart_template_guide/accessing_files/ this will only work if you fork this chart and add files to it*/}} + {{- end }} +{{- end }} +stringData: +{{- range $key, $value := .Values.datasources }} +{{- if (hasKey $value "secret") }} +{{- $key | nindent 2 }}: | + {{- tpl (toYaml $value.secret | nindent 4) $root }} +{{- end }} +{{- end }} +{{- range $key, $value := .Values.notifiers }} +{{- if (hasKey $value "secret") }} +{{- $key | nindent 2 }}: | + {{- tpl (toYaml $value.secret | nindent 4) $root }} +{{- end }} +{{- end }} +{{- range $key, $value := .Values.alerting }} +{{ if (hasKey $value "secret") }} + {{- $key | nindent 2 }}: | + {{- tpl (toYaml $value.secret | nindent 4) $root }} + {{- end }} +{{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/configmap-dashboard-provider.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/configmap-dashboard-provider.yaml new file mode 100644 index 000000000..b412c4d1f --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/configmap-dashboard-provider.yaml @@ -0,0 +1,15 @@ +{{- if and .Values.sidecar.dashboards.enabled .Values.sidecar.dashboards.SCProvider }} +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "grafana.fullname" . }}-config-dashboards + namespace: {{ include "grafana.namespace" . }} +data: + {{- include "grafana.configDashboardProviderData" . | nindent 2 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/configmap.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/configmap.yaml new file mode 100644 index 000000000..7d7428be5 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/configmap.yaml @@ -0,0 +1,15 @@ +{{- if .Values.createConfigmap }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "grafana.fullname" . }} + namespace: {{ include "grafana.namespace" . }} + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +data: + {{- include "grafana.configData" . | nindent 2 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/dashboards-json-configmap.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/dashboards-json-configmap.yaml new file mode 100644 index 000000000..b96ce7202 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/dashboards-json-configmap.yaml @@ -0,0 +1,38 @@ +{{- if .Values.dashboards }} +{{ $files := .Files }} +{{- range $provider, $dashboards := .Values.dashboards }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "grafana.fullname" $ }}-dashboards-{{ $provider }} + namespace: {{ include "grafana.namespace" $ }} + labels: + {{- include "grafana.labels" $ | nindent 4 }} + dashboard-provider: {{ $provider }} + {{- if $.Values.sidecar.dashboards.enabled }} + {{ $.Values.sidecar.dashboards.label }}: {{ $.Values.sidecar.dashboards.labelValue | quote }} + {{- end }} +{{- if $dashboards }} +data: +{{- $dashboardFound := false }} +{{- range $key, $value := $dashboards }} +{{- if (or (hasKey $value "json") (hasKey $value "file")) }} +{{- $dashboardFound = true }} + {{- print $key | nindent 2 }}.json: + {{- if hasKey $value "json" }} + |- + {{- $value.json | nindent 6 }} + {{- end }} + {{- if hasKey $value "file" }} + {{- toYaml ( $files.Get $value.file ) | nindent 4}} + {{- end }} +{{- end }} +{{- end }} +{{- if not $dashboardFound }} + {} +{{- end }} +{{- end }} +--- +{{- end }} + +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/deployment.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/deployment.yaml new file mode 100644 index 000000000..46c016faa --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/deployment.yaml @@ -0,0 +1,53 @@ +{{- if (and (not .Values.useStatefulSet) (or (not .Values.persistence.enabled) (eq .Values.persistence.type "pvc"))) }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "grafana.fullname" . }} + namespace: {{ include "grafana.namespace" . }} + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and (not .Values.autoscaling.enabled) (.Values.replicas) }} + replicas: {{ .Values.replicas }} + {{- end }} + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + {{- include "grafana.selectorLabels" . | nindent 6 }} + {{- with .Values.deploymentStrategy }} + strategy: + {{- toYaml . | trim | nindent 4 }} + {{- end }} + template: + metadata: + labels: + {{- include "grafana.selectorLabels" . | nindent 8 }} + {{- with .Values.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + annotations: + checksum/config: {{ include "grafana.configData" . | sha256sum }} + {{- if .Values.dashboards }} + checksum/dashboards-json-config: {{ include (print $.Template.BasePath "/dashboards-json-configmap.yaml") . | sha256sum }} + {{- end }} + checksum/sc-dashboard-provider-config: {{ include "grafana.configDashboardProviderData" . | sha256sum }} + {{- if and (or (and (not .Values.admin.existingSecret) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD)) (and .Values.ldap.enabled (not .Values.ldap.existingSecret))) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} + checksum/secret: {{ include "grafana.secretsData" . | sha256sum }} + {{- end }} + {{- if .Values.envRenderSecret }} + checksum/secret-env: {{ tpl (toYaml .Values.envRenderSecret) . | sha256sum }} + {{- end }} + kubectl.kubernetes.io/default-container: {{ .Chart.Name }} + {{- with .Values.podAnnotations }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- include "grafana.pod" . | nindent 6 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/extra-manifests.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/extra-manifests.yaml new file mode 100644 index 000000000..a9bb3b6ba --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/extra-manifests.yaml @@ -0,0 +1,4 @@ +{{ range .Values.extraObjects }} +--- +{{ tpl (toYaml .) $ }} +{{ end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/headless-service.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/headless-service.yaml new file mode 100644 index 000000000..3028589d3 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/headless-service.yaml @@ -0,0 +1,22 @@ +{{- $sts := list "sts" "StatefulSet" "statefulset" -}} +{{- if or .Values.headlessService (and .Values.persistence.enabled (not .Values.persistence.existingClaim) (has .Values.persistence.type $sts)) }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "grafana.fullname" . }}-headless + namespace: {{ include "grafana.namespace" . }} + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + clusterIP: None + selector: + {{- include "grafana.selectorLabels" . | nindent 4 }} + type: ClusterIP + ports: + - name: {{ .Values.gossipPortName }}-tcp + port: 9094 +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/hpa.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/hpa.yaml new file mode 100644 index 000000000..46bbcb49a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/hpa.yaml @@ -0,0 +1,52 @@ +{{- $sts := list "sts" "StatefulSet" "statefulset" -}} +{{- if .Values.autoscaling.enabled }} +apiVersion: {{ include "grafana.hpa.apiVersion" . }} +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "grafana.fullname" . }} + namespace: {{ include "grafana.namespace" . }} + labels: + app.kubernetes.io/name: {{ include "grafana.name" . }} + helm.sh/chart: {{ include "grafana.chart" . }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/instance: {{ .Release.Name }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + {{- if has .Values.persistence.type $sts }} + kind: StatefulSet + {{- else }} + kind: Deployment + {{- end }} + name: {{ include "grafana.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + {{- if .Values.autoscaling.targetMemory }} + - type: Resource + resource: + name: memory + {{- if eq (include "grafana.hpa.apiVersion" .) "autoscaling/v2beta1" }} + targetAverageUtilization: {{ .Values.autoscaling.targetMemory }} + {{- else }} + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetMemory }} + {{- end }} + {{- end }} + {{- if .Values.autoscaling.targetCPU }} + - type: Resource + resource: + name: cpu + {{- if eq (include "grafana.hpa.apiVersion" .) "autoscaling/v2beta1" }} + targetAverageUtilization: {{ .Values.autoscaling.targetCPU }} + {{- else }} + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetCPU }} + {{- end }} + {{- end }} + {{- if .Values.autoscaling.behavior }} + behavior: {{ toYaml .Values.autoscaling.behavior | nindent 4 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-deployment.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-deployment.yaml new file mode 100644 index 000000000..ea97969c2 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-deployment.yaml @@ -0,0 +1,131 @@ +{{ if .Values.imageRenderer.enabled }} +{{- $root := . -}} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "grafana.fullname" . }}-image-renderer + namespace: {{ include "grafana.namespace" . }} + labels: + {{- include "grafana.imageRenderer.labels" . | nindent 4 }} + {{- with .Values.imageRenderer.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.imageRenderer.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and (not .Values.imageRenderer.autoscaling.enabled) (.Values.imageRenderer.replicas) }} + replicas: {{ .Values.imageRenderer.replicas }} + {{- end }} + revisionHistoryLimit: {{ .Values.imageRenderer.revisionHistoryLimit }} + selector: + matchLabels: + {{- include "grafana.imageRenderer.selectorLabels" . | nindent 6 }} + + {{- with .Values.imageRenderer.deploymentStrategy }} + strategy: + {{- toYaml . | trim | nindent 4 }} + {{- end }} + template: + metadata: + labels: + {{- include "grafana.imageRenderer.selectorLabels" . | nindent 8 }} + {{- with .Values.imageRenderer.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + {{- with .Values.imageRenderer.podAnnotations }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- with .Values.imageRenderer.schedulerName }} + schedulerName: "{{ . }}" + {{- end }} + {{- with .Values.imageRenderer.serviceAccountName }} + serviceAccountName: "{{ . }}" + {{- end }} + {{- with .Values.imageRenderer.securityContext }} + securityContext: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.imageRenderer.hostAliases }} + hostAliases: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.imageRenderer.priorityClassName }} + priorityClassName: {{ . }} + {{- end }} + {{- with .Values.imageRenderer.image.pullSecrets }} + imagePullSecrets: + {{- range . }} + - name: {{ tpl . $root }} + {{- end}} + {{- end }} + containers: + - name: {{ .Chart.Name }}-image-renderer + {{- $registry := .Values.global.imageRegistry | default .Values.imageRenderer.image.registry -}} + {{- if .Values.imageRenderer.image.sha }} + image: "{{ $registry }}/{{ .Values.imageRenderer.image.repository }}:{{ .Values.imageRenderer.image.tag }}@sha256:{{ .Values.imageRenderer.image.sha }}" + {{- else }} + image: "{{ $registry }}/{{ .Values.imageRenderer.image.repository }}:{{ .Values.imageRenderer.image.tag }}" + {{- end }} + imagePullPolicy: {{ .Values.imageRenderer.image.pullPolicy }} + {{- if .Values.imageRenderer.command }} + command: + {{- range .Values.imageRenderer.command }} + - {{ . }} + {{- end }} + {{- end}} + ports: + - name: {{ .Values.imageRenderer.service.portName }} + containerPort: {{ .Values.imageRenderer.service.targetPort }} + protocol: TCP + livenessProbe: + httpGet: + path: / + port: {{ .Values.imageRenderer.service.portName }} + env: + - name: HTTP_PORT + value: {{ .Values.imageRenderer.service.targetPort | quote }} + {{- if .Values.imageRenderer.serviceMonitor.enabled }} + - name: ENABLE_METRICS + value: "true" + {{- end }} + {{- range $key, $value := .Values.imageRenderer.envValueFrom }} + - name: {{ $key | quote }} + valueFrom: + {{- tpl (toYaml $value) $ | nindent 16 }} + {{- end }} + {{- range $key, $value := .Values.imageRenderer.env }} + - name: {{ $key | quote }} + value: {{ $value | quote }} + {{- end }} + {{- with .Values.imageRenderer.containerSecurityContext }} + securityContext: + {{- toYaml . | nindent 12 }} + {{- end }} + volumeMounts: + - mountPath: /tmp + name: image-renderer-tmpfs + {{- with .Values.imageRenderer.resources }} + resources: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.imageRenderer.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.imageRenderer.affinity }} + affinity: + {{- tpl (toYaml .) $root | nindent 8 }} + {{- end }} + {{- with .Values.imageRenderer.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + volumes: + - name: image-renderer-tmpfs + emptyDir: {} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-hpa.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-hpa.yaml new file mode 100644 index 000000000..b0f0059b7 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-hpa.yaml @@ -0,0 +1,47 @@ +{{- if and .Values.imageRenderer.enabled .Values.imageRenderer.autoscaling.enabled }} +apiVersion: {{ include "grafana.hpa.apiVersion" . }} +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "grafana.fullname" . }}-image-renderer + namespace: {{ include "grafana.namespace" . }} + labels: + app.kubernetes.io/name: {{ include "grafana.name" . }}-image-renderer + helm.sh/chart: {{ include "grafana.chart" . }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/instance: {{ .Release.Name }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "grafana.fullname" . }}-image-renderer + minReplicas: {{ .Values.imageRenderer.autoscaling.minReplicas }} + maxReplicas: {{ .Values.imageRenderer.autoscaling.maxReplicas }} + metrics: + {{- if .Values.imageRenderer.autoscaling.targetMemory }} + - type: Resource + resource: + name: memory + {{- if eq (include "grafana.hpa.apiVersion" .) "autoscaling/v2beta1" }} + targetAverageUtilization: {{ .Values.imageRenderer.autoscaling.targetMemory }} + {{- else }} + target: + type: Utilization + averageUtilization: {{ .Values.imageRenderer.autoscaling.targetMemory }} + {{- end }} + {{- end }} + {{- if .Values.imageRenderer.autoscaling.targetCPU }} + - type: Resource + resource: + name: cpu + {{- if eq (include "grafana.hpa.apiVersion" .) "autoscaling/v2beta1" }} + targetAverageUtilization: {{ .Values.imageRenderer.autoscaling.targetCPU }} + {{- else }} + target: + type: Utilization + averageUtilization: {{ .Values.imageRenderer.autoscaling.targetCPU }} + {{- end }} + {{- end }} + {{- if .Values.imageRenderer.autoscaling.behavior }} + behavior: {{ toYaml .Values.imageRenderer.autoscaling.behavior | nindent 4 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-network-policy.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-network-policy.yaml new file mode 100644 index 000000000..d1a0eb313 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-network-policy.yaml @@ -0,0 +1,79 @@ +{{- if and .Values.imageRenderer.enabled .Values.imageRenderer.networkPolicy.limitIngress }} +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: {{ include "grafana.fullname" . }}-image-renderer-ingress + namespace: {{ include "grafana.namespace" . }} + annotations: + comment: Limit image-renderer ingress traffic from grafana +spec: + podSelector: + matchLabels: + {{- include "grafana.imageRenderer.selectorLabels" . | nindent 6 }} + {{- with .Values.imageRenderer.podLabels }} + {{- toYaml . | nindent 6 }} + {{- end }} + + policyTypes: + - Ingress + ingress: + - ports: + - port: {{ .Values.imageRenderer.service.targetPort }} + protocol: TCP + from: + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: {{ include "grafana.namespace" . }} + podSelector: + matchLabels: + {{- include "grafana.selectorLabels" . | nindent 14 }} + {{- with .Values.podLabels }} + {{- toYaml . | nindent 14 }} + {{- end }} + {{- with .Values.imageRenderer.networkPolicy.extraIngressSelectors -}} + {{ toYaml . | nindent 8 }} + {{- end }} +{{- end }} + +{{- if and .Values.imageRenderer.enabled .Values.imageRenderer.networkPolicy.limitEgress }} +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: {{ include "grafana.fullname" . }}-image-renderer-egress + namespace: {{ include "grafana.namespace" . }} + annotations: + comment: Limit image-renderer egress traffic to grafana +spec: + podSelector: + matchLabels: + {{- include "grafana.imageRenderer.selectorLabels" . | nindent 6 }} + {{- with .Values.imageRenderer.podLabels }} + {{- toYaml . | nindent 6 }} + {{- end }} + + policyTypes: + - Egress + egress: + # allow dns resolution + - ports: + - port: 53 + protocol: UDP + - port: 53 + protocol: TCP + # talk only to grafana + - ports: + - port: {{ .Values.service.targetPort }} + protocol: TCP + to: + - namespaceSelector: + matchLabels: + name: {{ include "grafana.namespace" . }} + podSelector: + matchLabels: + {{- include "grafana.selectorLabels" . | nindent 14 }} + {{- with .Values.podLabels }} + {{- toYaml . | nindent 14 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-service.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-service.yaml new file mode 100644 index 000000000..f8da127cf --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-service.yaml @@ -0,0 +1,31 @@ +{{- if and .Values.imageRenderer.enabled .Values.imageRenderer.service.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "grafana.fullname" . }}-image-renderer + namespace: {{ include "grafana.namespace" . }} + labels: + {{- include "grafana.imageRenderer.labels" . | nindent 4 }} + {{- with .Values.imageRenderer.service.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.imageRenderer.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + type: ClusterIP + {{- with .Values.imageRenderer.service.clusterIP }} + clusterIP: {{ . }} + {{- end }} + ports: + - name: {{ .Values.imageRenderer.service.portName }} + port: {{ .Values.imageRenderer.service.port }} + protocol: TCP + targetPort: {{ .Values.imageRenderer.service.targetPort }} + {{- with .Values.imageRenderer.appProtocol }} + appProtocol: {{ . }} + {{- end }} + selector: + {{- include "grafana.imageRenderer.selectorLabels" . | nindent 4 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-servicemonitor.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-servicemonitor.yaml new file mode 100644 index 000000000..5d9f09d26 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-servicemonitor.yaml @@ -0,0 +1,48 @@ +{{- if .Values.imageRenderer.serviceMonitor.enabled }} +--- +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ include "grafana.fullname" . }}-image-renderer + {{- if .Values.imageRenderer.serviceMonitor.namespace }} + namespace: {{ tpl .Values.imageRenderer.serviceMonitor.namespace . }} + {{- else }} + namespace: {{ include "grafana.namespace" . }} + {{- end }} + labels: + {{- include "grafana.imageRenderer.labels" . | nindent 4 }} + {{- with .Values.imageRenderer.serviceMonitor.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + endpoints: + - port: {{ .Values.imageRenderer.service.portName }} + {{- with .Values.imageRenderer.serviceMonitor.interval }} + interval: {{ . }} + {{- end }} + {{- with .Values.imageRenderer.serviceMonitor.scrapeTimeout }} + scrapeTimeout: {{ . }} + {{- end }} + honorLabels: true + path: {{ .Values.imageRenderer.serviceMonitor.path }} + scheme: {{ .Values.imageRenderer.serviceMonitor.scheme }} + {{- with .Values.imageRenderer.serviceMonitor.tlsConfig }} + tlsConfig: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.imageRenderer.serviceMonitor.relabelings }} + relabelings: + {{- toYaml . | nindent 6 }} + {{- end }} + jobLabel: "{{ .Release.Name }}-image-renderer" + selector: + matchLabels: + {{- include "grafana.imageRenderer.selectorLabels" . | nindent 6 }} + namespaceSelector: + matchNames: + - {{ include "grafana.namespace" . }} + {{- with .Values.imageRenderer.serviceMonitor.targetLabels }} + targetLabels: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/ingress.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/ingress.yaml new file mode 100644 index 000000000..b2ffd8109 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/ingress.yaml @@ -0,0 +1,78 @@ +{{- if .Values.ingress.enabled -}} +{{- $ingressApiIsStable := eq (include "grafana.ingress.isStable" .) "true" -}} +{{- $ingressSupportsIngressClassName := eq (include "grafana.ingress.supportsIngressClassName" .) "true" -}} +{{- $ingressSupportsPathType := eq (include "grafana.ingress.supportsPathType" .) "true" -}} +{{- $fullName := include "grafana.fullname" . -}} +{{- $servicePort := .Values.service.port -}} +{{- $ingressPath := .Values.ingress.path -}} +{{- $ingressPathType := .Values.ingress.pathType -}} +{{- $extraPaths := .Values.ingress.extraPaths -}} +apiVersion: {{ include "grafana.ingress.apiVersion" . }} +kind: Ingress +metadata: + name: {{ $fullName }} + namespace: {{ include "grafana.namespace" . }} + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.ingress.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.ingress.annotations }} + annotations: + {{- range $key, $value := . }} + {{ $key }}: {{ tpl $value $ | quote }} + {{- end }} + {{- end }} +spec: + {{- if and $ingressSupportsIngressClassName .Values.ingress.ingressClassName }} + ingressClassName: {{ .Values.ingress.ingressClassName }} + {{- end -}} + {{- with .Values.ingress.tls }} + tls: + {{- tpl (toYaml .) $ | nindent 4 }} + {{- end }} + rules: + {{- if .Values.ingress.hosts }} + {{- range .Values.ingress.hosts }} + - host: {{ tpl . $ | quote }} + http: + paths: + {{- with $extraPaths }} + {{- toYaml . | nindent 10 }} + {{- end }} + - path: {{ $ingressPath }} + {{- if $ingressSupportsPathType }} + pathType: {{ $ingressPathType }} + {{- end }} + backend: + {{- if $ingressApiIsStable }} + service: + name: {{ $fullName }} + port: + number: {{ $servicePort }} + {{- else }} + serviceName: {{ $fullName }} + servicePort: {{ $servicePort }} + {{- end }} + {{- end }} + {{- else }} + - http: + paths: + - backend: + {{- if $ingressApiIsStable }} + service: + name: {{ $fullName }} + port: + number: {{ $servicePort }} + {{- else }} + serviceName: {{ $fullName }} + servicePort: {{ $servicePort }} + {{- end }} + {{- with $ingressPath }} + path: {{ . }} + {{- end }} + {{- if $ingressSupportsPathType }} + pathType: {{ $ingressPathType }} + {{- end }} + {{- end -}} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/networkpolicy.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/networkpolicy.yaml new file mode 100644 index 000000000..4cd3ed697 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/networkpolicy.yaml @@ -0,0 +1,61 @@ +{{- if .Values.networkPolicy.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: {{ include "grafana.fullname" . }} + namespace: {{ include "grafana.namespace" . }} + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + policyTypes: + {{- if .Values.networkPolicy.ingress }} + - Ingress + {{- end }} + {{- if .Values.networkPolicy.egress.enabled }} + - Egress + {{- end }} + podSelector: + matchLabels: + {{- include "grafana.selectorLabels" . | nindent 6 }} + + {{- if .Values.networkPolicy.egress.enabled }} + egress: + {{- if not .Values.networkPolicy.egress.blockDNSResolution }} + - ports: + - port: 53 + protocol: UDP + {{- end }} + - ports: + {{ .Values.networkPolicy.egress.ports | toJson }} + {{- with .Values.networkPolicy.egress.to }} + to: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- end }} + {{- if .Values.networkPolicy.ingress }} + ingress: + - ports: + - port: {{ .Values.service.targetPort }} + {{- if not .Values.networkPolicy.allowExternal }} + from: + - podSelector: + matchLabels: + {{ include "grafana.fullname" . }}-client: "true" + {{- with .Values.networkPolicy.explicitNamespacesSelector }} + - namespaceSelector: + {{- toYaml . | nindent 12 }} + {{- end }} + - podSelector: + matchLabels: + {{- include "grafana.labels" . | nindent 14 }} + role: read + {{- end }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/poddisruptionbudget.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/poddisruptionbudget.yaml new file mode 100644 index 000000000..05251214a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/poddisruptionbudget.yaml @@ -0,0 +1,22 @@ +{{- if .Values.podDisruptionBudget }} +apiVersion: {{ include "grafana.podDisruptionBudget.apiVersion" . }} +kind: PodDisruptionBudget +metadata: + name: {{ include "grafana.fullname" . }} + namespace: {{ include "grafana.namespace" . }} + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- with .Values.podDisruptionBudget.minAvailable }} + minAvailable: {{ . }} + {{- end }} + {{- with .Values.podDisruptionBudget.maxUnavailable }} + maxUnavailable: {{ . }} + {{- end }} + selector: + matchLabels: + {{- include "grafana.selectorLabels" . | nindent 6 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/podsecuritypolicy.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/podsecuritypolicy.yaml new file mode 100644 index 000000000..eed7af95b --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/podsecuritypolicy.yaml @@ -0,0 +1,49 @@ +{{- if and .Values.rbac.pspEnabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} +apiVersion: policy/v1beta1 +kind: PodSecurityPolicy +metadata: + name: {{ include "grafana.fullname" . }} + labels: + {{- include "grafana.labels" . | nindent 4 }} + annotations: + seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default,runtime/default' + seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' + {{- if .Values.rbac.pspUseAppArmor }} + apparmor.security.beta.kubernetes.io/allowedProfileNames: 'runtime/default' + apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' + {{- end }} +spec: + privileged: false + allowPrivilegeEscalation: false + requiredDropCapabilities: + # Default set from Docker, with DAC_OVERRIDE and CHOWN + - ALL + volumes: + - 'configMap' + - 'emptyDir' + - 'projected' + - 'csi' + - 'secret' + - 'downwardAPI' + - 'persistentVolumeClaim' + hostNetwork: false + hostIPC: false + hostPID: false + runAsUser: + rule: 'RunAsAny' + seLinux: + rule: 'RunAsAny' + supplementalGroups: + rule: 'MustRunAs' + ranges: + # Forbid adding the root group. + - min: 1 + max: 65535 + fsGroup: + rule: 'MustRunAs' + ranges: + # Forbid adding the root group. + - min: 1 + max: 65535 + readOnlyRootFilesystem: false +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/pvc.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/pvc.yaml new file mode 100644 index 000000000..eb8f87f07 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/pvc.yaml @@ -0,0 +1,36 @@ +{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) (eq .Values.persistence.type "pvc")}} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "grafana.fullname" . }} + namespace: {{ include "grafana.namespace" . }} + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.persistence.extraPvcLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.persistence.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.persistence.finalizers }} + finalizers: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + accessModes: + {{- range .Values.persistence.accessModes }} + - {{ . | quote }} + {{- end }} + resources: + requests: + storage: {{ .Values.persistence.size | quote }} + {{- with .Values.persistence.storageClassName }} + storageClassName: {{ . }} + {{- end }} + {{- with .Values.persistence.selectorLabels }} + selector: + matchLabels: + {{- toYaml . | nindent 6 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/role.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/role.yaml new file mode 100644 index 000000000..4b5edd978 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/role.yaml @@ -0,0 +1,32 @@ +{{- if and .Values.rbac.create (not .Values.rbac.useExistingRole) -}} +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: {{ include "grafana.fullname" . }} + namespace: {{ include "grafana.namespace" . }} + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- if or .Values.rbac.pspEnabled (and .Values.rbac.namespaced (or .Values.sidecar.dashboards.enabled .Values.sidecar.datasources.enabled .Values.sidecar.plugins.enabled .Values.rbac.extraRoleRules)) }} +rules: + {{- if and .Values.rbac.pspEnabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} + - apiGroups: ['extensions'] + resources: ['podsecuritypolicies'] + verbs: ['use'] + resourceNames: [{{ include "grafana.fullname" . }}] + {{- end }} + {{- if and .Values.rbac.namespaced (or .Values.sidecar.dashboards.enabled .Values.sidecar.datasources.enabled .Values.sidecar.plugins.enabled) }} + - apiGroups: [""] # "" indicates the core API group + resources: ["configmaps", "secrets"] + verbs: ["get", "watch", "list"] + {{- end }} + {{- with .Values.rbac.extraRoleRules }} + {{- toYaml . | nindent 2 }} + {{- end}} +{{- else }} +rules: [] +{{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/rolebinding.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/rolebinding.yaml new file mode 100644 index 000000000..58f77c6b0 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/rolebinding.yaml @@ -0,0 +1,25 @@ +{{- if .Values.rbac.create }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: {{ include "grafana.fullname" . }} + namespace: {{ include "grafana.namespace" . }} + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + {{- if .Values.rbac.useExistingRole }} + name: {{ .Values.rbac.useExistingRole }} + {{- else }} + name: {{ include "grafana.fullname" . }} + {{- end }} +subjects: +- kind: ServiceAccount + name: {{ include "grafana.serviceAccountName" . }} + namespace: {{ include "grafana.namespace" . }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/secret-env.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/secret-env.yaml new file mode 100644 index 000000000..eb14aac70 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/secret-env.yaml @@ -0,0 +1,14 @@ +{{- if .Values.envRenderSecret }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "grafana.fullname" . }}-env + namespace: {{ include "grafana.namespace" . }} + labels: + {{- include "grafana.labels" . | nindent 4 }} +type: Opaque +data: +{{- range $key, $val := .Values.envRenderSecret }} + {{ $key }}: {{ tpl ($val | toString) $ | b64enc | quote }} +{{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/secret.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/secret.yaml new file mode 100644 index 000000000..fd2ca50f4 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/secret.yaml @@ -0,0 +1,16 @@ +{{- if or (and (not .Values.admin.existingSecret) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION)) (and .Values.ldap.enabled (not .Values.ldap.existingSecret)) }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "grafana.fullname" . }} + namespace: {{ include "grafana.namespace" . }} + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +type: Opaque +data: + {{- include "grafana.secretsData" . | nindent 2 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/service.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/service.yaml new file mode 100644 index 000000000..e9396a15c --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/service.yaml @@ -0,0 +1,61 @@ +{{- if .Values.service.enabled }} +{{- $root := . }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "grafana.fullname" . }} + namespace: {{ include "grafana.namespace" . }} + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.service.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.service.annotations }} + annotations: + {{- tpl (toYaml . | nindent 4) $root }} + {{- end }} +spec: + {{- if (or (eq .Values.service.type "ClusterIP") (empty .Values.service.type)) }} + type: ClusterIP + {{- with .Values.service.clusterIP }} + clusterIP: {{ . }} + {{- end }} + {{- else if eq .Values.service.type "LoadBalancer" }} + type: LoadBalancer + {{- with .Values.service.loadBalancerIP }} + loadBalancerIP: {{ . }} + {{- end }} + {{- with .Values.service.loadBalancerClass }} + loadBalancerClass: {{ . }} + {{- end }} + {{- with .Values.service.loadBalancerSourceRanges }} + loadBalancerSourceRanges: + {{- toYaml . | nindent 4 }} + {{- end }} + {{- else }} + type: {{ .Values.service.type }} + {{- end }} + {{- with .Values.service.externalIPs }} + externalIPs: + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.service.externalTrafficPolicy }} + externalTrafficPolicy: {{ . }} + {{- end }} + ports: + - name: {{ .Values.service.portName }} + port: {{ .Values.service.port }} + protocol: TCP + targetPort: {{ .Values.service.targetPort }} + {{- with .Values.service.appProtocol }} + appProtocol: {{ . }} + {{- end }} + {{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort))) }} + nodePort: {{ .Values.service.nodePort }} + {{- end }} + {{- with .Values.extraExposePorts }} + {{- tpl (toYaml . | nindent 4) $root }} + {{- end }} + selector: + {{- include "grafana.selectorLabels" . | nindent 4 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/serviceaccount.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/serviceaccount.yaml new file mode 100644 index 000000000..784e71ba6 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/serviceaccount.yaml @@ -0,0 +1,17 @@ +{{- if .Values.serviceAccount.create }} +{{- $root := . -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- tpl (toYaml . | nindent 4) $root }} + {{- end }} + name: {{ include "grafana.serviceAccountName" . }} + namespace: {{ include "grafana.namespace" . }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/servicemonitor.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/servicemonitor.yaml new file mode 100644 index 000000000..035901352 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/servicemonitor.yaml @@ -0,0 +1,52 @@ +{{- if .Values.serviceMonitor.enabled }} +--- +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ include "grafana.fullname" . }} + {{- if .Values.serviceMonitor.namespace }} + namespace: {{ tpl .Values.serviceMonitor.namespace . }} + {{- else }} + namespace: {{ include "grafana.namespace" . }} + {{- end }} + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.serviceMonitor.labels }} + {{- tpl (toYaml . | nindent 4) $ }} + {{- end }} +spec: + endpoints: + - port: {{ .Values.service.portName }} + {{- with .Values.serviceMonitor.interval }} + interval: {{ . }} + {{- end }} + {{- with .Values.serviceMonitor.scrapeTimeout }} + scrapeTimeout: {{ . }} + {{- end }} + honorLabels: true + path: {{ .Values.serviceMonitor.path }} + scheme: {{ .Values.serviceMonitor.scheme }} + {{- with .Values.serviceMonitor.tlsConfig }} + tlsConfig: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.serviceMonitor.relabelings }} + relabelings: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.serviceMonitor.metricRelabelings }} + metricRelabelings: + {{- toYaml . | nindent 6 }} + {{- end }} + jobLabel: "{{ .Release.Name }}" + selector: + matchLabels: + {{- include "grafana.selectorLabels" . | nindent 6 }} + namespaceSelector: + matchNames: + - {{ include "grafana.namespace" . }} + {{- with .Values.serviceMonitor.targetLabels }} + targetLabels: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/statefulset.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/statefulset.yaml new file mode 100644 index 000000000..e6c944a4d --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/statefulset.yaml @@ -0,0 +1,56 @@ +{{- $sts := list "sts" "StatefulSet" "statefulset" -}} +{{- if (or (.Values.useStatefulSet) (and .Values.persistence.enabled (not .Values.persistence.existingClaim) (has .Values.persistence.type $sts)))}} +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ include "grafana.fullname" . }} + namespace: {{ include "grafana.namespace" . }} + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicas }} + selector: + matchLabels: + {{- include "grafana.selectorLabels" . | nindent 6 }} + serviceName: {{ include "grafana.fullname" . }}-headless + template: + metadata: + labels: + {{- include "grafana.selectorLabels" . | nindent 8 }} + {{- with .Values.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + checksum/dashboards-json-config: {{ include (print $.Template.BasePath "/dashboards-json-configmap.yaml") . | sha256sum }} + checksum/sc-dashboard-provider-config: {{ include (print $.Template.BasePath "/configmap-dashboard-provider.yaml") . | sha256sum }} + {{- if and (or (and (not .Values.admin.existingSecret) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD)) (and .Values.ldap.enabled (not .Values.ldap.existingSecret))) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} + checksum/secret: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }} + {{- end }} + kubectl.kubernetes.io/default-container: {{ .Chart.Name }} + {{- with .Values.podAnnotations }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- include "grafana.pod" . | nindent 6 }} + {{- if .Values.persistence.enabled}} + volumeClaimTemplates: + - metadata: + name: storage + spec: + accessModes: {{ .Values.persistence.accessModes }} + storageClassName: {{ .Values.persistence.storageClassName }} + resources: + requests: + storage: {{ .Values.persistence.size }} + {{- with .Values.persistence.selectorLabels }} + selector: + matchLabels: + {{- toYaml . | nindent 10 }} + {{- end }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-configmap.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-configmap.yaml new file mode 100644 index 000000000..01c96c924 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-configmap.yaml @@ -0,0 +1,20 @@ +{{- if .Values.testFramework.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "grafana.fullname" . }}-test + namespace: {{ include "grafana.namespace" . }} + annotations: + "helm.sh/hook": test-success + "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" + labels: + {{- include "grafana.labels" . | nindent 4 }} +data: + run.sh: |- + @test "Test Health" { + url="http://{{ include "grafana.fullname" . }}/api/health" + + code=$(wget --server-response --spider --timeout 90 --tries 10 ${url} 2>&1 | awk '/^ HTTP/{print $2}') + [ "$code" == "200" ] + } +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-podsecuritypolicy.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-podsecuritypolicy.yaml new file mode 100644 index 000000000..1821772a4 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-podsecuritypolicy.yaml @@ -0,0 +1,32 @@ +{{- if and (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") .Values.testFramework.enabled .Values.rbac.pspEnabled }} +apiVersion: policy/v1beta1 +kind: PodSecurityPolicy +metadata: + name: {{ include "grafana.fullname" . }}-test + annotations: + "helm.sh/hook": test-success + "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" + labels: + {{- include "grafana.labels" . | nindent 4 }} +spec: + allowPrivilegeEscalation: true + privileged: false + hostNetwork: false + hostIPC: false + hostPID: false + fsGroup: + rule: RunAsAny + seLinux: + rule: RunAsAny + supplementalGroups: + rule: RunAsAny + runAsUser: + rule: RunAsAny + volumes: + - configMap + - downwardAPI + - emptyDir + - projected + - csi + - secret +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-role.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-role.yaml new file mode 100644 index 000000000..cb4c78204 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-role.yaml @@ -0,0 +1,17 @@ +{{- if and (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") .Values.testFramework.enabled .Values.rbac.pspEnabled }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: {{ include "grafana.fullname" . }}-test + namespace: {{ include "grafana.namespace" . }} + annotations: + "helm.sh/hook": test-success + "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" + labels: + {{- include "grafana.labels" . | nindent 4 }} +rules: + - apiGroups: ['policy'] + resources: ['podsecuritypolicies'] + verbs: ['use'] + resourceNames: [{{ include "grafana.fullname" . }}-test] +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-rolebinding.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-rolebinding.yaml new file mode 100644 index 000000000..f40d791f6 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-rolebinding.yaml @@ -0,0 +1,20 @@ +{{- if and (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") .Values.testFramework.enabled .Values.rbac.pspEnabled }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: {{ include "grafana.fullname" . }}-test + namespace: {{ include "grafana.namespace" . }} + annotations: + "helm.sh/hook": test-success + "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" + labels: + {{- include "grafana.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: {{ include "grafana.fullname" . }}-test +subjects: + - kind: ServiceAccount + name: {{ include "grafana.serviceAccountNameTest" . }} + namespace: {{ include "grafana.namespace" . }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-serviceaccount.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-serviceaccount.yaml new file mode 100644 index 000000000..38fba3596 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-serviceaccount.yaml @@ -0,0 +1,12 @@ +{{- if and .Values.testFramework.enabled .Values.serviceAccount.create }} +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + {{- include "grafana.labels" . | nindent 4 }} + name: {{ include "grafana.serviceAccountNameTest" . }} + namespace: {{ include "grafana.namespace" . }} + annotations: + "helm.sh/hook": test-success + "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test.yaml new file mode 100644 index 000000000..15067ae30 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test.yaml @@ -0,0 +1,49 @@ +{{- if .Values.testFramework.enabled }} +{{- $root := . }} +apiVersion: v1 +kind: Pod +metadata: + name: {{ include "grafana.fullname" . }}-test + labels: + {{- include "grafana.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test-success + "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" + namespace: {{ include "grafana.namespace" . }} +spec: + serviceAccountName: {{ include "grafana.serviceAccountNameTest" . }} + {{- with .Values.testFramework.securityContext }} + securityContext: + {{- toYaml . | nindent 4 }} + {{- end }} + {{- if or .Values.image.pullSecrets .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- include "grafana.imagePullSecrets" (dict "root" $root "imagePullSecrets" .Values.image.pullSecrets) | nindent 4 }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- tpl (toYaml .) $root | nindent 4 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 4 }} + {{- end }} + containers: + - name: {{ .Release.Name }}-test + image: "{{ .Values.global.imageRegistry | default .Values.testFramework.image.registry }}/{{ .Values.testFramework.image.repository }}:{{ .Values.testFramework.image.tag }}" + imagePullPolicy: "{{ .Values.testFramework.imagePullPolicy}}" + command: ["/opt/bats/bin/bats", "-t", "/tests/run.sh"] + volumeMounts: + - mountPath: /tests + name: tests + readOnly: true + volumes: + - name: tests + configMap: + name: {{ include "grafana.fullname" . }}-test + restartPolicy: Never +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/values.yaml b/thunder_deployment/infra/beta9/charts/grafana/values.yaml new file mode 100644 index 000000000..ab853e09c --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/grafana/values.yaml @@ -0,0 +1,1315 @@ +global: + # -- Overrides the Docker registry globally for all images + imageRegistry: null + + # To help compatibility with other charts which use global.imagePullSecrets. + # Allow either an array of {name: pullSecret} maps (k8s-style), or an array of strings (more common helm-style). + # Can be tempalted. + # global: + # imagePullSecrets: + # - name: pullSecret1 + # - name: pullSecret2 + # or + # global: + # imagePullSecrets: + # - pullSecret1 + # - pullSecret2 + imagePullSecrets: [] + +rbac: + create: true + ## Use an existing ClusterRole/Role (depending on rbac.namespaced false/true) + # useExistingRole: name-of-some-role + # useExistingClusterRole: name-of-some-clusterRole + pspEnabled: false + pspUseAppArmor: false + namespaced: false + extraRoleRules: [] + # - apiGroups: [] + # resources: [] + # verbs: [] + extraClusterRoleRules: [] + # - apiGroups: [] + # resources: [] + # verbs: [] +serviceAccount: + create: true + name: + nameTest: + ## ServiceAccount labels. + labels: {} +## Service account annotations. Can be templated. +# annotations: +# eks.amazonaws.com/role-arn: arn:aws:iam::123456789000:role/iam-role-name-here + autoMount: true + +replicas: 1 + +## Create a headless service for the deployment +headlessService: false + +## Create HorizontalPodAutoscaler object for deployment type +# +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 5 + targetCPU: "60" + targetMemory: "" + behavior: {} + +## See `kubectl explain poddisruptionbudget.spec` for more +## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/ +podDisruptionBudget: {} +# apiVersion: "" +# minAvailable: 1 +# maxUnavailable: 1 + +## See `kubectl explain deployment.spec.strategy` for more +## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy +deploymentStrategy: + type: RollingUpdate + +readinessProbe: + httpGet: + path: /api/health + port: 3000 + +livenessProbe: + httpGet: + path: /api/health + port: 3000 + initialDelaySeconds: 60 + timeoutSeconds: 30 + failureThreshold: 10 + +## Use an alternate scheduler, e.g. "stork". +## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ +## +# schedulerName: "default-scheduler" + +image: + # -- The Docker registry + registry: docker.io + # -- Docker image repository + repository: grafana/grafana + # Overrides the Grafana image tag whose default is the chart appVersion + tag: "" + sha: "" + pullPolicy: IfNotPresent + + ## Optionally specify an array of imagePullSecrets. + ## Secrets must be manually created in the namespace. + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + ## Can be templated. + ## + pullSecrets: [] + # - myRegistrKeySecretName + +testFramework: + enabled: true + image: + # -- The Docker registry + registry: docker.io + repository: bats/bats + tag: "v1.4.1" + imagePullPolicy: IfNotPresent + securityContext: {} + +# dns configuration for pod +dnsPolicy: ~ +dnsConfig: {} + # nameservers: + # - 8.8.8.8 + # options: + # - name: ndots + # value: "2" + # - name: edns0 + +securityContext: + runAsNonRoot: true + runAsUser: 472 + runAsGroup: 472 + fsGroup: 472 + +containerSecurityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + seccompProfile: + type: RuntimeDefault + +# Enable creating the grafana configmap +createConfigmap: true + +# Extra configmaps to mount in grafana pods +# Values are templated. +extraConfigmapMounts: [] + # - name: certs-configmap + # mountPath: /etc/grafana/ssl/ + # subPath: certificates.crt # (optional) + # configMap: certs-configmap + # readOnly: true + + +extraEmptyDirMounts: [] + # - name: provisioning-notifiers + # mountPath: /etc/grafana/provisioning/notifiers + + +# Apply extra labels to common labels. +extraLabels: {} + +## Assign a PriorityClassName to pods if set +# priorityClassName: + +downloadDashboardsImage: + # -- The Docker registry + registry: docker.io + repository: curlimages/curl + tag: 7.85.0 + sha: "" + pullPolicy: IfNotPresent + +downloadDashboards: + env: {} + envFromSecret: "" + resources: {} + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + seccompProfile: + type: RuntimeDefault + envValueFrom: {} + # ENV_NAME: + # configMapKeyRef: + # name: configmap-name + # key: value_key + +## Pod Annotations +# podAnnotations: {} + +## Pod Labels +# podLabels: {} + +podPortName: grafana +gossipPortName: gossip +## Deployment annotations +# annotations: {} + +## Expose the grafana service to be accessed from outside the cluster (LoadBalancer service). +## or access it from within the cluster (ClusterIP service). Set the service type and the port to serve it. +## ref: http://kubernetes.io/docs/user-guide/services/ +## +service: + enabled: true + type: ClusterIP + loadBalancerIP: "" + loadBalancerClass: "" + loadBalancerSourceRanges: [] + port: 80 + targetPort: 3000 + # targetPort: 4181 To be used with a proxy extraContainer + ## Service annotations. Can be templated. + annotations: {} + labels: {} + portName: service + # Adds the appProtocol field to the service. This allows to work with istio protocol selection. Ex: "http" or "tcp" + appProtocol: "" + +serviceMonitor: + ## If true, a ServiceMonitor CRD is created for a prometheus operator + ## https://github.com/coreos/prometheus-operator + ## + enabled: false + path: /metrics + # namespace: monitoring (defaults to use the namespace this chart is deployed to) + labels: {} + interval: 30s + scheme: http + tlsConfig: {} + scrapeTimeout: 30s + relabelings: [] + metricRelabelings: [] + targetLabels: [] + +extraExposePorts: [] + # - name: keycloak + # port: 8080 + # targetPort: 8080 + +# overrides pod.spec.hostAliases in the grafana deployment's pods +hostAliases: [] + # - ip: "1.2.3.4" + # hostnames: + # - "my.host.com" + +ingress: + enabled: false + # For Kubernetes >= 1.18 you should specify the ingress-controller via the field ingressClassName + # See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#specifying-the-class-of-an-ingress + # ingressClassName: nginx + # Values can be templated + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + labels: {} + path: / + + # pathType is only for k8s >= 1.1= + pathType: Prefix + + hosts: + - chart-example.local + ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services. + extraPaths: [] + # - path: /* + # backend: + # serviceName: ssl-redirect + # servicePort: use-annotation + ## Or for k8s > 1.19 + # - path: /* + # pathType: Prefix + # backend: + # service: + # name: ssl-redirect + # port: + # name: use-annotation + + + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +resources: {} +# limits: +# cpu: 100m +# memory: 128Mi +# requests: +# cpu: 100m +# memory: 128Mi + +## Node labels for pod assignment +## ref: https://kubernetes.io/docs/user-guide/node-selection/ +# +nodeSelector: {} + +## Tolerations for pod assignment +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## Affinity for pod assignment (evaluated as template) +## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## Topology Spread Constraints +## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ +## +topologySpreadConstraints: [] + +## Additional init containers (evaluated as template) +## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ +## +extraInitContainers: [] + +## Enable an Specify container in extraContainers. This is meant to allow adding an authentication proxy to a grafana pod +extraContainers: "" +# extraContainers: | +# - name: proxy +# image: quay.io/gambol99/keycloak-proxy:latest +# args: +# - -provider=github +# - -client-id= +# - -client-secret= +# - -github-org= +# - -email-domain=* +# - -cookie-secret= +# - -http-address=http://0.0.0.0:4181 +# - -upstream-url=http://127.0.0.1:3000 +# ports: +# - name: proxy-web +# containerPort: 4181 + +## Volumes that can be used in init containers that will not be mounted to deployment pods +extraContainerVolumes: [] +# - name: volume-from-secret +# secret: +# secretName: secret-to-mount +# - name: empty-dir-volume +# emptyDir: {} + +## Enable persistence using Persistent Volume Claims +## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ +## +persistence: + type: pvc + enabled: false + # storageClassName: default + accessModes: + - ReadWriteOnce + size: 10Gi + # annotations: {} + finalizers: + - kubernetes.io/pvc-protection + # selectorLabels: {} + ## Sub-directory of the PV to mount. Can be templated. + # subPath: "" + ## Name of an existing PVC. Can be templated. + # existingClaim: + ## Extra labels to apply to a PVC. + extraPvcLabels: {} + + ## If persistence is not enabled, this allows to mount the + ## local storage in-memory to improve performance + ## + inMemory: + enabled: false + ## The maximum usage on memory medium EmptyDir would be + ## the minimum value between the SizeLimit specified + ## here and the sum of memory limits of all containers in a pod + ## + # sizeLimit: 300Mi + +initChownData: + ## If false, data ownership will not be reset at startup + ## This allows the grafana-server to be run with an arbitrary user + ## + enabled: true + + ## initChownData container image + ## + image: + # -- The Docker registry + registry: docker.io + repository: library/busybox + tag: "1.31.1" + sha: "" + pullPolicy: IfNotPresent + + ## initChownData resource requests and limits + ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## + resources: {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + securityContext: + runAsNonRoot: false + runAsUser: 0 + seccompProfile: + type: RuntimeDefault + capabilities: + add: + - CHOWN + +# Administrator credentials when not using an existing secret (see below) +adminUser: admin +# adminPassword: strongpassword + +# Use an existing secret for the admin user. +admin: + ## Name of the secret. Can be templated. + existingSecret: "" + userKey: admin-user + passwordKey: admin-password + +## Define command to be executed at startup by grafana container +## Needed if using `vault-env` to manage secrets (ref: https://banzaicloud.com/blog/inject-secrets-into-pods-vault/) +## Default is "run.sh" as defined in grafana's Dockerfile +# command: +# - "sh" +# - "/run.sh" + +## Optionally define args if command is used +## Needed if using `hashicorp/envconsul` to manage secrets +## By default no arguments are set +# args: +# - "-secret" +# - "secret/grafana" +# - "./grafana" + +## Extra environment variables that will be pass onto deployment pods +## +## to provide grafana with access to CloudWatch on AWS EKS: +## 1. create an iam role of type "Web identity" with provider oidc.eks.* (note the provider for later) +## 2. edit the "Trust relationships" of the role, add a line inside the StringEquals clause using the +## same oidc eks provider as noted before (same as the existing line) +## also, replace NAMESPACE and prometheus-operator-grafana with the service account namespace and name +## +## "oidc.eks.us-east-1.amazonaws.com/id/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:sub": "system:serviceaccount:NAMESPACE:prometheus-operator-grafana", +## +## 3. attach a policy to the role, you can use a built in policy called CloudWatchReadOnlyAccess +## 4. use the following env: (replace 123456789000 and iam-role-name-here with your aws account number and role name) +## +## env: +## AWS_ROLE_ARN: arn:aws:iam::123456789000:role/iam-role-name-here +## AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token +## AWS_REGION: us-east-1 +## +## 5. uncomment the EKS section in extraSecretMounts: below +## 6. uncomment the annotation section in the serviceAccount: above +## make sure to replace arn:aws:iam::123456789000:role/iam-role-name-here with your role arn + +env: {} + +## "valueFrom" environment variable references that will be added to deployment pods. Name is templated. +## ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/#envvarsource-v1-core +## Renders in container spec as: +## env: +## ... +## - name: +## valueFrom: +## +envValueFrom: {} + # ENV_NAME: + # configMapKeyRef: + # name: configmap-name + # key: value_key + +## The name of a secret in the same kubernetes namespace which contain values to be added to the environment +## This can be useful for auth tokens, etc. Value is templated. +envFromSecret: "" + +## Sensible environment variables that will be rendered as new secret object +## This can be useful for auth tokens, etc. +## If the secret values contains "{{", they'll need to be properly escaped so that they are not interpreted by Helm +## ref: https://helm.sh/docs/howto/charts_tips_and_tricks/#using-the-tpl-function +envRenderSecret: {} + +## The names of secrets in the same kubernetes namespace which contain values to be added to the environment +## Each entry should contain a name key, and can optionally specify whether the secret must be defined with an optional key. +## Name is templated. +envFromSecrets: [] +## - name: secret-name +## prefix: prefix +## optional: true + +## The names of conifgmaps in the same kubernetes namespace which contain values to be added to the environment +## Each entry should contain a name key, and can optionally specify whether the configmap must be defined with an optional key. +## Name is templated. +## ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#configmapenvsource-v1-core +envFromConfigMaps: [] +## - name: configmap-name +## prefix: prefix +## optional: true + +# Inject Kubernetes services as environment variables. +# See https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#environment-variables +enableServiceLinks: true + +## Additional grafana server secret mounts +# Defines additional mounts with secrets. Secrets must be manually created in the namespace. +extraSecretMounts: [] + # - name: secret-files + # mountPath: /etc/secrets + # secretName: grafana-secret-files + # readOnly: true + # subPath: "" + # + # for AWS EKS (cloudwatch) use the following (see also instruction in env: above) + # - name: aws-iam-token + # mountPath: /var/run/secrets/eks.amazonaws.com/serviceaccount + # readOnly: true + # projected: + # defaultMode: 420 + # sources: + # - serviceAccountToken: + # audience: sts.amazonaws.com + # expirationSeconds: 86400 + # path: token + # + # for CSI e.g. Azure Key Vault use the following + # - name: secrets-store-inline + # mountPath: /run/secrets + # readOnly: true + # csi: + # driver: secrets-store.csi.k8s.io + # readOnly: true + # volumeAttributes: + # secretProviderClass: "akv-grafana-spc" + # nodePublishSecretRef: # Only required when using service principal mode + # name: grafana-akv-creds # Only required when using service principal mode + +## Additional grafana server volume mounts +# Defines additional volume mounts. +extraVolumeMounts: [] + # - name: extra-volume-0 + # mountPath: /mnt/volume0 + # readOnly: true + # - name: extra-volume-1 + # mountPath: /mnt/volume1 + # readOnly: true + # - name: grafana-secrets + # mountPath: /mnt/volume2 + +## Additional Grafana server volumes +extraVolumes: [] + # - name: extra-volume-0 + # existingClaim: volume-claim + # - name: extra-volume-1 + # hostPath: + # path: /usr/shared/ + # type: "" + # - name: grafana-secrets + # csi: + # driver: secrets-store.csi.k8s.io + # readOnly: true + # volumeAttributes: + # secretProviderClass: "grafana-env-spc" + +## Container Lifecycle Hooks. Execute a specific bash command or make an HTTP request +lifecycleHooks: {} + # postStart: + # exec: + # command: [] + +## Pass the plugins you want installed as a list. +## +plugins: [] + # - digrich-bubblechart-panel + # - grafana-clock-panel + ## You can also use other plugin download URL, as long as they are valid zip files, + ## and specify the name of the plugin after the semicolon. Like this: + # - https://grafana.com/api/plugins/marcusolsson-json-datasource/versions/1.3.2/download;marcusolsson-json-datasource + +## Configure grafana datasources +## ref: http://docs.grafana.org/administration/provisioning/#datasources +## +datasources: {} +# datasources.yaml: +# apiVersion: 1 +# datasources: +# - name: Prometheus +# type: prometheus +# url: http://prometheus-prometheus-server +# access: proxy +# isDefault: true +# - name: CloudWatch +# type: cloudwatch +# access: proxy +# uid: cloudwatch +# editable: false +# jsonData: +# authType: default +# defaultRegion: us-east-1 +# deleteDatasources: [] +# - name: Prometheus + +## Configure grafana alerting (can be templated) +## ref: http://docs.grafana.org/administration/provisioning/#alerting +## +alerting: {} + # rules.yaml: + # apiVersion: 1 + # groups: + # - orgId: 1 + # name: '{{ .Chart.Name }}_my_rule_group' + # folder: my_first_folder + # interval: 60s + # rules: + # - uid: my_id_1 + # title: my_first_rule + # condition: A + # data: + # - refId: A + # datasourceUid: '-100' + # model: + # conditions: + # - evaluator: + # params: + # - 3 + # type: gt + # operator: + # type: and + # query: + # params: + # - A + # reducer: + # type: last + # type: query + # datasource: + # type: __expr__ + # uid: '-100' + # expression: 1==0 + # intervalMs: 1000 + # maxDataPoints: 43200 + # refId: A + # type: math + # dashboardUid: my_dashboard + # panelId: 123 + # noDataState: Alerting + # for: 60s + # annotations: + # some_key: some_value + # labels: + # team: sre_team_1 + # contactpoints.yaml: + # secret: + # apiVersion: 1 + # contactPoints: + # - orgId: 1 + # name: cp_1 + # receivers: + # - uid: first_uid + # type: pagerduty + # settings: + # integrationKey: XXX + # severity: critical + # class: ping failure + # component: Grafana + # group: app-stack + # summary: | + # {{ `{{ include "default.message" . }}` }} + +## Configure notifiers +## ref: http://docs.grafana.org/administration/provisioning/#alert-notification-channels +## +notifiers: {} +# notifiers.yaml: +# notifiers: +# - name: email-notifier +# type: email +# uid: email1 +# # either: +# org_id: 1 +# # or +# org_name: Main Org. +# is_default: true +# settings: +# addresses: an_email_address@example.com +# delete_notifiers: + +## Configure grafana dashboard providers +## ref: http://docs.grafana.org/administration/provisioning/#dashboards +## +## `path` must be /var/lib/grafana/dashboards/ +## +dashboardProviders: {} +# dashboardproviders.yaml: +# apiVersion: 1 +# providers: +# - name: 'default' +# orgId: 1 +# folder: '' +# type: file +# disableDeletion: false +# editable: true +# options: +# path: /var/lib/grafana/dashboards/default + +## Configure grafana dashboard to import +## NOTE: To use dashboards you must also enable/configure dashboardProviders +## ref: https://grafana.com/dashboards +## +## dashboards per provider, use provider name as key. +## +dashboards: {} + # default: + # some-dashboard: + # json: | + # $RAW_JSON + # custom-dashboard: + # file: dashboards/custom-dashboard.json + # prometheus-stats: + # gnetId: 2 + # revision: 2 + # datasource: Prometheus + # local-dashboard: + # url: https://example.com/repository/test.json + # token: '' + # local-dashboard-base64: + # url: https://example.com/repository/test-b64.json + # token: '' + # b64content: true + # local-dashboard-gitlab: + # url: https://example.com/repository/test-gitlab.json + # gitlabToken: '' + # local-dashboard-bitbucket: + # url: https://example.com/repository/test-bitbucket.json + # bearerToken: '' + # local-dashboard-azure: + # url: https://example.com/repository/test-azure.json + # basic: '' + # acceptHeader: '*/*' + +## Reference to external ConfigMap per provider. Use provider name as key and ConfigMap name as value. +## A provider dashboards must be defined either by external ConfigMaps or in values.yaml, not in both. +## ConfigMap data example: +## +## data: +## example-dashboard.json: | +## RAW_JSON +## +dashboardsConfigMaps: {} +# default: "" + +## Grafana's primary configuration +## NOTE: values in map will be converted to ini format +## ref: http://docs.grafana.org/installation/configuration/ +## +grafana.ini: + paths: + data: /var/lib/grafana/ + logs: /var/log/grafana + plugins: /var/lib/grafana/plugins + provisioning: /etc/grafana/provisioning + analytics: + check_for_updates: true + log: + mode: console + grafana_net: + url: https://grafana.net + server: + domain: "{{ if (and .Values.ingress.enabled .Values.ingress.hosts) }}{{ .Values.ingress.hosts | first }}{{ else }}''{{ end }}" +## grafana Authentication can be enabled with the following values on grafana.ini + # server: + # The full public facing url you use in browser, used for redirects and emails + # root_url: + # https://grafana.com/docs/grafana/latest/auth/github/#enable-github-in-grafana + # auth.github: + # enabled: false + # allow_sign_up: false + # scopes: user:email,read:org + # auth_url: https://github.com/login/oauth/authorize + # token_url: https://github.com/login/oauth/access_token + # api_url: https://api.github.com/user + # team_ids: + # allowed_organizations: + # client_id: + # client_secret: +## LDAP Authentication can be enabled with the following values on grafana.ini +## NOTE: Grafana will fail to start if the value for ldap.toml is invalid + # auth.ldap: + # enabled: true + # allow_sign_up: true + # config_file: /etc/grafana/ldap.toml + +## Grafana's LDAP configuration +## Templated by the template in _helpers.tpl +## NOTE: To enable the grafana.ini must be configured with auth.ldap.enabled +## ref: http://docs.grafana.org/installation/configuration/#auth-ldap +## ref: http://docs.grafana.org/installation/ldap/#configuration +ldap: + enabled: false + # `existingSecret` is a reference to an existing secret containing the ldap configuration + # for Grafana in a key `ldap-toml`. + existingSecret: "" + # `config` is the content of `ldap.toml` that will be stored in the created secret + config: "" + # config: |- + # verbose_logging = true + + # [[servers]] + # host = "my-ldap-server" + # port = 636 + # use_ssl = true + # start_tls = false + # ssl_skip_verify = false + # bind_dn = "uid=%s,ou=users,dc=myorg,dc=com" + +## Grafana's SMTP configuration +## NOTE: To enable, grafana.ini must be configured with smtp.enabled +## ref: http://docs.grafana.org/installation/configuration/#smtp +smtp: + # `existingSecret` is a reference to an existing secret containing the smtp configuration + # for Grafana. + existingSecret: "" + userKey: "user" + passwordKey: "password" + +## Sidecars that collect the configmaps with specified label and stores the included files them into the respective folders +## Requires at least Grafana 5 to work and can't be used together with parameters dashboardProviders, datasources and dashboards +sidecar: + image: + # -- The Docker registry + registry: quay.io + repository: kiwigrid/k8s-sidecar + tag: 1.25.2 + sha: "" + imagePullPolicy: IfNotPresent + resources: {} +# limits: +# cpu: 100m +# memory: 100Mi +# requests: +# cpu: 50m +# memory: 50Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + seccompProfile: + type: RuntimeDefault + # skipTlsVerify Set to true to skip tls verification for kube api calls + # skipTlsVerify: true + enableUniqueFilenames: false + readinessProbe: {} + livenessProbe: {} + # Log level default for all sidecars. Can be one of: DEBUG, INFO, WARN, ERROR, CRITICAL. Defaults to INFO + # logLevel: INFO + alerts: + enabled: false + # Additional environment variables for the alerts sidecar + env: {} + # Do not reprocess already processed unchanged resources on k8s API reconnect. + # ignoreAlreadyProcessed: true + # label that the configmaps with alert are marked with + label: grafana_alert + # value of label that the configmaps with alert are set to + labelValue: "" + # Log level. Can be one of: DEBUG, INFO, WARN, ERROR, CRITICAL. + # logLevel: INFO + # If specified, the sidecar will search for alert config-maps inside this namespace. + # Otherwise the namespace in which the sidecar is running will be used. + # It's also possible to specify ALL to search in all namespaces + searchNamespace: null + # Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. + watchMethod: WATCH + # search in configmap, secret or both + resource: both + # watchServerTimeout: request to the server, asking it to cleanly close the connection after that. + # defaults to 60sec; much higher values like 3600 seconds (1h) are feasible for non-Azure K8S + # watchServerTimeout: 3600 + # + # watchClientTimeout: is a client-side timeout, configuring your local socket. + # If you have a network outage dropping all packets with no RST/FIN, + # this is how long your client waits before realizing & dropping the connection. + # defaults to 66sec (sic!) + # watchClientTimeout: 60 + # + # Endpoint to send request to reload alerts + reloadURL: "http://localhost:3000/api/admin/provisioning/alerting/reload" + # Absolute path to shell script to execute after a alert got reloaded + script: null + skipReload: false + # This is needed if skipReload is true, to load any alerts defined at startup time. + # Deploy the alert sidecar as an initContainer. + initAlerts: false + # Additional alert sidecar volume mounts + extraMounts: [] + # Sets the size limit of the alert sidecar emptyDir volume + sizeLimit: {} + dashboards: + enabled: false + # Additional environment variables for the dashboards sidecar + env: {} + # Do not reprocess already processed unchanged resources on k8s API reconnect. + # ignoreAlreadyProcessed: true + SCProvider: true + # label that the configmaps with dashboards are marked with + label: grafana_dashboard + # value of label that the configmaps with dashboards are set to + labelValue: "" + # Log level. Can be one of: DEBUG, INFO, WARN, ERROR, CRITICAL. + # logLevel: INFO + # folder in the pod that should hold the collected dashboards (unless `defaultFolderName` is set) + folder: /tmp/dashboards + # The default folder name, it will create a subfolder under the `folder` and put dashboards in there instead + defaultFolderName: null + # Namespaces list. If specified, the sidecar will search for config-maps/secrets inside these namespaces. + # Otherwise the namespace in which the sidecar is running will be used. + # It's also possible to specify ALL to search in all namespaces. + searchNamespace: null + # Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. + watchMethod: WATCH + # search in configmap, secret or both + resource: both + # If specified, the sidecar will look for annotation with this name to create folder and put graph here. + # You can use this parameter together with `provider.foldersFromFilesStructure`to annotate configmaps and create folder structure. + folderAnnotation: null + # Endpoint to send request to reload alerts + reloadURL: "http://localhost:3000/api/admin/provisioning/dashboards/reload" + # Absolute path to shell script to execute after a configmap got reloaded + script: null + skipReload: false + # watchServerTimeout: request to the server, asking it to cleanly close the connection after that. + # defaults to 60sec; much higher values like 3600 seconds (1h) are feasible for non-Azure K8S + # watchServerTimeout: 3600 + # + # watchClientTimeout: is a client-side timeout, configuring your local socket. + # If you have a network outage dropping all packets with no RST/FIN, + # this is how long your client waits before realizing & dropping the connection. + # defaults to 66sec (sic!) + # watchClientTimeout: 60 + # + # provider configuration that lets grafana manage the dashboards + provider: + # name of the provider, should be unique + name: sidecarProvider + # orgid as configured in grafana + orgid: 1 + # folder in which the dashboards should be imported in grafana + folder: '' + # type of the provider + type: file + # disableDelete to activate a import-only behaviour + disableDelete: false + # allow updating provisioned dashboards from the UI + allowUiUpdates: false + # allow Grafana to replicate dashboard structure from filesystem + foldersFromFilesStructure: false + # Additional dashboard sidecar volume mounts + extraMounts: [] + # Sets the size limit of the dashboard sidecar emptyDir volume + sizeLimit: {} + datasources: + enabled: false + # Additional environment variables for the datasourcessidecar + env: {} + envValueFrom: {} + # Do not reprocess already processed unchanged resources on k8s API reconnect. + # ignoreAlreadyProcessed: true + # label that the configmaps with datasources are marked with + label: grafana_datasource + # value of label that the configmaps with datasources are set to + labelValue: "" + # Log level. Can be one of: DEBUG, INFO, WARN, ERROR, CRITICAL. + # logLevel: INFO + # If specified, the sidecar will search for datasource config-maps inside this namespace. + # Otherwise the namespace in which the sidecar is running will be used. + # It's also possible to specify ALL to search in all namespaces + searchNamespace: null + # Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. + watchMethod: WATCH + # search in configmap, secret or both + resource: both + # watchServerTimeout: request to the server, asking it to cleanly close the connection after that. + # defaults to 60sec; much higher values like 3600 seconds (1h) are feasible for non-Azure K8S + # watchServerTimeout: 3600 + # + # watchClientTimeout: is a client-side timeout, configuring your local socket. + # If you have a network outage dropping all packets with no RST/FIN, + # this is how long your client waits before realizing & dropping the connection. + # defaults to 66sec (sic!) + # watchClientTimeout: 60 + # + # Endpoint to send request to reload datasources + reloadURL: "http://localhost:3000/api/admin/provisioning/datasources/reload" + # Absolute path to shell script to execute after a datasource got reloaded + script: null + skipReload: false + # This is needed if skipReload is true, to load any datasources defined at startup time. + # Deploy the datasources sidecar as an initContainer. + initDatasources: false + # Sets the size limit of the datasource sidecar emptyDir volume + sizeLimit: {} + plugins: + enabled: false + # Additional environment variables for the plugins sidecar + env: {} + # Do not reprocess already processed unchanged resources on k8s API reconnect. + # ignoreAlreadyProcessed: true + # label that the configmaps with plugins are marked with + label: grafana_plugin + # value of label that the configmaps with plugins are set to + labelValue: "" + # Log level. Can be one of: DEBUG, INFO, WARN, ERROR, CRITICAL. + # logLevel: INFO + # If specified, the sidecar will search for plugin config-maps inside this namespace. + # Otherwise the namespace in which the sidecar is running will be used. + # It's also possible to specify ALL to search in all namespaces + searchNamespace: null + # Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. + watchMethod: WATCH + # search in configmap, secret or both + resource: both + # watchServerTimeout: request to the server, asking it to cleanly close the connection after that. + # defaults to 60sec; much higher values like 3600 seconds (1h) are feasible for non-Azure K8S + # watchServerTimeout: 3600 + # + # watchClientTimeout: is a client-side timeout, configuring your local socket. + # If you have a network outage dropping all packets with no RST/FIN, + # this is how long your client waits before realizing & dropping the connection. + # defaults to 66sec (sic!) + # watchClientTimeout: 60 + # + # Endpoint to send request to reload plugins + reloadURL: "http://localhost:3000/api/admin/provisioning/plugins/reload" + # Absolute path to shell script to execute after a plugin got reloaded + script: null + skipReload: false + # Deploy the datasource sidecar as an initContainer in addition to a container. + # This is needed if skipReload is true, to load any plugins defined at startup time. + initPlugins: false + # Sets the size limit of the plugin sidecar emptyDir volume + sizeLimit: {} + notifiers: + enabled: false + # Additional environment variables for the notifierssidecar + env: {} + # Do not reprocess already processed unchanged resources on k8s API reconnect. + # ignoreAlreadyProcessed: true + # label that the configmaps with notifiers are marked with + label: grafana_notifier + # value of label that the configmaps with notifiers are set to + labelValue: "" + # Log level. Can be one of: DEBUG, INFO, WARN, ERROR, CRITICAL. + # logLevel: INFO + # If specified, the sidecar will search for notifier config-maps inside this namespace. + # Otherwise the namespace in which the sidecar is running will be used. + # It's also possible to specify ALL to search in all namespaces + searchNamespace: null + # Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. + watchMethod: WATCH + # search in configmap, secret or both + resource: both + # watchServerTimeout: request to the server, asking it to cleanly close the connection after that. + # defaults to 60sec; much higher values like 3600 seconds (1h) are feasible for non-Azure K8S + # watchServerTimeout: 3600 + # + # watchClientTimeout: is a client-side timeout, configuring your local socket. + # If you have a network outage dropping all packets with no RST/FIN, + # this is how long your client waits before realizing & dropping the connection. + # defaults to 66sec (sic!) + # watchClientTimeout: 60 + # + # Endpoint to send request to reload notifiers + reloadURL: "http://localhost:3000/api/admin/provisioning/notifications/reload" + # Absolute path to shell script to execute after a notifier got reloaded + script: null + skipReload: false + # Deploy the notifier sidecar as an initContainer in addition to a container. + # This is needed if skipReload is true, to load any notifiers defined at startup time. + initNotifiers: false + # Sets the size limit of the notifier sidecar emptyDir volume + sizeLimit: {} + +## Override the deployment namespace +## +namespaceOverride: "" + +## Number of old ReplicaSets to retain +## +revisionHistoryLimit: 10 + +## Add a seperate remote image renderer deployment/service +imageRenderer: + deploymentStrategy: {} + # Enable the image-renderer deployment & service + enabled: false + replicas: 1 + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 5 + targetCPU: "60" + targetMemory: "" + behavior: {} + image: + # -- The Docker registry + registry: docker.io + # image-renderer Image repository + repository: grafana/grafana-image-renderer + # image-renderer Image tag + tag: latest + # image-renderer Image sha (optional) + sha: "" + # image-renderer ImagePullPolicy + pullPolicy: Always + # extra environment variables + env: + HTTP_HOST: "0.0.0.0" + # RENDERING_ARGS: --no-sandbox,--disable-gpu,--window-size=1280x758 + # RENDERING_MODE: clustered + # IGNORE_HTTPS_ERRORS: true + + ## "valueFrom" environment variable references that will be added to deployment pods. Name is templated. + ## ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/#envvarsource-v1-core + ## Renders in container spec as: + ## env: + ## ... + ## - name: + ## valueFrom: + ## + envValueFrom: {} + # ENV_NAME: + # configMapKeyRef: + # name: configmap-name + # key: value_key + + # image-renderer deployment serviceAccount + serviceAccountName: "" + # image-renderer deployment securityContext + securityContext: {} + # image-renderer deployment container securityContext + containerSecurityContext: + seccompProfile: + type: RuntimeDefault + capabilities: + drop: ['ALL'] + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + ## image-renderer pod annotation + podAnnotations: {} + # image-renderer deployment Host Aliases + hostAliases: [] + # image-renderer deployment priority class + priorityClassName: '' + service: + # Enable the image-renderer service + enabled: true + # image-renderer service port name + portName: 'http' + # image-renderer service port used by both service and deployment + port: 8081 + targetPort: 8081 + # Adds the appProtocol field to the image-renderer service. This allows to work with istio protocol selection. Ex: "http" or "tcp" + appProtocol: "" + serviceMonitor: + ## If true, a ServiceMonitor CRD is created for a prometheus operator + ## https://github.com/coreos/prometheus-operator + ## + enabled: false + path: /metrics + # namespace: monitoring (defaults to use the namespace this chart is deployed to) + labels: {} + interval: 1m + scheme: http + tlsConfig: {} + scrapeTimeout: 30s + relabelings: [] + # See: https://doc.crds.dev/github.com/prometheus-operator/kube-prometheus/monitoring.coreos.com/ServiceMonitor/v1@v0.11.0#spec-targetLabels + targetLabels: [] + # - targetLabel1 + # - targetLabel2 + # If https is enabled in Grafana, this needs to be set as 'https' to correctly configure the callback used in Grafana + grafanaProtocol: http + # In case a sub_path is used this needs to be added to the image renderer callback + grafanaSubPath: "" + # name of the image-renderer port on the pod + podPortName: http + # number of image-renderer replica sets to keep + revisionHistoryLimit: 10 + networkPolicy: + # Enable a NetworkPolicy to limit inbound traffic to only the created grafana pods + limitIngress: true + # Enable a NetworkPolicy to limit outbound traffic to only the created grafana pods + limitEgress: false + # Allow additional services to access image-renderer (eg. Prometheus operator when ServiceMonitor is enabled) + extraIngressSelectors: [] + resources: {} +# limits: +# cpu: 100m +# memory: 100Mi +# requests: +# cpu: 50m +# memory: 50Mi + ## Node labels for pod assignment + ## ref: https://kubernetes.io/docs/user-guide/node-selection/ + # + nodeSelector: {} + + ## Tolerations for pod assignment + ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + ## + tolerations: [] + + ## Affinity for pod assignment (evaluated as template) + ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity + ## + affinity: {} + + ## Use an alternate scheduler, e.g. "stork". + ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ + ## + # schedulerName: "default-scheduler" + +networkPolicy: + ## @param networkPolicy.enabled Enable creation of NetworkPolicy resources. Only Ingress traffic is filtered for now. + ## + enabled: false + ## @param networkPolicy.allowExternal Don't require client label for connections + ## The Policy model to apply. When set to false, only pods with the correct + ## client label will have network access to grafana port defined. + ## When true, grafana will accept connections from any source + ## (with the correct destination port). + ## + ingress: true + ## @param networkPolicy.ingress When true enables the creation + ## an ingress network policy + ## + allowExternal: true + ## @param networkPolicy.explicitNamespacesSelector A Kubernetes LabelSelector to explicitly select namespaces from which traffic could be allowed + ## If explicitNamespacesSelector is missing or set to {}, only client Pods that are in the networkPolicy's namespace + ## and that match other criteria, the ones that have the good label, can reach the grafana. + ## But sometimes, we want the grafana to be accessible to clients from other namespaces, in this case, we can use this + ## LabelSelector to select these namespaces, note that the networkPolicy's namespace should also be explicitly added. + ## + ## Example: + ## explicitNamespacesSelector: + ## matchLabels: + ## role: frontend + ## matchExpressions: + ## - {key: role, operator: In, values: [frontend]} + ## + explicitNamespacesSelector: {} + ## + ## + ## + ## + ## + ## + egress: + ## @param networkPolicy.egress.enabled When enabled, an egress network policy will be + ## created allowing grafana to connect to external data sources from kubernetes cluster. + enabled: false + ## + ## @param networkPolicy.egress.blockDNSResolution When enabled, DNS resolution will be blocked + ## for all pods in the grafana namespace. + blockDNSResolution: false + ## + ## @param networkPolicy.egress.ports Add individual ports to be allowed by the egress + ports: [] + ## Add ports to the egress by specifying - port: + ## E.X. + ## - port: 80 + ## - port: 443 + ## + ## @param networkPolicy.egress.to Allow egress traffic to specific destinations + to: [] + ## Add destinations to the egress by specifying - ipBlock: + ## E.X. + ## to: + ## - namespaceSelector: + ## matchExpressions: + ## - {key: role, operator: In, values: [grafana]} + ## + ## + ## + ## + ## + +# Enable backward compatibility of kubernetes where version below 1.13 doesn't have the enableServiceLinks option +enableKubeBackwardCompatibility: false +useStatefulSet: false +# Create a dynamic manifests via values: +extraObjects: [] + # - apiVersion: "kubernetes-client.io/v1" + # kind: ExternalSecret + # metadata: + # name: grafana-secrets + # spec: + # backendType: gcpSecretsManager + # data: + # - key: grafana-admin-password + # name: adminPassword + +# assertNoLeakedSecrets is a helper function defined in _helpers.tpl that checks if secret +# values are not exposed in the rendered grafana.ini configmap. It is enabled by default. +# +# To pass values into grafana.ini without exposing them in a configmap, use variable expansion: +# https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#variable-expansion +# +# Alternatively, if you wish to allow secret values to be exposed in the rendered grafana.ini configmap, +# you can disable this check by setting assertNoLeakedSecrets to false. +assertNoLeakedSecrets: true diff --git a/thunder_deployment/infra/beta9/charts/postgresql/.helmignore b/thunder_deployment/infra/beta9/charts/postgresql/.helmignore new file mode 100644 index 000000000..fb56657ab --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +# img folder +img/ diff --git a/thunder_deployment/infra/beta9/charts/postgresql/Chart.lock b/thunder_deployment/infra/beta9/charts/postgresql/Chart.lock new file mode 100644 index 000000000..5f5e5abcf --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: oci://registry-1.docker.io/bitnamicharts + version: 2.14.1 +digest: sha256:5ccbe5f1fe4459864a8c9d7329c400b678666b6cfb1450818a830bda81995bc3 +generated: "2023-12-20T20:39:13.141839286Z" diff --git a/thunder_deployment/infra/beta9/charts/postgresql/Chart.yaml b/thunder_deployment/infra/beta9/charts/postgresql/Chart.yaml new file mode 100644 index 000000000..e9c12678c --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/Chart.yaml @@ -0,0 +1,37 @@ +annotations: + category: Database + images: | + - name: os-shell + image: docker.io/bitnami/os-shell:11-debian-11-r95 + - name: postgres-exporter + image: docker.io/bitnami/postgres-exporter:0.15.0-debian-11-r6 + - name: postgresql + image: docker.io/bitnami/postgresql:16.1.0-debian-11-r24 + licenses: Apache-2.0 +apiVersion: v2 +appVersion: 16.1.0 +dependencies: +- name: common + repository: oci://registry-1.docker.io/bitnamicharts + tags: + - bitnami-common + version: 2.x.x +description: PostgreSQL (Postgres) is an open source object-relational database known + for reliability and data integrity. ACID-compliant, it supports foreign keys, joins, + views, triggers and stored procedures. +home: https://bitnami.com +icon: https://bitnami.com/assets/stacks/postgresql/img/postgresql-stack-220x234.png +keywords: +- postgresql +- postgres +- database +- sql +- replication +- cluster +maintainers: +- name: VMware, Inc. + url: https://github.com/bitnami/charts +name: postgresql +sources: +- https://github.com/bitnami/charts/tree/main/bitnami/postgresql +version: 13.4.3 diff --git a/thunder_deployment/infra/beta9/charts/postgresql/README.md b/thunder_deployment/infra/beta9/charts/postgresql/README.md new file mode 100644 index 000000000..24a4b1fe6 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/README.md @@ -0,0 +1,998 @@ + + +# Bitnami package for PostgreSQL + +PostgreSQL (Postgres) is an open source object-relational database known for reliability and data integrity. ACID-compliant, it supports foreign keys, joins, views, triggers and stored procedures. + +[Overview of PostgreSQL](http://www.postgresql.org) + +Trademarks: This software listing is packaged by Bitnami. The respective trademarks mentioned in the offering are owned by the respective companies, and use of them does not imply any affiliation or endorsement. + +## TL;DR + +```console +helm install my-release oci://registry-1.docker.io/bitnamicharts/postgresql +``` + +Looking to use PostgreSQL in production? Try [VMware Tanzu Application Catalog](https://bitnami.com/enterprise), the enterprise edition of Bitnami Application Catalog. + +## Introduction + +This chart bootstraps a [PostgreSQL](https://github.com/bitnami/containers/tree/main/bitnami/postgresql) deployment on a [Kubernetes](https://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. + +For HA, please see [this repo](https://github.com/bitnami/charts/tree/main/bitnami/postgresql-ha) + +Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. + +## Prerequisites + +- Kubernetes 1.23+ +- Helm 3.8.0+ +- PV provisioner support in the underlying infrastructure + +## Installing the Chart + +To install the chart with the release name `my-release`: + +```console +helm install my-release oci://REGISTRY_NAME/REPOSITORY_NAME/postgresql +``` + +> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. + +The command deploys PostgreSQL on the Kubernetes cluster in the default configuration. The [Parameters](#parameters) section lists the parameters that can be configured during installation. + +> **Tip**: List all releases using `helm list` + +## Uninstalling the Chart + +To uninstall/delete the `my-release` deployment: + +```console +helm delete my-release +``` + +The command removes all the Kubernetes components but PVC's associated with the chart and deletes the release. + +To delete the PVC's associated with `my-release`: + +```console +kubectl delete pvc -l release=my-release +``` + +> **Note**: Deleting the PVC's will delete postgresql data as well. Please be cautious before doing it. + +## Parameters + +### Global parameters + +| Name | Description | Value | +| ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----- | +| `global.imageRegistry` | Global Docker image registry | `""` | +| `global.imagePullSecrets` | Global Docker registry secret names as an array | `[]` | +| `global.storageClass` | Global StorageClass for Persistent Volume(s) | `""` | +| `global.postgresql.auth.postgresPassword` | Password for the "postgres" admin user (overrides `auth.postgresPassword`) | `""` | +| `global.postgresql.auth.username` | Name for a custom user to create (overrides `auth.username`) | `""` | +| `global.postgresql.auth.password` | Password for the custom user to create (overrides `auth.password`) | `""` | +| `global.postgresql.auth.database` | Name for a custom database to create (overrides `auth.database`) | `""` | +| `global.postgresql.auth.existingSecret` | Name of existing secret to use for PostgreSQL credentials (overrides `auth.existingSecret`). | `""` | +| `global.postgresql.auth.secretKeys.adminPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials (overrides `auth.secretKeys.adminPasswordKey`). Only used when `global.postgresql.auth.existingSecret` is set. | `""` | +| `global.postgresql.auth.secretKeys.userPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials (overrides `auth.secretKeys.userPasswordKey`). Only used when `global.postgresql.auth.existingSecret` is set. | `""` | +| `global.postgresql.auth.secretKeys.replicationPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials (overrides `auth.secretKeys.replicationPasswordKey`). Only used when `global.postgresql.auth.existingSecret` is set. | `""` | +| `global.postgresql.service.ports.postgresql` | PostgreSQL service port (overrides `service.ports.postgresql`) | `""` | + +### Common parameters + +| Name | Description | Value | +| ------------------------ | -------------------------------------------------------------------------------------------- | --------------- | +| `kubeVersion` | Override Kubernetes version | `""` | +| `nameOverride` | String to partially override common.names.fullname template (will maintain the release name) | `""` | +| `fullnameOverride` | String to fully override common.names.fullname template | `""` | +| `clusterDomain` | Kubernetes Cluster Domain | `cluster.local` | +| `extraDeploy` | Array of extra objects to deploy with the release (evaluated as a template) | `[]` | +| `commonLabels` | Add labels to all the deployed resources | `{}` | +| `commonAnnotations` | Add annotations to all the deployed resources | `{}` | +| `diagnosticMode.enabled` | Enable diagnostic mode (all probes will be disabled and the command will be overridden) | `false` | +| `diagnosticMode.command` | Command to override all containers in the statefulset | `["sleep"]` | +| `diagnosticMode.args` | Args to override all containers in the statefulset | `["infinity"]` | + +### PostgreSQL common parameters + +| Name | Description | Value | +| ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | +| `image.registry` | PostgreSQL image registry | `REGISTRY_NAME` | +| `image.repository` | PostgreSQL image repository | `REPOSITORY_NAME/postgresql` | +| `image.digest` | PostgreSQL image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | +| `image.pullPolicy` | PostgreSQL image pull policy | `IfNotPresent` | +| `image.pullSecrets` | Specify image pull secrets | `[]` | +| `image.debug` | Specify if debug values should be set | `false` | +| `auth.enablePostgresUser` | Assign a password to the "postgres" admin user. Otherwise, remote access will be blocked for this user | `true` | +| `auth.postgresPassword` | Password for the "postgres" admin user. Ignored if `auth.existingSecret` is provided | `""` | +| `auth.username` | Name for a custom user to create | `""` | +| `auth.password` | Password for the custom user to create. Ignored if `auth.existingSecret` is provided | `""` | +| `auth.database` | Name for a custom database to create | `""` | +| `auth.replicationUsername` | Name of the replication user | `repl_user` | +| `auth.replicationPassword` | Password for the replication user. Ignored if `auth.existingSecret` is provided | `""` | +| `auth.existingSecret` | Name of existing secret to use for PostgreSQL credentials. `auth.postgresPassword`, `auth.password`, and `auth.replicationPassword` will be ignored and picked up from this secret. The secret might also contains the key `ldap-password` if LDAP is enabled. `ldap.bind_password` will be ignored and picked from this secret in this case. | `""` | +| `auth.secretKeys.adminPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials. Only used when `auth.existingSecret` is set. | `postgres-password` | +| `auth.secretKeys.userPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials. Only used when `auth.existingSecret` is set. | `password` | +| `auth.secretKeys.replicationPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials. Only used when `auth.existingSecret` is set. | `replication-password` | +| `auth.usePasswordFiles` | Mount credentials as a files instead of using an environment variable | `false` | +| `architecture` | PostgreSQL architecture (`standalone` or `replication`) | `standalone` | +| `replication.synchronousCommit` | Set synchronous commit mode. Allowed values: `on`, `remote_apply`, `remote_write`, `local` and `off` | `off` | +| `replication.numSynchronousReplicas` | Number of replicas that will have synchronous replication. Note: Cannot be greater than `readReplicas.replicaCount`. | `0` | +| `replication.applicationName` | Cluster application name. Useful for advanced replication settings | `my_application` | +| `containerPorts.postgresql` | PostgreSQL container port | `5432` | +| `audit.logHostname` | Log client hostnames | `false` | +| `audit.logConnections` | Add client log-in operations to the log file | `false` | +| `audit.logDisconnections` | Add client log-outs operations to the log file | `false` | +| `audit.pgAuditLog` | Add operations to log using the pgAudit extension | `""` | +| `audit.pgAuditLogCatalog` | Log catalog using pgAudit | `off` | +| `audit.clientMinMessages` | Message log level to share with the user | `error` | +| `audit.logLinePrefix` | Template for log line prefix (default if not set) | `""` | +| `audit.logTimezone` | Timezone for the log timestamps | `""` | +| `ldap.enabled` | Enable LDAP support | `false` | +| `ldap.server` | IP address or name of the LDAP server. | `""` | +| `ldap.port` | Port number on the LDAP server to connect to | `""` | +| `ldap.prefix` | String to prepend to the user name when forming the DN to bind | `""` | +| `ldap.suffix` | String to append to the user name when forming the DN to bind | `""` | +| `ldap.basedn` | Root DN to begin the search for the user in | `""` | +| `ldap.binddn` | DN of user to bind to LDAP | `""` | +| `ldap.bindpw` | Password for the user to bind to LDAP | `""` | +| `ldap.searchAttribute` | Attribute to match against the user name in the search | `""` | +| `ldap.searchFilter` | The search filter to use when doing search+bind authentication | `""` | +| `ldap.scheme` | Set to `ldaps` to use LDAPS | `""` | +| `ldap.tls.enabled` | Se to true to enable TLS encryption | `false` | +| `ldap.uri` | LDAP URL beginning in the form `ldap[s]://host[:port]/basedn`. If provided, all the other LDAP parameters will be ignored. | `""` | +| `postgresqlDataDir` | PostgreSQL data dir folder | `/bitnami/postgresql/data` | +| `postgresqlSharedPreloadLibraries` | Shared preload libraries (comma-separated list) | `pgaudit` | +| `shmVolume.enabled` | Enable emptyDir volume for /dev/shm for PostgreSQL pod(s) | `true` | +| `shmVolume.sizeLimit` | Set this to enable a size limit on the shm tmpfs | `""` | +| `tls.enabled` | Enable TLS traffic support | `false` | +| `tls.autoGenerated` | Generate automatically self-signed TLS certificates | `false` | +| `tls.preferServerCiphers` | Whether to use the server's TLS cipher preferences rather than the client's | `true` | +| `tls.certificatesSecret` | Name of an existing secret that contains the certificates | `""` | +| `tls.certFilename` | Certificate filename | `""` | +| `tls.certKeyFilename` | Certificate key filename | `""` | +| `tls.certCAFilename` | CA Certificate filename | `""` | +| `tls.crlFilename` | File containing a Certificate Revocation List | `""` | + +### PostgreSQL Primary parameters + +| Name | Description | Value | +| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | --------------------- | +| `primary.name` | Name of the primary database (eg primary, master, leader, ...) | `primary` | +| `primary.configuration` | PostgreSQL Primary main configuration to be injected as ConfigMap | `""` | +| `primary.pgHbaConfiguration` | PostgreSQL Primary client authentication configuration | `""` | +| `primary.existingConfigmap` | Name of an existing ConfigMap with PostgreSQL Primary configuration | `""` | +| `primary.extendedConfiguration` | Extended PostgreSQL Primary configuration (appended to main or default configuration) | `""` | +| `primary.existingExtendedConfigmap` | Name of an existing ConfigMap with PostgreSQL Primary extended configuration | `""` | +| `primary.initdb.args` | PostgreSQL initdb extra arguments | `""` | +| `primary.initdb.postgresqlWalDir` | Specify a custom location for the PostgreSQL transaction log | `""` | +| `primary.initdb.scripts` | Dictionary of initdb scripts | `{}` | +| `primary.initdb.scriptsConfigMap` | ConfigMap with scripts to be run at first boot | `""` | +| `primary.initdb.scriptsSecret` | Secret with scripts to be run at first boot (in case it contains sensitive information) | `""` | +| `primary.initdb.user` | Specify the PostgreSQL username to execute the initdb scripts | `""` | +| `primary.initdb.password` | Specify the PostgreSQL password to execute the initdb scripts | `""` | +| `primary.standby.enabled` | Whether to enable current cluster's primary as standby server of another cluster or not | `false` | +| `primary.standby.primaryHost` | The Host of replication primary in the other cluster | `""` | +| `primary.standby.primaryPort` | The Port of replication primary in the other cluster | `""` | +| `primary.extraEnvVars` | Array with extra environment variables to add to PostgreSQL Primary nodes | `[]` | +| `primary.extraEnvVarsCM` | Name of existing ConfigMap containing extra env vars for PostgreSQL Primary nodes | `""` | +| `primary.extraEnvVarsSecret` | Name of existing Secret containing extra env vars for PostgreSQL Primary nodes | `""` | +| `primary.command` | Override default container command (useful when using custom images) | `[]` | +| `primary.args` | Override default container args (useful when using custom images) | `[]` | +| `primary.livenessProbe.enabled` | Enable livenessProbe on PostgreSQL Primary containers | `true` | +| `primary.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `30` | +| `primary.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `10` | +| `primary.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `5` | +| `primary.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `6` | +| `primary.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` | +| `primary.readinessProbe.enabled` | Enable readinessProbe on PostgreSQL Primary containers | `true` | +| `primary.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `5` | +| `primary.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `10` | +| `primary.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `5` | +| `primary.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `6` | +| `primary.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` | +| `primary.startupProbe.enabled` | Enable startupProbe on PostgreSQL Primary containers | `false` | +| `primary.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `30` | +| `primary.startupProbe.periodSeconds` | Period seconds for startupProbe | `10` | +| `primary.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `1` | +| `primary.startupProbe.failureThreshold` | Failure threshold for startupProbe | `15` | +| `primary.startupProbe.successThreshold` | Success threshold for startupProbe | `1` | +| `primary.customLivenessProbe` | Custom livenessProbe that overrides the default one | `{}` | +| `primary.customReadinessProbe` | Custom readinessProbe that overrides the default one | `{}` | +| `primary.customStartupProbe` | Custom startupProbe that overrides the default one | `{}` | +| `primary.lifecycleHooks` | for the PostgreSQL Primary container to automate configuration before or after startup | `{}` | +| `primary.resources.limits` | The resources limits for the PostgreSQL Primary containers | `{}` | +| `primary.resources.requests.memory` | The requested memory for the PostgreSQL Primary containers | `256Mi` | +| `primary.resources.requests.cpu` | The requested cpu for the PostgreSQL Primary containers | `250m` | +| `primary.podSecurityContext.enabled` | Enable security context | `true` | +| `primary.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | +| `primary.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | +| `primary.podSecurityContext.supplementalGroups` | Set filesystem extra groups | `[]` | +| `primary.podSecurityContext.fsGroup` | Group ID for the pod | `1001` | +| `primary.containerSecurityContext.enabled` | Enabled containers' Security Context | `true` | +| `primary.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | +| `primary.containerSecurityContext.runAsUser` | Set containers' Security Context runAsUser | `1001` | +| `primary.containerSecurityContext.runAsNonRoot` | Set container's Security Context runAsNonRoot | `true` | +| `primary.containerSecurityContext.privileged` | Set container's Security Context privileged | `false` | +| `primary.containerSecurityContext.readOnlyRootFilesystem` | Set container's Security Context readOnlyRootFilesystem | `false` | +| `primary.containerSecurityContext.allowPrivilegeEscalation` | Set container's Security Context allowPrivilegeEscalation | `false` | +| `primary.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped | `["ALL"]` | +| `primary.containerSecurityContext.seccompProfile.type` | Set container's Security Context seccomp profile | `RuntimeDefault` | +| `primary.automountServiceAccountToken` | Mount Service Account token in pod | `false` | +| `primary.hostAliases` | PostgreSQL primary pods host aliases | `[]` | +| `primary.hostNetwork` | Specify if host network should be enabled for PostgreSQL pod (postgresql primary) | `false` | +| `primary.hostIPC` | Specify if host IPC should be enabled for PostgreSQL pod (postgresql primary) | `false` | +| `primary.labels` | Map of labels to add to the statefulset (postgresql primary) | `{}` | +| `primary.annotations` | Annotations for PostgreSQL primary pods | `{}` | +| `primary.podLabels` | Map of labels to add to the pods (postgresql primary) | `{}` | +| `primary.podAnnotations` | Map of annotations to add to the pods (postgresql primary) | `{}` | +| `primary.podAffinityPreset` | PostgreSQL primary pod affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` | `""` | +| `primary.podAntiAffinityPreset` | PostgreSQL primary pod anti-affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` | `soft` | +| `primary.nodeAffinityPreset.type` | PostgreSQL primary node affinity preset type. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` | `""` | +| `primary.nodeAffinityPreset.key` | PostgreSQL primary node label key to match Ignored if `primary.affinity` is set. | `""` | +| `primary.nodeAffinityPreset.values` | PostgreSQL primary node label values to match. Ignored if `primary.affinity` is set. | `[]` | +| `primary.affinity` | Affinity for PostgreSQL primary pods assignment | `{}` | +| `primary.nodeSelector` | Node labels for PostgreSQL primary pods assignment | `{}` | +| `primary.tolerations` | Tolerations for PostgreSQL primary pods assignment | `[]` | +| `primary.topologySpreadConstraints` | Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template | `[]` | +| `primary.priorityClassName` | Priority Class to use for each pod (postgresql primary) | `""` | +| `primary.schedulerName` | Use an alternate scheduler, e.g. "stork". | `""` | +| `primary.terminationGracePeriodSeconds` | Seconds PostgreSQL primary pod needs to terminate gracefully | `""` | +| `primary.updateStrategy.type` | PostgreSQL Primary statefulset strategy type | `RollingUpdate` | +| `primary.updateStrategy.rollingUpdate` | PostgreSQL Primary statefulset rolling update configuration parameters | `{}` | +| `primary.extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for the PostgreSQL Primary container(s) | `[]` | +| `primary.extraVolumes` | Optionally specify extra list of additional volumes for the PostgreSQL Primary pod(s) | `[]` | +| `primary.sidecars` | Add additional sidecar containers to the PostgreSQL Primary pod(s) | `[]` | +| `primary.initContainers` | Add additional init containers to the PostgreSQL Primary pod(s) | `[]` | +| `primary.extraPodSpec` | Optionally specify extra PodSpec for the PostgreSQL Primary pod(s) | `{}` | +| `primary.service.type` | Kubernetes Service type | `ClusterIP` | +| `primary.service.ports.postgresql` | PostgreSQL service port | `5432` | +| `primary.service.nodePorts.postgresql` | Node port for PostgreSQL | `""` | +| `primary.service.clusterIP` | Static clusterIP or None for headless services | `""` | +| `primary.service.annotations` | Annotations for PostgreSQL primary service | `{}` | +| `primary.service.loadBalancerIP` | Load balancer IP if service type is `LoadBalancer` | `""` | +| `primary.service.externalTrafficPolicy` | Enable client source IP preservation | `Cluster` | +| `primary.service.loadBalancerSourceRanges` | Addresses that are allowed when service is LoadBalancer | `[]` | +| `primary.service.extraPorts` | Extra ports to expose in the PostgreSQL primary service | `[]` | +| `primary.service.sessionAffinity` | Session Affinity for Kubernetes service, can be "None" or "ClientIP" | `None` | +| `primary.service.sessionAffinityConfig` | Additional settings for the sessionAffinity | `{}` | +| `primary.service.headless.annotations` | Additional custom annotations for headless PostgreSQL primary service | `{}` | +| `primary.persistence.enabled` | Enable PostgreSQL Primary data persistence using PVC | `true` | +| `primary.persistence.existingClaim` | Name of an existing PVC to use | `""` | +| `primary.persistence.mountPath` | The path the volume will be mounted at | `/bitnami/postgresql` | +| `primary.persistence.subPath` | The subdirectory of the volume to mount to | `""` | +| `primary.persistence.storageClass` | PVC Storage Class for PostgreSQL Primary data volume | `""` | +| `primary.persistence.accessModes` | PVC Access Mode for PostgreSQL volume | `["ReadWriteOnce"]` | +| `primary.persistence.size` | PVC Storage Request for PostgreSQL volume | `8Gi` | +| `primary.persistence.annotations` | Annotations for the PVC | `{}` | +| `primary.persistence.labels` | Labels for the PVC | `{}` | +| `primary.persistence.selector` | Selector to match an existing Persistent Volume (this value is evaluated as a template) | `{}` | +| `primary.persistence.dataSource` | Custom PVC data source | `{}` | +| `primary.persistentVolumeClaimRetentionPolicy.enabled` | Enable Persistent volume retention policy for Primary Statefulset | `false` | +| `primary.persistentVolumeClaimRetentionPolicy.whenScaled` | Volume retention behavior when the replica count of the StatefulSet is reduced | `Retain` | +| `primary.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted | `Retain` | + +### PostgreSQL read only replica parameters (only used when `architecture` is set to `replication`) + +| Name | Description | Value | +| ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | --------------------- | +| `readReplicas.name` | Name of the read replicas database (eg secondary, slave, ...) | `read` | +| `readReplicas.replicaCount` | Number of PostgreSQL read only replicas | `1` | +| `readReplicas.extendedConfiguration` | Extended PostgreSQL read only replicas configuration (appended to main or default configuration) | `""` | +| `readReplicas.extraEnvVars` | Array with extra environment variables to add to PostgreSQL read only nodes | `[]` | +| `readReplicas.extraEnvVarsCM` | Name of existing ConfigMap containing extra env vars for PostgreSQL read only nodes | `""` | +| `readReplicas.extraEnvVarsSecret` | Name of existing Secret containing extra env vars for PostgreSQL read only nodes | `""` | +| `readReplicas.command` | Override default container command (useful when using custom images) | `[]` | +| `readReplicas.args` | Override default container args (useful when using custom images) | `[]` | +| `readReplicas.livenessProbe.enabled` | Enable livenessProbe on PostgreSQL read only containers | `true` | +| `readReplicas.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `30` | +| `readReplicas.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `10` | +| `readReplicas.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `5` | +| `readReplicas.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `6` | +| `readReplicas.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` | +| `readReplicas.readinessProbe.enabled` | Enable readinessProbe on PostgreSQL read only containers | `true` | +| `readReplicas.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `5` | +| `readReplicas.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `10` | +| `readReplicas.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `5` | +| `readReplicas.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `6` | +| `readReplicas.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` | +| `readReplicas.startupProbe.enabled` | Enable startupProbe on PostgreSQL read only containers | `false` | +| `readReplicas.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `30` | +| `readReplicas.startupProbe.periodSeconds` | Period seconds for startupProbe | `10` | +| `readReplicas.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `1` | +| `readReplicas.startupProbe.failureThreshold` | Failure threshold for startupProbe | `15` | +| `readReplicas.startupProbe.successThreshold` | Success threshold for startupProbe | `1` | +| `readReplicas.customLivenessProbe` | Custom livenessProbe that overrides the default one | `{}` | +| `readReplicas.customReadinessProbe` | Custom readinessProbe that overrides the default one | `{}` | +| `readReplicas.customStartupProbe` | Custom startupProbe that overrides the default one | `{}` | +| `readReplicas.lifecycleHooks` | for the PostgreSQL read only container to automate configuration before or after startup | `{}` | +| `readReplicas.resources.limits` | The resources limits for the PostgreSQL read only containers | `{}` | +| `readReplicas.resources.requests.memory` | The requested memory for the PostgreSQL read only containers | `256Mi` | +| `readReplicas.resources.requests.cpu` | The requested cpu for the PostgreSQL read only containers | `250m` | +| `readReplicas.podSecurityContext.enabled` | Enable security context | `true` | +| `readReplicas.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | +| `readReplicas.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | +| `readReplicas.podSecurityContext.supplementalGroups` | Set filesystem extra groups | `[]` | +| `readReplicas.podSecurityContext.fsGroup` | Group ID for the pod | `1001` | +| `readReplicas.containerSecurityContext.enabled` | Enabled containers' Security Context | `true` | +| `readReplicas.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | +| `readReplicas.containerSecurityContext.runAsUser` | Set containers' Security Context runAsUser | `1001` | +| `readReplicas.containerSecurityContext.runAsNonRoot` | Set container's Security Context runAsNonRoot | `true` | +| `readReplicas.containerSecurityContext.privileged` | Set container's Security Context privileged | `false` | +| `readReplicas.containerSecurityContext.readOnlyRootFilesystem` | Set container's Security Context readOnlyRootFilesystem | `false` | +| `readReplicas.containerSecurityContext.allowPrivilegeEscalation` | Set container's Security Context allowPrivilegeEscalation | `false` | +| `readReplicas.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped | `["ALL"]` | +| `readReplicas.containerSecurityContext.seccompProfile.type` | Set container's Security Context seccomp profile | `RuntimeDefault` | +| `readReplicas.automountServiceAccountToken` | Mount Service Account token in pod | `false` | +| `readReplicas.hostAliases` | PostgreSQL read only pods host aliases | `[]` | +| `readReplicas.hostNetwork` | Specify if host network should be enabled for PostgreSQL pod (PostgreSQL read only) | `false` | +| `readReplicas.hostIPC` | Specify if host IPC should be enabled for PostgreSQL pod (postgresql primary) | `false` | +| `readReplicas.labels` | Map of labels to add to the statefulset (PostgreSQL read only) | `{}` | +| `readReplicas.annotations` | Annotations for PostgreSQL read only pods | `{}` | +| `readReplicas.podLabels` | Map of labels to add to the pods (PostgreSQL read only) | `{}` | +| `readReplicas.podAnnotations` | Map of annotations to add to the pods (PostgreSQL read only) | `{}` | +| `readReplicas.podAffinityPreset` | PostgreSQL read only pod affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` | `""` | +| `readReplicas.podAntiAffinityPreset` | PostgreSQL read only pod anti-affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` | `soft` | +| `readReplicas.nodeAffinityPreset.type` | PostgreSQL read only node affinity preset type. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` | `""` | +| `readReplicas.nodeAffinityPreset.key` | PostgreSQL read only node label key to match Ignored if `primary.affinity` is set. | `""` | +| `readReplicas.nodeAffinityPreset.values` | PostgreSQL read only node label values to match. Ignored if `primary.affinity` is set. | `[]` | +| `readReplicas.affinity` | Affinity for PostgreSQL read only pods assignment | `{}` | +| `readReplicas.nodeSelector` | Node labels for PostgreSQL read only pods assignment | `{}` | +| `readReplicas.tolerations` | Tolerations for PostgreSQL read only pods assignment | `[]` | +| `readReplicas.topologySpreadConstraints` | Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template | `[]` | +| `readReplicas.priorityClassName` | Priority Class to use for each pod (PostgreSQL read only) | `""` | +| `readReplicas.schedulerName` | Use an alternate scheduler, e.g. "stork". | `""` | +| `readReplicas.terminationGracePeriodSeconds` | Seconds PostgreSQL read only pod needs to terminate gracefully | `""` | +| `readReplicas.updateStrategy.type` | PostgreSQL read only statefulset strategy type | `RollingUpdate` | +| `readReplicas.updateStrategy.rollingUpdate` | PostgreSQL read only statefulset rolling update configuration parameters | `{}` | +| `readReplicas.extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for the PostgreSQL read only container(s) | `[]` | +| `readReplicas.extraVolumes` | Optionally specify extra list of additional volumes for the PostgreSQL read only pod(s) | `[]` | +| `readReplicas.sidecars` | Add additional sidecar containers to the PostgreSQL read only pod(s) | `[]` | +| `readReplicas.initContainers` | Add additional init containers to the PostgreSQL read only pod(s) | `[]` | +| `readReplicas.extraPodSpec` | Optionally specify extra PodSpec for the PostgreSQL read only pod(s) | `{}` | +| `readReplicas.service.type` | Kubernetes Service type | `ClusterIP` | +| `readReplicas.service.ports.postgresql` | PostgreSQL service port | `5432` | +| `readReplicas.service.nodePorts.postgresql` | Node port for PostgreSQL | `""` | +| `readReplicas.service.clusterIP` | Static clusterIP or None for headless services | `""` | +| `readReplicas.service.annotations` | Annotations for PostgreSQL read only service | `{}` | +| `readReplicas.service.loadBalancerIP` | Load balancer IP if service type is `LoadBalancer` | `""` | +| `readReplicas.service.externalTrafficPolicy` | Enable client source IP preservation | `Cluster` | +| `readReplicas.service.loadBalancerSourceRanges` | Addresses that are allowed when service is LoadBalancer | `[]` | +| `readReplicas.service.extraPorts` | Extra ports to expose in the PostgreSQL read only service | `[]` | +| `readReplicas.service.sessionAffinity` | Session Affinity for Kubernetes service, can be "None" or "ClientIP" | `None` | +| `readReplicas.service.sessionAffinityConfig` | Additional settings for the sessionAffinity | `{}` | +| `readReplicas.service.headless.annotations` | Additional custom annotations for headless PostgreSQL read only service | `{}` | +| `readReplicas.persistence.enabled` | Enable PostgreSQL read only data persistence using PVC | `true` | +| `readReplicas.persistence.existingClaim` | Name of an existing PVC to use | `""` | +| `readReplicas.persistence.mountPath` | The path the volume will be mounted at | `/bitnami/postgresql` | +| `readReplicas.persistence.subPath` | The subdirectory of the volume to mount to | `""` | +| `readReplicas.persistence.storageClass` | PVC Storage Class for PostgreSQL read only data volume | `""` | +| `readReplicas.persistence.accessModes` | PVC Access Mode for PostgreSQL volume | `["ReadWriteOnce"]` | +| `readReplicas.persistence.size` | PVC Storage Request for PostgreSQL volume | `8Gi` | +| `readReplicas.persistence.annotations` | Annotations for the PVC | `{}` | +| `readReplicas.persistence.labels` | Labels for the PVC | `{}` | +| `readReplicas.persistence.selector` | Selector to match an existing Persistent Volume (this value is evaluated as a template) | `{}` | +| `readReplicas.persistence.dataSource` | Custom PVC data source | `{}` | +| `readReplicas.persistentVolumeClaimRetentionPolicy.enabled` | Enable Persistent volume retention policy for read only Statefulset | `false` | +| `readReplicas.persistentVolumeClaimRetentionPolicy.whenScaled` | Volume retention behavior when the replica count of the StatefulSet is reduced | `Retain` | +| `readReplicas.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted | `Retain` | + +### Backup parameters + +| Name | Description | Value | +| ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `backup.enabled` | Enable the logical dump of the database "regularly" | `false` | +| `backup.cronjob.schedule` | Set the cronjob parameter schedule | `@daily` | +| `backup.cronjob.timeZone` | Set the cronjob parameter timeZone | `""` | +| `backup.cronjob.concurrencyPolicy` | Set the cronjob parameter concurrencyPolicy | `Allow` | +| `backup.cronjob.failedJobsHistoryLimit` | Set the cronjob parameter failedJobsHistoryLimit | `1` | +| `backup.cronjob.successfulJobsHistoryLimit` | Set the cronjob parameter successfulJobsHistoryLimit | `3` | +| `backup.cronjob.startingDeadlineSeconds` | Set the cronjob parameter startingDeadlineSeconds | `""` | +| `backup.cronjob.ttlSecondsAfterFinished` | Set the cronjob parameter ttlSecondsAfterFinished | `""` | +| `backup.cronjob.restartPolicy` | Set the cronjob parameter restartPolicy | `OnFailure` | +| `backup.cronjob.podSecurityContext.enabled` | Enable PodSecurityContext for CronJob/Backup | `true` | +| `backup.cronjob.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | +| `backup.cronjob.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | +| `backup.cronjob.podSecurityContext.supplementalGroups` | Set filesystem extra groups | `[]` | +| `backup.cronjob.podSecurityContext.fsGroup` | Group ID for the CronJob | `1001` | +| `backup.cronjob.containerSecurityContext.enabled` | Enabled containers' Security Context | `true` | +| `backup.cronjob.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | +| `backup.cronjob.containerSecurityContext.runAsUser` | Set containers' Security Context runAsUser | `1001` | +| `backup.cronjob.containerSecurityContext.runAsNonRoot` | Set container's Security Context runAsNonRoot | `true` | +| `backup.cronjob.containerSecurityContext.privileged` | Set container's Security Context privileged | `false` | +| `backup.cronjob.containerSecurityContext.readOnlyRootFilesystem` | Set container's Security Context readOnlyRootFilesystem | `false` | +| `backup.cronjob.containerSecurityContext.allowPrivilegeEscalation` | Set container's Security Context allowPrivilegeEscalation | `false` | +| `backup.cronjob.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped | `["ALL"]` | +| `backup.cronjob.containerSecurityContext.seccompProfile.type` | Set container's Security Context seccomp profile | `RuntimeDefault` | +| `backup.cronjob.command` | Set backup container's command to run | `["/bin/sh","-c","pg_dumpall --clean --if-exists --load-via-partition-root --quote-all-identifiers --no-password --file=${PGDUMP_DIR}/pg_dumpall-$(date '+%Y-%m-%d-%H-%M').pgdump"]` | +| `backup.cronjob.labels` | Set the cronjob labels | `{}` | +| `backup.cronjob.annotations` | Set the cronjob annotations | `{}` | +| `backup.cronjob.nodeSelector` | Node labels for PostgreSQL backup CronJob pod assignment | `{}` | +| `backup.cronjob.storage.existingClaim` | Provide an existing `PersistentVolumeClaim` (only when `architecture=standalone`) | `""` | +| `backup.cronjob.storage.resourcePolicy` | Setting it to "keep" to avoid removing PVCs during a helm delete operation. Leaving it empty will delete PVCs after the chart deleted | `""` | +| `backup.cronjob.storage.storageClass` | PVC Storage Class for the backup data volume | `""` | +| `backup.cronjob.storage.accessModes` | PV Access Mode | `["ReadWriteOnce"]` | +| `backup.cronjob.storage.size` | PVC Storage Request for the backup data volume | `8Gi` | +| `backup.cronjob.storage.annotations` | PVC annotations | `{}` | +| `backup.cronjob.storage.mountPath` | Path to mount the volume at | `/backup/pgdump` | +| `backup.cronjob.storage.subPath` | Subdirectory of the volume to mount at | `""` | +| `backup.cronjob.storage.volumeClaimTemplates.selector` | A label query over volumes to consider for binding (e.g. when using local volumes) | `{}` | + +### NetworkPolicy parameters + +| Name | Description | Value | +| ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | +| `networkPolicy.enabled` | Enable network policies | `false` | +| `networkPolicy.metrics.enabled` | Enable network policies for metrics (prometheus) | `false` | +| `networkPolicy.metrics.namespaceSelector` | Monitoring namespace selector labels. These labels will be used to identify the prometheus' namespace. | `{}` | +| `networkPolicy.metrics.podSelector` | Monitoring pod selector labels. These labels will be used to identify the Prometheus pods. | `{}` | +| `networkPolicy.ingressRules.primaryAccessOnlyFrom.enabled` | Enable ingress rule that makes PostgreSQL primary node only accessible from a particular origin. | `false` | +| `networkPolicy.ingressRules.primaryAccessOnlyFrom.namespaceSelector` | Namespace selector label that is allowed to access the PostgreSQL primary node. This label will be used to identified the allowed namespace(s). | `{}` | +| `networkPolicy.ingressRules.primaryAccessOnlyFrom.podSelector` | Pods selector label that is allowed to access the PostgreSQL primary node. This label will be used to identified the allowed pod(s). | `{}` | +| `networkPolicy.ingressRules.primaryAccessOnlyFrom.customRules` | Custom network policy for the PostgreSQL primary node. | `[]` | +| `networkPolicy.ingressRules.readReplicasAccessOnlyFrom.enabled` | Enable ingress rule that makes PostgreSQL read-only nodes only accessible from a particular origin. | `false` | +| `networkPolicy.ingressRules.readReplicasAccessOnlyFrom.namespaceSelector` | Namespace selector label that is allowed to access the PostgreSQL read-only nodes. This label will be used to identified the allowed namespace(s). | `{}` | +| `networkPolicy.ingressRules.readReplicasAccessOnlyFrom.podSelector` | Pods selector label that is allowed to access the PostgreSQL read-only nodes. This label will be used to identified the allowed pod(s). | `{}` | +| `networkPolicy.ingressRules.readReplicasAccessOnlyFrom.customRules` | Custom network policy for the PostgreSQL read-only nodes. | `[]` | +| `networkPolicy.egressRules.denyConnectionsToExternal` | Enable egress rule that denies outgoing traffic outside the cluster, except for DNS (port 53). | `false` | +| `networkPolicy.egressRules.customRules` | Custom network policy rule | `[]` | + +### Volume Permissions parameters + +| Name | Description | Value | +| ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | -------------------------- | +| `volumePermissions.enabled` | Enable init container that changes the owner and group of the persistent volume | `false` | +| `volumePermissions.image.registry` | Init container volume-permissions image registry | `REGISTRY_NAME` | +| `volumePermissions.image.repository` | Init container volume-permissions image repository | `REPOSITORY_NAME/os-shell` | +| `volumePermissions.image.digest` | Init container volume-permissions image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | +| `volumePermissions.image.pullPolicy` | Init container volume-permissions image pull policy | `IfNotPresent` | +| `volumePermissions.image.pullSecrets` | Init container volume-permissions image pull secrets | `[]` | +| `volumePermissions.resources.limits` | Init container volume-permissions resource limits | `{}` | +| `volumePermissions.resources.requests` | Init container volume-permissions resource requests | `{}` | +| `volumePermissions.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | +| `volumePermissions.containerSecurityContext.runAsUser` | User ID for the init container | `0` | +| `volumePermissions.containerSecurityContext.runAsGroup` | Group ID for the init container | `0` | +| `volumePermissions.containerSecurityContext.runAsNonRoot` | runAsNonRoot for the init container | `false` | +| `volumePermissions.containerSecurityContext.seccompProfile.type` | seccompProfile.type for the init container | `RuntimeDefault` | + +### Other Parameters + +| Name | Description | Value | +| --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------- | +| `serviceBindings.enabled` | Create secret for service binding (Experimental) | `false` | +| `serviceAccount.create` | Enable creation of ServiceAccount for PostgreSQL pod | `true` | +| `serviceAccount.name` | The name of the ServiceAccount to use. | `""` | +| `serviceAccount.automountServiceAccountToken` | Allows auto mount of ServiceAccountToken on the serviceAccount created | `false` | +| `serviceAccount.annotations` | Additional custom annotations for the ServiceAccount | `{}` | +| `rbac.create` | Create Role and RoleBinding (required for PSP to work) | `false` | +| `rbac.rules` | Custom RBAC rules to set | `[]` | +| `psp.create` | Whether to create a PodSecurityPolicy. WARNING: PodSecurityPolicy is deprecated in Kubernetes v1.21 or later, unavailable in v1.25 or later | `false` | + +### Metrics Parameters + +| Name | Description | Value | +| ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ----------------------------------- | +| `metrics.enabled` | Start a prometheus exporter | `false` | +| `metrics.image.registry` | PostgreSQL Prometheus Exporter image registry | `REGISTRY_NAME` | +| `metrics.image.repository` | PostgreSQL Prometheus Exporter image repository | `REPOSITORY_NAME/postgres-exporter` | +| `metrics.image.digest` | PostgreSQL image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | +| `metrics.image.pullPolicy` | PostgreSQL Prometheus Exporter image pull policy | `IfNotPresent` | +| `metrics.image.pullSecrets` | Specify image pull secrets | `[]` | +| `metrics.collectors` | Control enabled collectors | `{}` | +| `metrics.customMetrics` | Define additional custom metrics | `{}` | +| `metrics.extraEnvVars` | Extra environment variables to add to PostgreSQL Prometheus exporter | `[]` | +| `metrics.containerSecurityContext.enabled` | Enabled containers' Security Context | `true` | +| `metrics.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | +| `metrics.containerSecurityContext.runAsUser` | Set containers' Security Context runAsUser | `1001` | +| `metrics.containerSecurityContext.runAsNonRoot` | Set container's Security Context runAsNonRoot | `true` | +| `metrics.containerSecurityContext.privileged` | Set container's Security Context privileged | `false` | +| `metrics.containerSecurityContext.readOnlyRootFilesystem` | Set container's Security Context readOnlyRootFilesystem | `false` | +| `metrics.containerSecurityContext.allowPrivilegeEscalation` | Set container's Security Context allowPrivilegeEscalation | `false` | +| `metrics.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped | `["ALL"]` | +| `metrics.containerSecurityContext.seccompProfile.type` | Set container's Security Context seccomp profile | `RuntimeDefault` | +| `metrics.livenessProbe.enabled` | Enable livenessProbe on PostgreSQL Prometheus exporter containers | `true` | +| `metrics.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `5` | +| `metrics.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `10` | +| `metrics.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `5` | +| `metrics.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `6` | +| `metrics.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` | +| `metrics.readinessProbe.enabled` | Enable readinessProbe on PostgreSQL Prometheus exporter containers | `true` | +| `metrics.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `5` | +| `metrics.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `10` | +| `metrics.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `5` | +| `metrics.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `6` | +| `metrics.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` | +| `metrics.startupProbe.enabled` | Enable startupProbe on PostgreSQL Prometheus exporter containers | `false` | +| `metrics.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `10` | +| `metrics.startupProbe.periodSeconds` | Period seconds for startupProbe | `10` | +| `metrics.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `1` | +| `metrics.startupProbe.failureThreshold` | Failure threshold for startupProbe | `15` | +| `metrics.startupProbe.successThreshold` | Success threshold for startupProbe | `1` | +| `metrics.customLivenessProbe` | Custom livenessProbe that overrides the default one | `{}` | +| `metrics.customReadinessProbe` | Custom readinessProbe that overrides the default one | `{}` | +| `metrics.customStartupProbe` | Custom startupProbe that overrides the default one | `{}` | +| `metrics.containerPorts.metrics` | PostgreSQL Prometheus exporter metrics container port | `9187` | +| `metrics.resources.limits` | The resources limits for the PostgreSQL Prometheus exporter container | `{}` | +| `metrics.resources.requests` | The requested resources for the PostgreSQL Prometheus exporter container | `{}` | +| `metrics.service.ports.metrics` | PostgreSQL Prometheus Exporter service port | `9187` | +| `metrics.service.clusterIP` | Static clusterIP or None for headless services | `""` | +| `metrics.service.sessionAffinity` | Control where client requests go, to the same pod or round-robin | `None` | +| `metrics.service.annotations` | Annotations for Prometheus to auto-discover the metrics endpoint | `{}` | +| `metrics.serviceMonitor.enabled` | Create ServiceMonitor Resource for scraping metrics using Prometheus Operator | `false` | +| `metrics.serviceMonitor.namespace` | Namespace for the ServiceMonitor Resource (defaults to the Release Namespace) | `""` | +| `metrics.serviceMonitor.interval` | Interval at which metrics should be scraped. | `""` | +| `metrics.serviceMonitor.scrapeTimeout` | Timeout after which the scrape is ended | `""` | +| `metrics.serviceMonitor.labels` | Additional labels that can be used so ServiceMonitor will be discovered by Prometheus | `{}` | +| `metrics.serviceMonitor.selector` | Prometheus instance selector labels | `{}` | +| `metrics.serviceMonitor.relabelings` | RelabelConfigs to apply to samples before scraping | `[]` | +| `metrics.serviceMonitor.metricRelabelings` | MetricRelabelConfigs to apply to samples before ingestion | `[]` | +| `metrics.serviceMonitor.honorLabels` | Specify honorLabels parameter to add the scrape endpoint | `false` | +| `metrics.serviceMonitor.jobLabel` | The name of the label on the target service to use as the job name in prometheus. | `""` | +| `metrics.prometheusRule.enabled` | Create a PrometheusRule for Prometheus Operator | `false` | +| `metrics.prometheusRule.namespace` | Namespace for the PrometheusRule Resource (defaults to the Release Namespace) | `""` | +| `metrics.prometheusRule.labels` | Additional labels that can be used so PrometheusRule will be discovered by Prometheus | `{}` | +| `metrics.prometheusRule.rules` | PrometheusRule definitions | `[]` | + +Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example, + +```console +helm install my-release \ + --set auth.postgresPassword=secretpassword + oci://REGISTRY_NAME/REPOSITORY_NAME/postgresql +``` + +> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. + +The above command sets the PostgreSQL `postgres` account password to `secretpassword`. + +> NOTE: Once this chart is deployed, it is not possible to change the application's access credentials, such as usernames or passwords, using Helm. To change these application credentials after deployment, delete any persistent volumes (PVs) used by the chart and re-deploy it, or use the application's built-in administrative tools if available. +> **Warning** Setting a password will be ignored on new installation in case when previous PostgreSQL release was deleted through the helm command. In that case, old PVC will have an old password, and setting it through helm won't take effect. Deleting persistent volumes (PVs) will solve the issue. Refer to [issue 2061](https://github.com/bitnami/charts/issues/2061) for more details + +Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example, + +```console +helm install my-release -f values.yaml oci://REGISTRY_NAME/REPOSITORY_NAME/postgresql +``` + +> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. +> **Tip**: You can use the default [values.yaml](https://github.com/bitnami/charts/tree/main/bitnami/postgresql/values.yaml) + +## Configuration and installation details + +### [Rolling VS Immutable tags](https://docs.bitnami.com/tutorials/understand-rolling-tags-containers) + +It is strongly recommended to use immutable tags in a production environment. This ensures your deployment does not change automatically if the same tag is updated with a different image. + +Bitnami will release a new chart updating its containers if a new version of the main container, significant changes, or critical vulnerabilities exist. + +### Customizing primary and read replica services in a replicated configuration + +At the top level, there is a service object which defines the services for both primary and readReplicas. For deeper customization, there are service objects for both the primary and read types individually. This allows you to override the values in the top level service object so that the primary and read can be of different service types and with different clusterIPs / nodePorts. Also in the case you want the primary and read to be of type nodePort, you will need to set the nodePorts to different values to prevent a collision. The values that are deeper in the primary.service or readReplicas.service objects will take precedence over the top level service object. + +### Use a different PostgreSQL version + +To modify the application version used in this chart, specify a different version of the image using the `image.tag` parameter and/or a different repository using the `image.repository` parameter. + +### LDAP + +LDAP support can be enabled in the chart by specifying the `ldap.` parameters while creating a release. The following parameters should be configured to properly enable the LDAP support in the chart. + +- **ldap.enabled**: Enable LDAP support. Defaults to `false`. +- **ldap.uri**: LDAP URL beginning in the form `ldap[s]://:`. No defaults. +- **ldap.base**: LDAP base DN. No defaults. +- **ldap.binddn**: LDAP bind DN. No defaults. +- **ldap.bindpw**: LDAP bind password. No defaults. +- **ldap.bslookup**: LDAP base lookup. No defaults. +- **ldap.nss_initgroups_ignoreusers**: LDAP ignored users. `root,nslcd`. +- **ldap.scope**: LDAP search scope. No defaults. +- **ldap.tls_reqcert**: LDAP TLS check on server certificates. No defaults. + +For example: + +```text +ldap.enabled="true" +ldap.uri="ldap://my_ldap_server" +ldap.base="dc=example\,dc=org" +ldap.binddn="cn=admin\,dc=example\,dc=org" +ldap.bindpw="admin" +ldap.bslookup="ou=group-ok\,dc=example\,dc=org" +ldap.nss_initgroups_ignoreusers="root\,nslcd" +ldap.scope="sub" +ldap.tls_reqcert="demand" +``` + +Next, login to the PostgreSQL server using the `psql` client and add the PAM authenticated LDAP users. + +> Note: Parameters including commas must be escaped as shown in the above example. + +### postgresql.conf / pg_hba.conf files as configMap + +This helm chart also supports to customize the PostgreSQL configuration file. You can add additional PostgreSQL configuration parameters using the `primary.extendedConfiguration`/`readReplicas.extendedConfiguration` parameters as a string. Alternatively, to replace the entire default configuration use `primary.configuration`. + +You can also add a custom pg_hba.conf using the `primary.pgHbaConfiguration` parameter. + +In addition to these options, you can also set an external ConfigMap with all the configuration files. This is done by setting the `primary.existingConfigmap` parameter. Note that this will override the two previous options. + +### Initialize a fresh instance + +The [Bitnami PostgreSQL](https://github.com/bitnami/containers/tree/main/bitnami/postgresql) image allows you to use your custom scripts to initialize a fresh instance. In order to execute the scripts, you can specify custom scripts using the `primary.initdb.scripts` parameter as a string. + +In addition, you can also set an external ConfigMap with all the initialization scripts. This is done by setting the `primary.initdb.scriptsConfigMap` parameter. Note that this will override the two previous options. If your initialization scripts contain sensitive information such as credentials or passwords, you can use the `primary.initdb.scriptsSecret` parameter. + +The allowed extensions are `.sh`, `.sql` and `.sql.gz`. + +### Securing traffic using TLS + +TLS support can be enabled in the chart by specifying the `tls.` parameters while creating a release. The following parameters should be configured to properly enable the TLS support in the chart: + +- `tls.enabled`: Enable TLS support. Defaults to `false` +- `tls.certificatesSecret`: Name of an existing secret that contains the certificates. No defaults. +- `tls.certFilename`: Certificate filename. No defaults. +- `tls.certKeyFilename`: Certificate key filename. No defaults. + +For example: + +- First, create the secret with the cetificates files: + + ```console + kubectl create secret generic certificates-tls-secret --from-file=./cert.crt --from-file=./cert.key --from-file=./ca.crt + ``` + +- Then, use the following parameters: + + ```console + volumePermissions.enabled=true + tls.enabled=true + tls.certificatesSecret="certificates-tls-secret" + tls.certFilename="cert.crt" + tls.certKeyFilename="cert.key" + ``` + + > Note TLS and VolumePermissions: PostgreSQL requires certain permissions on sensitive files (such as certificate keys) to start up. Due to an on-going [issue](https://github.com/kubernetes/kubernetes/issues/57923) regarding kubernetes permissions and the use of `containerSecurityContext.runAsUser`, you must enable `volumePermissions` to ensure everything works as expected. + +### Sidecars + +If you need additional containers to run within the same pod as PostgreSQL (e.g. an additional metrics or logging exporter), you can do so via the `sidecars` config parameter. Simply define your container according to the Kubernetes container spec. + +```yaml +# For the PostgreSQL primary +primary: + sidecars: + - name: your-image-name + image: your-image + imagePullPolicy: Always + ports: + - name: portname + containerPort: 1234 +# For the PostgreSQL replicas +readReplicas: + sidecars: + - name: your-image-name + image: your-image + imagePullPolicy: Always + ports: + - name: portname + containerPort: 1234 +``` + +### Metrics + +The chart optionally can start a metrics exporter for [prometheus](https://prometheus.io). The metrics endpoint (port 9187) is not exposed and it is expected that the metrics are collected from inside the k8s cluster using something similar as the described in the [example Prometheus scrape configuration](https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus-kubernetes.yml). + +The exporter allows to create custom metrics from additional SQL queries. See the Chart's `values.yaml` for an example and consult the [exporters documentation](https://github.com/wrouesnel/postgres_exporter#adding-new-metrics-via-a-config-file) for more details. + +### Use of global variables + +In more complex scenarios, we may have the following tree of dependencies + +```text + +--------------+ + | | + +------------+ Chart 1 +-----------+ + | | | | + | --------+------+ | + | | | + | | | + | | | + | | | + v v v ++-------+------+ +--------+------+ +--------+------+ +| | | | | | +| PostgreSQL | | Sub-chart 1 | | Sub-chart 2 | +| | | | | | ++--------------+ +---------------+ +---------------+ +``` + +The three charts below depend on the parent chart Chart 1. However, subcharts 1 and 2 may need to connect to PostgreSQL as well. In order to do so, subcharts 1 and 2 need to know the PostgreSQL credentials, so one option for deploying could be deploy Chart 1 with the following parameters: + +```text +postgresql.auth.username=testuser +subchart1.postgresql.auth.username=testuser +subchart2.postgresql.auth.username=testuser +postgresql.auth.password=testpass +subchart1.postgresql.auth.password=testpass +subchart2.postgresql.auth.password=testpass +postgresql.auth.database=testdb +subchart1.postgresql.auth.database=testdb +subchart2.postgresql.auth.database=testdb +``` + +If the number of dependent sub-charts increases, installing the chart with parameters can become increasingly difficult. An alternative would be to set the credentials using global variables as follows: + +```text +global.postgresql.auth.username=testuser +global.postgresql.auth.password=testpass +global.postgresql.auth.database=testdb +``` + +This way, the credentials will be available in all of the subcharts. + +### Persistence + +The [Bitnami PostgreSQL](https://github.com/bitnami/containers/tree/main/bitnami/postgresql) image stores the PostgreSQL data and configurations at the `/bitnami/postgresql` path of the container. + +Persistent Volume Claims are used to keep the data across deployments. This is known to work in GCE, AWS, and minikube. +See the [Parameters](#parameters) section to configure the PVC or to disable persistence. + +If you already have data in it, you will fail to sync to standby nodes for all commits, details can refer to the [code present in the container repository](https://github.com/bitnami/containers/tree/main/bitnami/postgresql). If you need to use those data, please covert them to sql and import after `helm install` finished. + +### Backup and restore PostgreSQL deployments + +To back up and restore Bitnami PostgreSQL Helm chart deployments on Kubernetes, you need to back up the persistent volumes from the source deployment and attach them to a new deployment using [Velero](https://velero.io/), a Kubernetes backup/restore tool. + +These are the steps you will usually follow to back up and restore your PostgreSQL cluster data: + +- Install Velero on the source and destination clusters. +- Use Velero to back up the PersistentVolumes (PVs) used by the deployment on the source cluster. +- Use Velero to restore the backed-up PVs on the destination cluster. +- Create a new deployment on the destination cluster with the same chart, deployment name, credentials and other parameters as the original. This new deployment will use the restored PVs and hence the original data. + +Refer to our detailed [tutorial on backing up and restoring PostgreSQL deployments on Kubernetes](https://docs.bitnami.com/tutorials/migrate-data-bitnami-velero/) for more information. + +### NetworkPolicy + +To enable network policy for PostgreSQL, install [a networking plugin that implements the Kubernetes NetworkPolicy spec](https://kubernetes.io/docs/tasks/administer-cluster/declare-network-policy#before-you-begin), and set `networkPolicy.enabled` to `true`. + +For Kubernetes v1.5 & v1.6, you must also turn on NetworkPolicy by setting the DefaultDeny namespace annotation. Note: this will enforce policy for _all_ pods in the namespace: + +```console +kubectl annotate namespace default "net.beta.kubernetes.io/network-policy={\"ingress\":{\"isolation\":\"DefaultDeny\"}}" +``` + +With NetworkPolicy enabled, traffic will be limited to just port 5432. + +For more precise policy, set `networkPolicy.allowExternal=false`. This will only allow pods with the generated client label to connect to PostgreSQL. +This label will be displayed in the output of a successful install. + +### Differences between Bitnami PostgreSQL image and [Docker Official](https://hub.docker.com/_/postgres) image + +- The Docker Official PostgreSQL image does not support replication. If you pass any replication environment variable, this would be ignored. The only environment variables supported by the Docker Official image are POSTGRES_USER, POSTGRES_DB, POSTGRES_PASSWORD, POSTGRES_INITDB_ARGS, POSTGRES_INITDB_WALDIR and PGDATA. All the remaining environment variables are specific to the Bitnami PostgreSQL image. +- The Bitnami PostgreSQL image is non-root by default. This requires that you run the pod with `securityContext` and updates the permissions of the volume with an `initContainer`. A key benefit of this configuration is that the pod follows security best practices and is prepared to run on Kubernetes distributions with hard security constraints like OpenShift. +- For OpenShift up to 4.10, let set the volume permissions, security context, runAsUser and fsGroup automatically by OpenShift and disable the predefined settings of the helm chart: primary.securityContext.enabled=false,primary.containerSecurityContext.enabled=false,volumePermissions.enabled=false,shmVolume.enabled=false +- For OpenShift 4.11 and higher, let set OpenShift the runAsUser and fsGroup automatically. Configure the pod and container security context to restrictive defaults and disable the volume permissions setup: primary. + podSecurityContext.fsGroup=null,primary.podSecurityContext.seccompProfile.type=RuntimeDefault,primary.containerSecurityContext.runAsUser=null,primary.containerSecurityContext.allowPrivilegeEscalation=false,primary.containerSecurityContext.runAsNonRoot=true,primary.containerSecurityContext.seccompProfile.type=RuntimeDefault,primary.containerSecurityContext.capabilities.drop=['ALL'],volumePermissions.enabled=false,shmVolume.enabled=false + +### Setting Pod's affinity + +This chart allows you to set your custom affinity using the `XXX.affinity` parameter(s). Find more information about Pod's affinity in the [kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity). + +As an alternative, you can use of the preset configurations for pod affinity, pod anti-affinity, and node affinity available at the [bitnami/common](https://github.com/bitnami/charts/tree/main/bitnami/common#affinities) chart. To do so, set the `XXX.podAffinityPreset`, `XXX.podAntiAffinityPreset`, or `XXX.nodeAffinityPreset` parameters. + +## Troubleshooting + +Find more information about how to deal with common errors related to Bitnami's Helm charts in [this troubleshooting guide](https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues). + +## Upgrading + +### To 13.0.0 + +This major version changes the default PostgreSQL image from 15.x to 16.x. Follow the [official instructions](https://www.postgresql.org/docs/16/upgrading.html) to upgrade to 16.x. + +### To 12.0.0 + +This major version changes the default PostgreSQL image from 14.x to 15.x. Follow the [official instructions](https://www.postgresql.org/docs/15/upgrading.html) to upgrade to 15.x. + +### To 11.0.0 + +In this version the application version was bumped to _14.x_ series. Also, this major release renames several values in this chart and adds missing features, in order to be inline with the rest of assets in the Bitnami charts repository. + +- _replication.enabled_ parameter is deprecated in favor of _architecture_ parameter that accepts two values: _standalone_ and _replication_. +- _replication.singleService_ and _replication.uniqueServices_ parameters are deprecated. When using replication, each statefulset (primary and read-only) has its own headless service & service allowing to connect to read-only replicas through the service (round-robin) or individually. +- _postgresqlPostgresPassword_, _postgresqlUsername_, _postgresqlPassword_, _postgresqlDatabase_, _replication.user_, _replication.password_, and _existingSecret_ parameters have been regrouped under the _auth_ map. The _auth_ map uses a new perspective to configure authentication, so please read carefully each sub-parameter description. +- _extraEnv_ has been deprecated in favor of _primary.extraEnvVars_ and _readReplicas.extraEnvVars_. +- _postgresqlConfiguration_, _pgHbaConfiguration_, _configurationConfigMap_, _postgresqlExtendedConf_, and _extendedConfConfigMap_ have been deprecated in favor of _primary.configuration_, _primary.pgHbaConfiguration_, _primary.existingConfigmap_, _primary.extendedConfiguration_, and _primary.existingExtendedConfigmap_. +- _postgresqlInitdbArgs_, _postgresqlInitdbWalDir_, _initdbScripts_, _initdbScriptsConfigMap_, _initdbScriptsSecret_, _initdbUser_ and _initdbPassword_ have been regrouped under the _primary.initdb_ map. +- _postgresqlMaxConnections_, _postgresqlPostgresConnectionLimit_, _postgresqlDbUserConnectionLimit_, _postgresqlTcpKeepalivesInterval_, _postgresqlTcpKeepalivesIdle_, _postgresqlTcpKeepalivesCount_, _postgresqlStatementTimeout_ and _postgresqlPghbaRemoveFilters_ parameters are deprecated. Use _XXX.extraEnvVars_ instead. +- _primaryAsStandBy_ has been deprecated in favor of _primary.standby_. +- _securityContext_ and _containerSecurityContext_ have been deprecated in favor of _primary.podSecurityContext_, _primary.containerSecurityContext_, _readReplicas.podSecurityContext_, and _readReplicas.containerSecurityContext_. +- _livenessProbe_ and _readinessProbe_ maps have been deprecated in favor of _primary.livenessProbe_, _primary.readinessProbe_, _readReplicas.livenessProbe_ and _readReplicas.readinessProbe_ maps. +- _persistence_ map has been deprecated in favor of _primary.persistence_ and _readReplicas.persistence_ maps. +- _networkPolicy_ map has been completely refactored. +- _service_ map has been deprecated in favor of _primary.service_ and _readReplicas.service_ maps. +- _metrics.service.port_ has been regrouped under the _metrics.service.ports_ map. +- _serviceAccount.enabled_ and _serviceAccount.autoMount_ have been deprecated in favor of _serviceAccount.create_ and _serviceAccount.automountServiceAccountToken_. + +#### How to upgrade to version 11.0.0 + +To upgrade to _11.0.0_ from _10.x_, it should be done reusing the PVC(s) used to hold the PostgreSQL data on your previous release. To do so, follow the instructions below (the following example assumes that the release name is _postgresql_): + +> NOTE: Please, create a backup of your database before running any of these actions. + +1. Obtain the credentials and the names of the PVCs used to hold the PostgreSQL data on your current release: + +```console +export POSTGRESQL_PASSWORD=$(kubectl get secret --namespace default postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode) +export POSTGRESQL_PVC=$(kubectl get pvc -l app.kubernetes.io/instance=postgresql,role=primary -o jsonpath="{.items[0].metadata.name}") +``` + +1. Delete the PostgreSQL statefulset (notice the option _--cascade=false_) and secret: + +```console +kubectl delete statefulsets.apps postgresql-postgresql --namespace default --cascade=false +kubectl delete secret postgresql --namespace default +``` + +1. Upgrade your release using the same PostgreSQL version: + +```console +CURRENT_VERSION=$(kubectl exec postgresql-postgresql-0 -- bash -c 'echo $BITNAMI_IMAGE_VERSION') +helm upgrade postgresql bitnami/postgresql \ + --set auth.postgresPassword=$POSTGRESQL_PASSWORD \ + --set primary.persistence.existingClaim=$POSTGRESQL_PVC \ + --set image.tag=$CURRENT_VERSION +``` + +1. You will have to delete the existing PostgreSQL pod and the new statefulset is going to create a new one + +```console +kubectl delete pod postgresql-postgresql-0 +``` + +1. Finally, you should see the lines below in PostgreSQL container logs: + +```text +$ kubectl logs $(kubectl get pods -l app.kubernetes.io/instance=postgresql,app.kubernetes.io/name=postgresql,app.kubernetes.io/component=primary -o jsonpath="{.items[0].metadata.name}") +... +postgresql 08:05:12.59 INFO ==> Deploying PostgreSQL with persisted data... +... +``` + +> NOTE: the instructions above reuse the same PostgreSQL version you were using in your chart release. Otherwise, you will find an error such as the one below when upgrading since the new chart major version also bumps the application version. To workaround this issue you need to upgrade database, please refer to the [official PostgreSQL documentation](https://www.postgresql.org/docs/current/upgrading.html) for more information about this. + +```console +$ kubectl logs $(kubectl get pods -l app.kubernetes.io/instance=postgresql,app.kubernetes.io/name=postgresql,app.kubernetes.io/component=primary -o jsonpath="{.items[0].metadata.name}") + ... +postgresql 08:10:14.72 INFO ==> ** Starting PostgreSQL ** +2022-02-01 08:10:14.734 GMT [1] FATAL: database files are incompatible with server +2022-02-01 08:10:14.734 GMT [1] DETAIL: The data directory was initialized by PostgreSQL version 11, which is not compatible with this version 14.1. +``` + +### To 10.0.0 + +[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. + +- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. +- Move dependency information from the _requirements.yaml_ to the _Chart.yaml_ +- After running _helm dependency update_, a _Chart.lock_ file is generated containing the same structure used in the previous _requirements.lock_ +- The different fields present in the _Chart.yaml_ file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Chart. +- The term _master_ has been replaced with _primary_ and _slave_ with _readReplicas_ throughout the chart. Role names have changed from _master_ and _slave_ to _primary_ and _read_. + +#### Considerations when upgrading to this version + +- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version does not support Helm v2 anymore. +- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3. + +#### Useful links + +- [Bitnami Tutorial](https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues) +- [Helm docs](https://helm.sh/docs/topics/v2_v3_migration) +- [Helm Blog](https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3) + +#### How to upgrade to version 10.0.0 + +To upgrade to _10.0.0_ from _9.x_, it should be done reusing the PVC(s) used to hold the PostgreSQL data on your previous release. To do so, follow the instructions below (the following example assumes that the release name is _postgresql_): + +> NOTE: Please, create a backup of your database before running any of those actions. + +1. Obtain the credentials and the names of the PVCs used to hold the PostgreSQL data on your current release: + +```console +export POSTGRESQL_PASSWORD=$(kubectl get secret --namespace default postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode) +export POSTGRESQL_PVC=$(kubectl get pvc -l app.kubernetes.io/instance=postgresql,role=primary -o jsonpath="{.items[0].metadata.name}") +``` + +1. Delete the PostgreSQL statefulset (notice the option _--cascade=false_): + +```console +kubectl delete statefulsets.apps postgresql-postgresql --namespace default --cascade=false +``` + +1. Upgrade your release using the same PostgreSQL version: + +```console +helm upgrade postgresql bitnami/postgresql \ + --set postgresqlPassword=$POSTGRESQL_PASSWORD \ + --set persistence.existingClaim=$POSTGRESQL_PVC +``` + +1. Delete the existing PostgreSQL pod and the new statefulset will create a new one: + +```console +kubectl delete pod postgresql-postgresql-0 +``` + +1. Finally, you should see the lines below in PostgreSQL container logs: + +```text +$ kubectl logs $(kubectl get pods -l app.kubernetes.io/instance=postgresql,app.kubernetes.io/name=postgresql,role=primary -o jsonpath="{.items[0].metadata.name}") +... +postgresql 08:05:12.59 INFO ==> Deploying PostgreSQL with persisted data... +... +``` + +### To 9.0.0 + +In this version the chart was adapted to follow the [Helm standard labels](https://helm.sh/docs/chart_best_practices/labels/#standard-labels). + +- Some inmutable objects were modified to adopt Helm standard labels introducing backward incompatibilities. + +#### How to upgrade to version 9.0.0 + +To upgrade to _9.0.0_ from _8.x_, it should be done reusing the PVC(s) used to hold the PostgreSQL data on your previous release. To do so, follow the instructions below (the following example assumes that the release name is _postgresql_): + +> NOTE: Please, create a backup of your database before running any of those actions. + +1. Obtain the credentials and the names of the PVCs used to hold the PostgreSQL data on your current release: + +```console +export POSTGRESQL_PASSWORD=$(kubectl get secret --namespace default postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode) +export POSTGRESQL_PVC=$(kubectl get pvc -l app=postgresql,role=master -o jsonpath="{.items[0].metadata.name}") +``` + +1. Delete the PostgreSQL statefulset (notice the option _--cascade=false_): + +```console +kubectl delete statefulsets.apps postgresql-postgresql --namespace default --cascade=false +``` + +1. Upgrade your release using the same PostgreSQL version: + +```console +helm upgrade postgresql bitnami/postgresql \ + --set postgresqlPassword=$POSTGRESQL_PASSWORD \ + --set persistence.existingClaim=$POSTGRESQL_PVC +``` + +1. Delete the existing PostgreSQL pod and the new statefulset will create a new one: + +```console +kubectl delete pod postgresql-postgresql-0 +``` + +1. Finally, you should see the lines below in PostgreSQL container logs: + +```text +$ kubectl logs $(kubectl get pods -l app.kubernetes.io/instance=postgresql,app.kubernetes.io/name=postgresql,role=master -o jsonpath="{.items[0].metadata.name}") +... +postgresql 08:05:12.59 INFO ==> Deploying PostgreSQL with persisted data... +... +``` + +## License + +Copyright © 2024 Broadcom. The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. + +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 + + + +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. \ No newline at end of file diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/.helmignore b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/.helmignore new file mode 100644 index 000000000..50af03172 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/.helmignore @@ -0,0 +1,22 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/Chart.yaml b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/Chart.yaml new file mode 100644 index 000000000..9a6aa881f --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/Chart.yaml @@ -0,0 +1,23 @@ +annotations: + category: Infrastructure + licenses: Apache-2.0 +apiVersion: v2 +appVersion: 2.14.1 +description: A Library Helm Chart for grouping common logic between bitnami charts. + This chart is not deployable by itself. +home: https://bitnami.com +icon: https://bitnami.com/downloads/logos/bitnami-mark.png +keywords: +- common +- helper +- template +- function +- bitnami +maintainers: +- name: VMware, Inc. + url: https://github.com/bitnami/charts +name: common +sources: +- https://github.com/bitnami/charts +type: library +version: 2.14.1 diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/README.md b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/README.md new file mode 100644 index 000000000..a76fa46a2 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/README.md @@ -0,0 +1,235 @@ +# Bitnami Common Library Chart + +A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between Bitnami charts. + +## TL;DR + +```yaml +dependencies: + - name: common + version: 2.x.x + repository: oci://registry-1.docker.io/bitnamicharts +``` + +```console +helm dependency update +``` + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "common.names.fullname" . }} +data: + myvalue: "Hello World" +``` + +Looking to use our applications in production? Try [VMware Tanzu Application Catalog](https://bitnami.com/enterprise), the enterprise edition of Bitnami Application Catalog. + +## Introduction + +This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. + +Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. + +## Prerequisites + +- Kubernetes 1.23+ +- Helm 3.8.0+ + +## Parameters + +## Special input schemas + +### ImageRoot + +```yaml +registry: + type: string + description: Docker registry where the image is located + example: docker.io + +repository: + type: string + description: Repository and image name + example: bitnami/nginx + +tag: + type: string + description: image tag + example: 1.16.1-debian-10-r63 + +pullPolicy: + type: string + description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + +pullSecrets: + type: array + items: + type: string + description: Optionally specify an array of imagePullSecrets (evaluated as templates). + +debug: + type: boolean + description: Set to true if you would like to see extra information on logs + example: false + +## An instance would be: +# registry: docker.io +# repository: bitnami/nginx +# tag: 1.16.1-debian-10-r63 +# pullPolicy: IfNotPresent +# debug: false +``` + +### Persistence + +```yaml +enabled: + type: boolean + description: Whether enable persistence. + example: true + +storageClass: + type: string + description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. + example: "-" + +accessMode: + type: string + description: Access mode for the Persistent Volume Storage. + example: ReadWriteOnce + +size: + type: string + description: Size the Persistent Volume Storage. + example: 8Gi + +path: + type: string + description: Path to be persisted. + example: /bitnami + +## An instance would be: +# enabled: true +# storageClass: "-" +# accessMode: ReadWriteOnce +# size: 8Gi +# path: /bitnami +``` + +### ExistingSecret + +```yaml +name: + type: string + description: Name of the existing secret. + example: mySecret +keyMapping: + description: Mapping between the expected key name and the name of the key in the existing secret. + type: object + +## An instance would be: +# name: mySecret +# keyMapping: +# password: myPasswordKey +``` + +#### Example of use + +When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. + +```yaml +# templates/secret.yaml +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }} + labels: + app: {{ include "common.names.fullname" . }} +type: Opaque +data: + password: {{ .Values.password | b64enc | quote }} + +# templates/dpl.yaml +--- +... + env: + - name: PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} + key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} +... + +# values.yaml +--- +name: mySecret +keyMapping: + password: myPasswordKey +``` + +### ValidateValue + +#### NOTES.txt + +```console +{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} + +{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} +``` + +If we force those values to be empty we will see some alerts + +```console +helm install test mychart --set path.to.value00="",path.to.value01="" + 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: + + export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) + + 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: + + export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) +``` + +## Upgrading + +### To 1.0.0 + +[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. + +#### What changes were introduced in this major version? + +- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. +- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. +- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts + +#### Considerations when upgrading to this version + +- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues +- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore +- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 + +#### Useful links + +- +- +- + +## License + +Copyright © 2023 VMware, Inc. + +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 + + + +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. diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_affinities.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_affinities.tpl new file mode 100644 index 000000000..e85b1df45 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_affinities.tpl @@ -0,0 +1,139 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} + +{{/* +Return a soft nodeAffinity definition +{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.soft" -}} +preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} + weight: 1 +{{- end -}} + +{{/* +Return a hard nodeAffinity definition +{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.hard" -}} +requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} +{{- end -}} + +{{/* +Return a nodeAffinity definition +{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.nodes.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.nodes.hard" . -}} + {{- end -}} +{{- end -}} + +{{/* +Return a topologyKey definition +{{ include "common.affinities.topologyKey" (dict "topologyKey" "BAR") -}} +*/}} +{{- define "common.affinities.topologyKey" -}} +{{ .topologyKey | default "kubernetes.io/hostname" -}} +{{- end -}} + +{{/* +Return a soft podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.soft" (dict "component" "FOO" "customLabels" .Values.podLabels "extraMatchLabels" .Values.extraMatchLabels "topologyKey" "BAR" "extraPodAffinityTerms" .Values.extraPodAffinityTerms "context" $) -}} +*/}} +{{- define "common.affinities.pods.soft" -}} +{{- $component := default "" .component -}} +{{- $customLabels := default (dict) .customLabels -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +{{- $extraPodAffinityTerms := default (list) .extraPodAffinityTerms -}} +preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" ( dict "customLabels" $customLabels "context" .context )) | nindent 10 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} + weight: 1 + {{- range $extraPodAffinityTerms }} + - podAffinityTerm: + labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" ( dict "customLabels" $customLabels "context" $.context )) | nindent 10 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := .extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} + weight: {{ .weight | default 1 -}} + {{- end -}} +{{- end -}} + +{{/* +Return a hard podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.hard" (dict "component" "FOO" "customLabels" .Values.podLabels "extraMatchLabels" .Values.extraMatchLabels "topologyKey" "BAR" "extraPodAffinityTerms" .Values.extraPodAffinityTerms "context" $) -}} +*/}} +{{- define "common.affinities.pods.hard" -}} +{{- $component := default "" .component -}} +{{- $customLabels := default (dict) .customLabels -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +{{- $extraPodAffinityTerms := default (list) .extraPodAffinityTerms -}} +requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" ( dict "customLabels" $customLabels "context" .context )) | nindent 8 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} + {{- range $extraPodAffinityTerms }} + - labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" ( dict "customLabels" $customLabels "context" $.context )) | nindent 8 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := .extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} + {{- end -}} +{{- end -}} + +{{/* +Return a podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.pods" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.pods.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.pods.hard" . -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_capabilities.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_capabilities.tpl new file mode 100644 index 000000000..115674af8 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_capabilities.tpl @@ -0,0 +1,229 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} + +{{/* +Return the target Kubernetes version +*/}} +{{- define "common.capabilities.kubeVersion" -}} +{{- if .Values.global }} + {{- if .Values.global.kubeVersion }} + {{- .Values.global.kubeVersion -}} + {{- else }} + {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} + {{- end -}} +{{- else }} +{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for poddisruptionbudget. +*/}} +{{- define "common.capabilities.policy.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "policy/v1beta1" -}} +{{- else -}} +{{- print "policy/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for networkpolicy. +*/}} +{{- define "common.capabilities.networkPolicy.apiVersion" -}} +{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for cronjob. +*/}} +{{- define "common.capabilities.cronjob.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "batch/v1beta1" -}} +{{- else -}} +{{- print "batch/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for daemonset. +*/}} +{{- define "common.capabilities.daemonset.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for deployment. +*/}} +{{- define "common.capabilities.deployment.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for statefulset. +*/}} +{{- define "common.capabilities.statefulset.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apps/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for ingress. +*/}} +{{- define "common.capabilities.ingress.apiVersion" -}} +{{- if .Values.ingress -}} +{{- if .Values.ingress.apiVersion -}} +{{- .Values.ingress.apiVersion -}} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end }} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for RBAC resources. +*/}} +{{- define "common.capabilities.rbac.apiVersion" -}} +{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "rbac.authorization.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "rbac.authorization.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for CRDs. +*/}} +{{- define "common.capabilities.crd.apiVersion" -}} +{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiextensions.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiextensions.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for APIService. +*/}} +{{- define "common.capabilities.apiService.apiVersion" -}} +{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiregistration.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiregistration.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for Horizontal Pod Autoscaler. +*/}} +{{- define "common.capabilities.hpa.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} +{{- if .beta2 -}} +{{- print "autoscaling/v2beta2" -}} +{{- else -}} +{{- print "autoscaling/v2beta1" -}} +{{- end -}} +{{- else -}} +{{- print "autoscaling/v2" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for Vertical Pod Autoscaler. +*/}} +{{- define "common.capabilities.vpa.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} +{{- if .beta2 -}} +{{- print "autoscaling/v2beta2" -}} +{{- else -}} +{{- print "autoscaling/v2beta1" -}} +{{- end -}} +{{- else -}} +{{- print "autoscaling/v2" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if PodSecurityPolicy is supported +*/}} +{{- define "common.capabilities.psp.supported" -}} +{{- if semverCompare "<1.25-0" (include "common.capabilities.kubeVersion" .) -}} + {{- true -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if AdmissionConfiguration is supported +*/}} +{{- define "common.capabilities.admissionConfiguration.supported" -}} +{{- if semverCompare ">=1.23-0" (include "common.capabilities.kubeVersion" .) -}} + {{- true -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for AdmissionConfiguration. +*/}} +{{- define "common.capabilities.admissionConfiguration.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiserver.config.k8s.io/v1alpha1" -}} +{{- else if semverCompare "<1.25-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiserver.config.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiserver.config.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for PodSecurityConfiguration. +*/}} +{{- define "common.capabilities.podSecurityConfiguration.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "pod-security.admission.config.k8s.io/v1alpha1" -}} +{{- else if semverCompare "<1.25-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "pod-security.admission.config.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "pod-security.admission.config.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the used Helm version is 3.3+. +A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. +This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. +**To be removed when the catalog's minimun Helm version is 3.3** +*/}} +{{- define "common.capabilities.supportsHelmVersion" -}} +{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_errors.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_errors.tpl new file mode 100644 index 000000000..07ded6f64 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_errors.tpl @@ -0,0 +1,28 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Through error when upgrading using empty passwords values that must not be empty. + +Usage: +{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} +{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} +{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} + +Required password params: + - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. + - context - Context - Required. Parent context. +*/}} +{{- define "common.errors.upgrade.passwords.empty" -}} + {{- $validationErrors := join "" .validationErrors -}} + {{- if and $validationErrors .context.Release.IsUpgrade -}} + {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} + {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} + {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} + {{- $errorString = print $errorString "\n%s" -}} + {{- printf $errorString $validationErrors | fail -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_images.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_images.tpl new file mode 100644 index 000000000..1bcb779df --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_images.tpl @@ -0,0 +1,117 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper image name +{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" .Values.global ) }} +*/}} +{{- define "common.images.image" -}} +{{- $registryName := .imageRoot.registry -}} +{{- $repositoryName := .imageRoot.repository -}} +{{- $separator := ":" -}} +{{- $termination := .imageRoot.tag | toString -}} +{{- if .global }} + {{- if .global.imageRegistry }} + {{- $registryName = .global.imageRegistry -}} + {{- end -}} +{{- end -}} +{{- if .imageRoot.digest }} + {{- $separator = "@" -}} + {{- $termination = .imageRoot.digest | toString -}} +{{- end -}} +{{- if $registryName }} + {{- printf "%s/%s%s%s" $registryName $repositoryName $separator $termination -}} +{{- else -}} + {{- printf "%s%s%s" $repositoryName $separator $termination -}} +{{- end -}} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) +{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} +*/}} +{{- define "common.images.pullSecrets" -}} + {{- $pullSecrets := list }} + + {{- if .global }} + {{- range .global.imagePullSecrets -}} + {{- if kindIs "map" . -}} + {{- $pullSecrets = append $pullSecrets .name -}} + {{- else -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end }} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- if kindIs "map" . -}} + {{- $pullSecrets = append $pullSecrets .name -}} + {{- else -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets | uniq }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names evaluating values as templates +{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} +*/}} +{{- define "common.images.renderPullSecrets" -}} + {{- $pullSecrets := list }} + {{- $context := .context }} + + {{- if $context.Values.global }} + {{- range $context.Values.global.imagePullSecrets -}} + {{- if kindIs "map" . -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" .name "context" $context)) -}} + {{- else -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- if kindIs "map" . -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" .name "context" $context)) -}} + {{- else -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets | uniq }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} + +{{/* +Return the proper image version (ingores image revision/prerelease info & fallbacks to chart appVersion) +{{ include "common.images.version" ( dict "imageRoot" .Values.path.to.the.image "chart" .Chart ) }} +*/}} +{{- define "common.images.version" -}} +{{- $imageTag := .imageRoot.tag | toString -}} +{{/* regexp from https://github.com/Masterminds/semver/blob/23f51de38a0866c5ef0bfc42b3f735c73107b700/version.go#L41-L44 */}} +{{- if regexMatch `^([0-9]+)(\.[0-9]+)?(\.[0-9]+)?(-([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?(\+([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?$` $imageTag -}} + {{- $version := semver $imageTag -}} + {{- printf "%d.%d.%d" $version.Major $version.Minor $version.Patch -}} +{{- else -}} + {{- print .chart.AppVersion -}} +{{- end -}} +{{- end -}} + diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_ingress.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_ingress.tpl new file mode 100644 index 000000000..efa5b85c7 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_ingress.tpl @@ -0,0 +1,73 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} + +{{/* +Generate backend entry that is compatible with all Kubernetes API versions. + +Usage: +{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} + +Params: + - serviceName - String. Name of an existing service backend + - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.ingress.backend" -}} +{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} +{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} +serviceName: {{ .serviceName }} +servicePort: {{ .servicePort }} +{{- else -}} +service: + name: {{ .serviceName }} + port: + {{- if typeIs "string" .servicePort }} + name: {{ .servicePort }} + {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} + number: {{ .servicePort | int }} + {{- end }} +{{- end -}} +{{- end -}} + +{{/* +Print "true" if the API pathType field is supported +Usage: +{{ include "common.ingress.supportsPathType" . }} +*/}} +{{- define "common.ingress.supportsPathType" -}} +{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the ingressClassname field is supported +Usage: +{{ include "common.ingress.supportsIngressClassname" . }} +*/}} +{{- define "common.ingress.supportsIngressClassname" -}} +{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if cert-manager required annotations for TLS signed +certificates are set in the Ingress annotations +Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations +Usage: +{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} +*/}} +{{- define "common.ingress.certManagerRequest" -}} +{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") (hasKey .annotations "kubernetes.io/tls-acme") }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_labels.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_labels.tpl new file mode 100644 index 000000000..d90a6cdc0 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_labels.tpl @@ -0,0 +1,46 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} + +{{/* +Kubernetes standard labels +{{ include "common.labels.standard" (dict "customLabels" .Values.commonLabels "context" $) -}} +*/}} +{{- define "common.labels.standard" -}} +{{- if and (hasKey . "customLabels") (hasKey . "context") -}} +{{- $default := dict "app.kubernetes.io/name" (include "common.names.name" .context) "helm.sh/chart" (include "common.names.chart" .context) "app.kubernetes.io/instance" .context.Release.Name "app.kubernetes.io/managed-by" .context.Release.Service -}} +{{- with .context.Chart.AppVersion -}} +{{- $_ := set $default "app.kubernetes.io/version" . -}} +{{- end -}} +{{ template "common.tplvalues.merge" (dict "values" (list .customLabels $default) "context" .context) }} +{{- else -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +helm.sh/chart: {{ include "common.names.chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- with .Chart.AppVersion }} +app.kubernetes.io/version: {{ . | quote }} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Labels used on immutable fields such as deploy.spec.selector.matchLabels or svc.spec.selector +{{ include "common.labels.matchLabels" (dict "customLabels" .Values.podLabels "context" $) -}} + +We don't want to loop over custom labels appending them to the selector +since it's very likely that it will break deployments, services, etc. +However, it's important to overwrite the standard labels if the user +overwrote them on metadata.labels fields. +*/}} +{{- define "common.labels.matchLabels" -}} +{{- if and (hasKey . "customLabels") (hasKey . "context") -}} +{{ merge (pick (include "common.tplvalues.render" (dict "value" .customLabels "context" .context) | fromYaml) "app.kubernetes.io/name" "app.kubernetes.io/instance") (dict "app.kubernetes.io/name" (include "common.names.name" .context) "app.kubernetes.io/instance" .context.Release.Name ) | toYaml }} +{{- else -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_names.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_names.tpl new file mode 100644 index 000000000..a222924f1 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_names.tpl @@ -0,0 +1,71 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "common.names.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "common.names.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "common.names.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified dependency name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +Usage: +{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} +*/}} +{{- define "common.names.dependency.fullname" -}} +{{- if .chartValues.fullnameOverride -}} +{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .chartName .chartValues.nameOverride -}} +{{- if contains $name .context.Release.Name -}} +{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts. +*/}} +{{- define "common.names.namespace" -}} +{{- default .Release.Namespace .Values.namespaceOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a fully qualified app name adding the installation's namespace. +*/}} +{{- define "common.names.fullname.namespace" -}} +{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_secrets.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_secrets.tpl new file mode 100644 index 000000000..84dbe3803 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_secrets.tpl @@ -0,0 +1,182 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Generate secret name. + +Usage: +{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/main/bitnami/common#existingsecret + - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.secrets.name" -}} +{{- $name := (include "common.names.fullname" .context) -}} + +{{- if .defaultNameSuffix -}} +{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- with .existingSecret -}} +{{- if not (typeIs "string" .) -}} +{{- with .name -}} +{{- $name = . -}} +{{- end -}} +{{- else -}} +{{- $name = . -}} +{{- end -}} +{{- end -}} + +{{- printf "%s" $name -}} +{{- end -}} + +{{/* +Generate secret key. + +Usage: +{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/main/bitnami/common#existingsecret + - key - String - Required. Name of the key in the secret. +*/}} +{{- define "common.secrets.key" -}} +{{- $key := .key -}} + +{{- if .existingSecret -}} + {{- if not (typeIs "string" .existingSecret) -}} + {{- if .existingSecret.keyMapping -}} + {{- $key = index .existingSecret.keyMapping $.key -}} + {{- end -}} + {{- end }} +{{- end -}} + +{{- printf "%s" $key -}} +{{- end -}} + +{{/* +Generate secret password or retrieve one if already created. + +Usage: +{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - key - String - Required - Name of the key in the secret. + - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. + - length - int - Optional - Length of the generated random password. + - strong - Boolean - Optional - Whether to add symbols to the generated random password. + - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. + - context - Context - Required - Parent context. + - failOnNew - Boolean - Optional - Default to true. If set to false, skip errors adding new keys to existing secrets. + - skipB64enc - Boolean - Optional - Default to false. If set to true, no the secret will not be base64 encrypted. + - skipQuote - Boolean - Optional - Default to false. If set to true, no quotes will be added around the secret. +The order in which this function returns a secret password: + 1. Already existing 'Secret' resource + (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) + 2. Password provided via the values.yaml + (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) + 3. Randomly generated secret password + (A new random secret password with the length specified in the 'length' parameter will be generated and returned) + +*/}} +{{- define "common.secrets.passwords.manage" -}} + +{{- $password := "" }} +{{- $subchart := "" }} +{{- $chartName := default "" .chartName }} +{{- $passwordLength := default 10 .length }} +{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} +{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} +{{- $secretData := (lookup "v1" "Secret" (include "common.names.namespace" .context) .secret).data }} +{{- if $secretData }} + {{- if hasKey $secretData .key }} + {{- $password = index $secretData .key | b64dec }} + {{- else if not (eq .failOnNew false) }} + {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} + {{- else if $providedPasswordValue }} + {{- $password = $providedPasswordValue | toString }} + {{- end -}} +{{- else if $providedPasswordValue }} + {{- $password = $providedPasswordValue | toString }} +{{- else }} + + {{- if .context.Values.enabled }} + {{- $subchart = $chartName }} + {{- end -}} + + {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} + {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} + {{- $passwordValidationErrors := list $requiredPasswordError -}} + {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} + + {{- if .strong }} + {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} + {{- $password = randAscii $passwordLength }} + {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} + {{- $password = printf "%s%s" $subStr $password | toString | shuffle }} + {{- else }} + {{- $password = randAlphaNum $passwordLength }} + {{- end }} +{{- end -}} +{{- if not .skipB64enc }} +{{- $password = $password | b64enc }} +{{- end -}} +{{- if .skipQuote -}} +{{- printf "%s" $password -}} +{{- else -}} +{{- printf "%s" $password | quote -}} +{{- end -}} +{{- end -}} + +{{/* +Reuses the value from an existing secret, otherwise sets its value to a default value. + +Usage: +{{ include "common.secrets.lookup" (dict "secret" "secret-name" "key" "keyName" "defaultValue" .Values.myValue "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - key - String - Required - Name of the key in the secret. + - defaultValue - String - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. + - context - Context - Required - Parent context. + +*/}} +{{- define "common.secrets.lookup" -}} +{{- $value := "" -}} +{{- $secretData := (lookup "v1" "Secret" (include "common.names.namespace" .context) .secret).data -}} +{{- if and $secretData (hasKey $secretData .key) -}} + {{- $value = index $secretData .key -}} +{{- else if .defaultValue -}} + {{- $value = .defaultValue | toString | b64enc -}} +{{- end -}} +{{- if $value -}} +{{- printf "%s" $value -}} +{{- end -}} +{{- end -}} + +{{/* +Returns whether a previous generated secret already exists + +Usage: +{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - context - Context - Required - Parent context. +*/}} +{{- define "common.secrets.exists" -}} +{{- $secret := (lookup "v1" "Secret" (include "common.names.namespace" .context) .secret) }} +{{- if $secret }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_storage.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_storage.tpl new file mode 100644 index 000000000..16405a0f8 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_storage.tpl @@ -0,0 +1,28 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper Storage Class +{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} +*/}} +{{- define "common.storage.class" -}} + +{{- $storageClass := .persistence.storageClass -}} +{{- if .global -}} + {{- if .global.storageClass -}} + {{- $storageClass = .global.storageClass -}} + {{- end -}} +{{- end -}} + +{{- if $storageClass -}} + {{- if (eq "-" $storageClass) -}} + {{- printf "storageClassName: \"\"" -}} + {{- else }} + {{- printf "storageClassName: %s" $storageClass -}} + {{- end -}} +{{- end -}} + +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_tplvalues.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_tplvalues.tpl new file mode 100644 index 000000000..a8ed7637e --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_tplvalues.tpl @@ -0,0 +1,38 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Renders a value that contains template perhaps with scope if the scope is present. +Usage: +{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $ ) }} +{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $ "scope" $app ) }} +*/}} +{{- define "common.tplvalues.render" -}} +{{- $value := typeIs "string" .value | ternary .value (.value | toYaml) }} +{{- if contains "{{" (toJson .value) }} + {{- if .scope }} + {{- tpl (cat "{{- with $.RelativeScope -}}" $value "{{- end }}") (merge (dict "RelativeScope" .scope) .context) }} + {{- else }} + {{- tpl $value .context }} + {{- end }} +{{- else }} + {{- $value }} +{{- end }} +{{- end -}} + +{{/* +Merge a list of values that contains template after rendering them. +Merge precedence is consistent with http://masterminds.github.io/sprig/dicts.html#merge-mustmerge +Usage: +{{ include "common.tplvalues.merge" ( dict "values" (list .Values.path.to.the.Value1 .Values.path.to.the.Value2) "context" $ ) }} +*/}} +{{- define "common.tplvalues.merge" -}} +{{- $dst := dict -}} +{{- range .values -}} +{{- $dst = include "common.tplvalues.render" (dict "value" . "context" $.context "scope" $.scope) | fromYaml | merge $dst -}} +{{- end -}} +{{ $dst | toYaml }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_utils.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_utils.tpl new file mode 100644 index 000000000..bfbddf054 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_utils.tpl @@ -0,0 +1,77 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Print instructions to get a secret value. +Usage: +{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} +*/}} +{{- define "common.utils.secret.getvalue" -}} +{{- $varname := include "common.utils.fieldToEnvVar" . -}} +export {{ $varname }}=$(kubectl get secret --namespace {{ include "common.names.namespace" .context | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) +{{- end -}} + +{{/* +Build env var name given a field +Usage: +{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} +*/}} +{{- define "common.utils.fieldToEnvVar" -}} + {{- $fieldNameSplit := splitList "-" .field -}} + {{- $upperCaseFieldNameSplit := list -}} + + {{- range $fieldNameSplit -}} + {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} + {{- end -}} + + {{ join "_" $upperCaseFieldNameSplit }} +{{- end -}} + +{{/* +Gets a value from .Values given +Usage: +{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} +*/}} +{{- define "common.utils.getValueFromKey" -}} +{{- $splitKey := splitList "." .key -}} +{{- $value := "" -}} +{{- $latestObj := $.context.Values -}} +{{- range $splitKey -}} + {{- if not $latestObj -}} + {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} + {{- end -}} + {{- $value = ( index $latestObj . ) -}} + {{- $latestObj = $value -}} +{{- end -}} +{{- printf "%v" (default "" $value) -}} +{{- end -}} + +{{/* +Returns first .Values key with a defined value or first of the list if all non-defined +Usage: +{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} +*/}} +{{- define "common.utils.getKeyFromList" -}} +{{- $key := first .keys -}} +{{- $reverseKeys := reverse .keys }} +{{- range $reverseKeys }} + {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} + {{- if $value -}} + {{- $key = . }} + {{- end -}} +{{- end -}} +{{- printf "%s" $key -}} +{{- end -}} + +{{/* +Checksum a template at "path" containing a *single* resource (ConfigMap,Secret) for use in pod annotations, excluding the metadata (see #18376). +Usage: +{{ include "common.utils.checksumTemplate" (dict "path" "/configmap.yaml" "context" $) }} +*/}} +{{- define "common.utils.checksumTemplate" -}} +{{- $obj := include (print .context.Template.BasePath .path) .context | fromYaml -}} +{{ omit $obj "apiVersion" "kind" "metadata" | toYaml | sha256sum }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_warnings.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_warnings.tpl new file mode 100644 index 000000000..66dffc1fe --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_warnings.tpl @@ -0,0 +1,19 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Warning about using rolling tag. +Usage: +{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} +*/}} +{{- define "common.warnings.rollingTag" -}} + +{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} +WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. ++info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ +{{- end }} + +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_cassandra.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_cassandra.tpl new file mode 100644 index 000000000..eda9aada5 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_cassandra.tpl @@ -0,0 +1,77 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Cassandra required passwords are not empty. + +Usage: +{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.cassandra.passwords" -}} + {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} + {{- $enabled := include "common.cassandra.values.enabled" . -}} + {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} + {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.dbUser.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled cassandra. + +Usage: +{{ include "common.cassandra.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.cassandra.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.cassandra.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key dbUser + +Usage: +{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.key.dbUser" -}} + {{- if .subchart -}} + cassandra.dbUser + {{- else -}} + dbUser + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mariadb.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mariadb.tpl new file mode 100644 index 000000000..17d83a2fd --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mariadb.tpl @@ -0,0 +1,108 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MariaDB required passwords are not empty. + +Usage: +{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mariadb.passwords" -}} + {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mariadb.values.enabled" . -}} + {{- $architecture := include "common.mariadb.values.architecture" . -}} + {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mariadb. + +Usage: +{{ include "common.mariadb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mariadb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mariadb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.key.auth" -}} + {{- if .subchart -}} + mariadb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mongodb.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mongodb.tpl new file mode 100644 index 000000000..bbb445b86 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mongodb.tpl @@ -0,0 +1,113 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MongoDB® required passwords are not empty. + +Usage: +{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mongodb.passwords" -}} + {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mongodb.values.enabled" . -}} + {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} + {{- $architecture := include "common.mongodb.values.architecture" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} + {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} + + {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} + {{- if and $valueUsername $valueDatabase -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replicaset") -}} + {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mongodb. + +Usage: +{{ include "common.mongodb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mongodb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mongodb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.key.auth" -}} + {{- if .subchart -}} + mongodb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mysql.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mysql.tpl new file mode 100644 index 000000000..ca3953f86 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mysql.tpl @@ -0,0 +1,108 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MySQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mysql.passwords" -}} + {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mysql.values.enabled" . -}} + {{- $architecture := include "common.mysql.values.architecture" . -}} + {{- $authPrefix := include "common.mysql.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mysql. + +Usage: +{{ include "common.mysql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mysql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mysql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.key.auth" -}} + {{- if .subchart -}} + mysql.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_postgresql.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_postgresql.tpl new file mode 100644 index 000000000..8c9aa570e --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_postgresql.tpl @@ -0,0 +1,134 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate PostgreSQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.postgresql.passwords" -}} + {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} + {{- $enabled := include "common.postgresql.values.enabled" . -}} + {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} + {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} + + {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} + {{- if (eq $enabledReplication "true") -}} + {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to decide whether evaluate global values. + +Usage: +{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} +Params: + - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" +*/}} +{{- define "common.postgresql.values.use.global" -}} + {{- if .context.Values.global -}} + {{- if .context.Values.global.postgresql -}} + {{- index .context.Values.global.postgresql .key | quote -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.existingSecret" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} + + {{- if .subchart -}} + {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} + {{- else -}} + {{- default (.context.Values.existingSecret | quote) $globalValue -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled postgresql. + +Usage: +{{ include "common.postgresql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key postgressPassword. + +Usage: +{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.postgressPassword" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} + + {{- if not $globalValue -}} + {{- if .subchart -}} + postgresql.postgresqlPassword + {{- else -}} + postgresqlPassword + {{- end -}} + {{- else -}} + global.postgresql.postgresqlPassword + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled.replication. + +Usage: +{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.enabled.replication" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.replication.enabled -}} + {{- else -}} + {{- printf "%v" .context.Values.replication.enabled -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key replication.password. + +Usage: +{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.replicationPassword" -}} + {{- if .subchart -}} + postgresql.replication.password + {{- else -}} + replication.password + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_redis.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_redis.tpl new file mode 100644 index 000000000..fc0d208dd --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_redis.tpl @@ -0,0 +1,81 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Redis® required passwords are not empty. + +Usage: +{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.redis.passwords" -}} + {{- $enabled := include "common.redis.values.enabled" . -}} + {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} + {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} + + {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} + {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} + + {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} + {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} + {{- if eq $useAuth "true" -}} + {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled redis. + +Usage: +{{ include "common.redis.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.redis.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.redis.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right prefix path for the values + +Usage: +{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.redis.values.keys.prefix" -}} + {{- if .subchart -}}redis.{{- else -}}{{- end -}} +{{- end -}} + +{{/* +Checks whether the redis chart's includes the standarizations (version >= 14) + +Usage: +{{ include "common.redis.values.standarized.version" (dict "context" $) }} +*/}} +{{- define "common.redis.values.standarized.version" -}} + + {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} + {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} + + {{- if $standarizedAuthValues -}} + {{- true -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_validations.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_validations.tpl new file mode 100644 index 000000000..31ceda871 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_validations.tpl @@ -0,0 +1,51 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate values must not be empty. + +Usage: +{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} +{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" +*/}} +{{- define "common.validations.values.multiple.empty" -}} + {{- range .required -}} + {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} + {{- end -}} +{{- end -}} + +{{/* +Validate a value must not be empty. + +Usage: +{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" + - subchart - String - Optional - Name of the subchart that the validated password is part of. +*/}} +{{- define "common.validations.values.single.empty" -}} + {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} + {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} + + {{- if not $value -}} + {{- $varname := "my-value" -}} + {{- $getCurrentValue := "" -}} + {{- if and .secret .field -}} + {{- $varname = include "common.utils.fieldToEnvVar" . -}} + {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} + {{- end -}} + {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/values.yaml b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/values.yaml new file mode 100644 index 000000000..9abe0e154 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/values.yaml @@ -0,0 +1,8 @@ +# Copyright VMware, Inc. +# SPDX-License-Identifier: APACHE-2.0 + +## bitnami/common +## It is required by CI/CD tools and processes. +## @skip exampleValue +## +exampleValue: common-chart diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/NOTES.txt b/thunder_deployment/infra/beta9/charts/postgresql/templates/NOTES.txt new file mode 100644 index 000000000..73c4a34e5 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/NOTES.txt @@ -0,0 +1,115 @@ +CHART NAME: {{ .Chart.Name }} +CHART VERSION: {{ .Chart.Version }} +APP VERSION: {{ .Chart.AppVersion }} + +** Please be patient while the chart is being deployed ** + +{{- if .Values.diagnosticMode.enabled }} +The chart has been deployed in diagnostic mode. All probes have been disabled and the command has been overwritten with: + + command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 4 }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 4 }} + +Get the list of pods by executing: + + kubectl get pods --namespace {{ .Release.Namespace }} -l app.kubernetes.io/instance={{ .Release.Name }} + +Access the pod you want to debug by executing + + kubectl exec --namespace {{ .Release.Namespace }} -ti -- /opt/bitnami/scripts/postgresql/entrypoint.sh /bin/bash + +In order to replicate the container startup scripts execute this command: + + /opt/bitnami/scripts/postgresql/entrypoint.sh /opt/bitnami/scripts/postgresql/run.sh + +{{- else }} + +{{- $customUser := include "postgresql.v1.username" . }} +{{- $postgresPassword := include "common.secrets.lookup" (dict "secret" (include "common.names.fullname" .) "key" .Values.auth.secretKeys.adminPasswordKey "defaultValue" (ternary .Values.auth.postgresPassword .Values.auth.password (eq $customUser "postgres")) "context" $) -}} +{{- $authEnabled := and (not (or .Values.global.postgresql.auth.existingSecret .Values.auth.existingSecret)) (or $postgresPassword .Values.auth.enablePostgresUser (and (not (empty $customUser)) (ne $customUser "postgres"))) }} +{{- if not $authEnabled }} + +WARNING: PostgreSQL has been configured without authentication, this is not recommended for production environments. +{{- end }} + +PostgreSQL can be accessed via port {{ include "postgresql.v1.service.port" . }} on the following DNS names from within your cluster: + + {{ include "postgresql.v1.primary.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local - Read/Write connection + +{{- if eq .Values.architecture "replication" }} + + {{ include "postgresql.v1.readReplica.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local - Read only connection + +{{- end }} + +{{- if and (not (empty $customUser)) (ne $customUser "postgres") }} +{{- if .Values.auth.enablePostgresUser }} + +To get the password for "postgres" run: + + export POSTGRES_ADMIN_PASSWORD=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ include "postgresql.v1.secretName" . }} -o jsonpath="{.data.{{include "postgresql.v1.adminPasswordKey" .}}}" | base64 -d) +{{- end }} + +To get the password for "{{ $customUser }}" run: + + export POSTGRES_PASSWORD=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ include "postgresql.v1.secretName" . }} -o jsonpath="{.data.{{include "postgresql.v1.userPasswordKey" .}}}" | base64 -d) +{{- else }} +{{- if .Values.auth.enablePostgresUser }} + +To get the password for "{{ default "postgres" $customUser }}" run: + + export POSTGRES_PASSWORD=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ include "postgresql.v1.secretName" . }} -o jsonpath="{.data.{{ ternary "password" (include "postgresql.v1.adminPasswordKey" .) (and (not (empty $customUser)) (ne $customUser "postgres")) }}}" | base64 -d) +{{- end }} +{{- end }} + +To connect to your database run the following command: + {{- if $authEnabled }} + + kubectl run {{ include "common.names.fullname" . }}-client --rm --tty -i --restart='Never' --namespace {{ .Release.Namespace }} --image {{ include "postgresql.v1.image" . }} --env="PGPASSWORD=$POSTGRES_PASSWORD" \ + --command -- psql --host {{ include "postgresql.v1.primary.fullname" . }} -U {{ default "postgres" $customUser }} -d {{- if include "postgresql.v1.database" . }} {{ include "postgresql.v1.database" . }}{{- else }} postgres{{- end }} -p {{ include "postgresql.v1.service.port" . }} + {{- else }} + + kubectl run {{ include "common.names.fullname" . }}-client --rm --tty -i --restart='Never' --namespace {{ .Release.Namespace }} --image {{ include "postgresql.v1.image" . }} \ + --command -- psql --host {{ include "postgresql.v1.primary.fullname" . }} -d {{- if include "postgresql.v1.database" . }} {{ include "postgresql.v1.database" . }}{{- else }} postgres{{- end }} -p {{ include "postgresql.v1.service.port" . }} + {{- end }} + + > NOTE: If you access the container using bash, make sure that you execute "/opt/bitnami/scripts/postgresql/entrypoint.sh /bin/bash" in order to avoid the error "psql: local user with ID {{ .Values.primary.containerSecurityContext.runAsUser }}} does not exist" + +To connect to your database from outside the cluster execute the following commands: + +{{- if contains "NodePort" .Values.primary.service.type }} + + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "postgresql.v1.primary.fullname" . }}) + {{- if $authEnabled }} + PGPASSWORD="$POSTGRES_PASSWORD" psql --host $NODE_IP --port $NODE_PORT -U {{ default "postgres" $customUser }} -d {{- if include "postgresql.v1.database" . }} {{ include "postgresql.v1.database" . }}{{- else }} postgres{{- end }} + {{- else }} + psql --host $NODE_IP --port $NODE_PORT -d {{- if include "postgresql.v1.database" . }} {{ include "postgresql.v1.database" . }}{{- else }} postgres{{- end }} + {{- end }} +{{- else if contains "LoadBalancer" .Values.primary.service.type }} + + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + Watch the status with: 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ include "postgresql.v1.primary.fullname" . }}' + + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "postgresql.v1.primary.fullname" . }} --template "{{ "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}" }}") + {{- if $authEnabled }} + PGPASSWORD="$POSTGRES_PASSWORD" psql --host $SERVICE_IP --port {{ include "postgresql.v1.service.port" . }} -U {{ default "postgres" $customUser }} -d {{- if include "postgresql.v1.database" . }} {{ include "postgresql.v1.database" . }}{{- else }} postgres{{- end }} + {{- else }} + psql --host $SERVICE_IP --port {{ include "postgresql.v1.service.port" . }} -d {{- if include "postgresql.v1.database" . }} {{ include "postgresql.v1.database" . }}{{- else }} postgres{{- end }} + {{- end }} +{{- else if contains "ClusterIP" .Values.primary.service.type }} + + kubectl port-forward --namespace {{ .Release.Namespace }} svc/{{ include "postgresql.v1.primary.fullname" . }} {{ include "postgresql.v1.service.port" . }}:{{ include "postgresql.v1.service.port" . }} & + {{- if $authEnabled }} + PGPASSWORD="$POSTGRES_PASSWORD" psql --host 127.0.0.1 -U {{ default "postgres" $customUser }} -d {{- if include "postgresql.v1.database" . }} {{ include "postgresql.v1.database" . }}{{- else }} postgres{{- end }} -p {{ include "postgresql.v1.service.port" . }} + {{- else }} + psql --host 127.0.0.1 -d {{- if include "postgresql.v1.database" . }} {{ include "postgresql.v1.database" . }}{{- else }} postgres{{- end }} -p {{ include "postgresql.v1.service.port" . }} + {{- end }} +{{- end }} +{{- end }} + +WARNING: The configured password will be ignored on new installation in case when previous PostgreSQL release was deleted through the helm command. In that case, old PVC will have an old password, and setting it through helm won't take effect. Deleting persistent volumes (PVs) will solve the issue. + +{{- include "postgresql.v1.validateValues" . -}} +{{- include "common.warnings.rollingTag" .Values.image -}} +{{- include "common.warnings.rollingTag" .Values.volumePermissions.image }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/_helpers.tpl b/thunder_deployment/infra/beta9/charts/postgresql/templates/_helpers.tpl new file mode 100644 index 000000000..0ab9fd037 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/_helpers.tpl @@ -0,0 +1,406 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} + +{{/* +Create a default fully qualified app name for PostgreSQL Primary objects +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "postgresql.v1.primary.fullname" -}} +{{- if eq .Values.architecture "replication" -}} + {{- printf "%s-%s" (include "common.names.fullname" .) .Values.primary.name | trunc 63 | trimSuffix "-" -}} +{{- else -}} + {{- include "common.names.fullname" . -}} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified app name for PostgreSQL read-only replicas objects +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "postgresql.v1.readReplica.fullname" -}} +{{- printf "%s-%s" (include "common.names.fullname" .) .Values.readReplicas.name | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create the default FQDN for PostgreSQL primary headless service +We truncate at 63 chars because of the DNS naming spec. +*/}} +{{- define "postgresql.v1.primary.svc.headless" -}} +{{- printf "%s-hl" (include "postgresql.v1.primary.fullname" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create the default FQDN for PostgreSQL read-only replicas headless service +We truncate at 63 chars because of the DNS naming spec. +*/}} +{{- define "postgresql.v1.readReplica.svc.headless" -}} +{{- printf "%s-hl" (include "postgresql.v1.readReplica.fullname" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Return the proper PostgreSQL image name +*/}} +{{- define "postgresql.v1.image" -}} +{{ include "common.images.image" (dict "imageRoot" .Values.image "global" .Values.global) }} +{{- end -}} + +{{/* +Return the proper PostgreSQL metrics image name +*/}} +{{- define "postgresql.v1.metrics.image" -}} +{{ include "common.images.image" (dict "imageRoot" .Values.metrics.image "global" .Values.global) }} +{{- end -}} + +{{/* +Return the proper image name (for the init container volume-permissions image) +*/}} +{{- define "postgresql.v1.volumePermissions.image" -}} +{{ include "common.images.image" (dict "imageRoot" .Values.volumePermissions.image "global" .Values.global) }} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names +*/}} +{{- define "postgresql.v1.imagePullSecrets" -}} +{{ include "common.images.renderPullSecrets" (dict "images" (list .Values.image .Values.metrics.image .Values.volumePermissions.image) "context" $) }} +{{- end -}} + +{{/* +Return the name for a custom user to create +*/}} +{{- define "postgresql.v1.username" -}} +{{- if .Values.global.postgresql.auth.username -}} + {{- .Values.global.postgresql.auth.username -}} +{{- else -}} + {{- .Values.auth.username -}} +{{- end -}} +{{- end -}} + +{{/* +Return the name for a custom database to create +*/}} +{{- define "postgresql.v1.database" -}} +{{- if .Values.global.postgresql.auth.database -}} + {{- printf "%s" (tpl .Values.global.postgresql.auth.database $) -}} +{{- else if .Values.auth.database -}} + {{- printf "%s" (tpl .Values.auth.database $) -}} +{{- end -}} +{{- end -}} + +{{/* +Get the password secret. +*/}} +{{- define "postgresql.v1.secretName" -}} +{{- if .Values.global.postgresql.auth.existingSecret -}} + {{- printf "%s" (tpl .Values.global.postgresql.auth.existingSecret $) -}} +{{- else if .Values.auth.existingSecret -}} + {{- printf "%s" (tpl .Values.auth.existingSecret $) -}} +{{- else -}} + {{- printf "%s" (include "common.names.fullname" .) -}} +{{- end -}} +{{- end -}} + +{{/* +Get the replication-password key. +*/}} +{{- define "postgresql.v1.replicationPasswordKey" -}} +{{- if or .Values.global.postgresql.auth.existingSecret .Values.auth.existingSecret -}} + {{- if .Values.global.postgresql.auth.secretKeys.replicationPasswordKey -}} + {{- printf "%s" (tpl .Values.global.postgresql.auth.secretKeys.replicationPasswordKey $) -}} + {{- else if .Values.auth.secretKeys.replicationPasswordKey -}} + {{- printf "%s" (tpl .Values.auth.secretKeys.replicationPasswordKey $) -}} + {{- else -}} + {{- "replication-password" -}} + {{- end -}} +{{- else -}} + {{- "replication-password" -}} +{{- end -}} +{{- end -}} + +{{/* +Get the admin-password key. +*/}} +{{- define "postgresql.v1.adminPasswordKey" -}} +{{- if or .Values.global.postgresql.auth.existingSecret .Values.auth.existingSecret -}} + {{- if .Values.global.postgresql.auth.secretKeys.adminPasswordKey -}} + {{- printf "%s" (tpl .Values.global.postgresql.auth.secretKeys.adminPasswordKey $) -}} + {{- else if .Values.auth.secretKeys.adminPasswordKey -}} + {{- printf "%s" (tpl .Values.auth.secretKeys.adminPasswordKey $) -}} + {{- end -}} +{{- else -}} + {{- "postgres-password" -}} +{{- end -}} +{{- end -}} + +{{/* +Get the user-password key. +*/}} +{{- define "postgresql.v1.userPasswordKey" -}} +{{- if or .Values.global.postgresql.auth.existingSecret .Values.auth.existingSecret -}} + {{- if or (empty (include "postgresql.v1.username" .)) (eq (include "postgresql.v1.username" .) "postgres") -}} + {{- printf "%s" (include "postgresql.v1.adminPasswordKey" .) -}} + {{- else -}} + {{- if .Values.global.postgresql.auth.secretKeys.userPasswordKey -}} + {{- printf "%s" (tpl .Values.global.postgresql.auth.secretKeys.userPasswordKey $) -}} + {{- else if .Values.auth.secretKeys.userPasswordKey -}} + {{- printf "%s" (tpl .Values.auth.secretKeys.userPasswordKey $) -}} + {{- end -}} + {{- end -}} +{{- else -}} + {{- "password" -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if a secret object should be created +*/}} +{{- define "postgresql.v1.createSecret" -}} +{{- $customUser := include "postgresql.v1.username" . -}} +{{- $postgresPassword := include "common.secrets.lookup" (dict "secret" (include "common.names.fullname" .) "key" .Values.auth.secretKeys.adminPasswordKey "defaultValue" (ternary (coalesce .Values.global.postgresql.auth.postgresPassword .Values.auth.postgresPassword .Values.global.postgresql.auth.password .Values.auth.password) (coalesce .Values.global.postgresql.auth.postgresPassword .Values.auth.postgresPassword) (or (empty $customUser) (eq $customUser "postgres"))) "context" $) -}} +{{- if and (not (or .Values.global.postgresql.auth.existingSecret .Values.auth.existingSecret)) (or $postgresPassword .Values.auth.enablePostgresUser (and (not (empty $customUser)) (ne $customUser "postgres")) (eq .Values.architecture "replication") (and .Values.ldap.enabled (or .Values.ldap.bind_password .Values.ldap.bindpw))) -}} + {{- true -}} +{{- end -}} +{{- end -}} + +{{/* +Return PostgreSQL service port +*/}} +{{- define "postgresql.v1.service.port" -}} +{{- if .Values.global.postgresql.service.ports.postgresql -}} + {{- .Values.global.postgresql.service.ports.postgresql -}} +{{- else -}} + {{- .Values.primary.service.ports.postgresql -}} +{{- end -}} +{{- end -}} + +{{/* +Return PostgreSQL service port +*/}} +{{- define "postgresql.v1.readReplica.service.port" -}} +{{- if .Values.global.postgresql.service.ports.postgresql -}} + {{- .Values.global.postgresql.service.ports.postgresql -}} +{{- else -}} + {{- .Values.readReplicas.service.ports.postgresql -}} +{{- end -}} +{{- end -}} + +{{/* +Get the PostgreSQL primary configuration ConfigMap name. +*/}} +{{- define "postgresql.v1.primary.configmapName" -}} +{{- if .Values.primary.existingConfigmap -}} + {{- printf "%s" (tpl .Values.primary.existingConfigmap $) -}} +{{- else -}} + {{- printf "%s-configuration" (include "postgresql.v1.primary.fullname" .) -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if a configmap object should be created for PostgreSQL primary with the configuration +*/}} +{{- define "postgresql.v1.primary.createConfigmap" -}} +{{- if and (or .Values.primary.configuration .Values.primary.pgHbaConfiguration) (not .Values.primary.existingConfigmap) -}} + {{- true -}} +{{- else -}} +{{- end -}} +{{- end -}} + +{{/* +Get the PostgreSQL primary extended configuration ConfigMap name. +*/}} +{{- define "postgresql.v1.primary.extendedConfigmapName" -}} +{{- if .Values.primary.existingExtendedConfigmap -}} + {{- printf "%s" (tpl .Values.primary.existingExtendedConfigmap $) -}} +{{- else -}} + {{- printf "%s-extended-configuration" (include "postgresql.v1.primary.fullname" .) -}} +{{- end -}} +{{- end -}} + +{{/* +Get the PostgreSQL read replica extended configuration ConfigMap name. +*/}} +{{- define "postgresql.v1.readReplicas.extendedConfigmapName" -}} + {{- printf "%s-extended-configuration" (include "postgresql.v1.readReplica.fullname" .) -}} +{{- end -}} + +{{/* +Return true if a configmap object should be created for PostgreSQL primary with the extended configuration +*/}} +{{- define "postgresql.v1.primary.createExtendedConfigmap" -}} +{{- if and .Values.primary.extendedConfiguration (not .Values.primary.existingExtendedConfigmap) -}} + {{- true -}} +{{- else -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if a configmap object should be created for PostgreSQL read replica with the extended configuration +*/}} +{{- define "postgresql.v1.readReplicas.createExtendedConfigmap" -}} +{{- if .Values.readReplicas.extendedConfiguration -}} + {{- true -}} +{{- else -}} +{{- end -}} +{{- end -}} + +{{/* + Create the name of the service account to use + */}} +{{- define "postgresql.v1.serviceAccountName" -}} +{{- if .Values.serviceAccount.create -}} + {{ default (include "common.names.fullname" .) .Values.serviceAccount.name }} +{{- else -}} + {{ default "default" .Values.serviceAccount.name }} +{{- end -}} +{{- end -}} + +{{/* +Return true if a configmap should be mounted with PostgreSQL configuration +*/}} +{{- define "postgresql.v1.mountConfigurationCM" -}} +{{- if or .Values.primary.configuration .Values.primary.pgHbaConfiguration .Values.primary.existingConfigmap -}} + {{- true -}} +{{- end -}} +{{- end -}} + +{{/* +Get the initialization scripts ConfigMap name. +*/}} +{{- define "postgresql.v1.initdb.scriptsCM" -}} +{{- if .Values.primary.initdb.scriptsConfigMap -}} + {{- printf "%s" (tpl .Values.primary.initdb.scriptsConfigMap $) -}} +{{- else -}} + {{- printf "%s-init-scripts" (include "postgresql.v1.primary.fullname" .) -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if TLS is enabled for LDAP connection +*/}} +{{- define "postgresql.v1.ldap.tls.enabled" -}} +{{- if and (kindIs "string" .Values.ldap.tls) (not (empty .Values.ldap.tls)) -}} + {{- true -}} +{{- else if and (kindIs "map" .Values.ldap.tls) .Values.ldap.tls.enabled -}} + {{- true -}} +{{- end -}} +{{- end -}} + +{{/* +Get the readiness probe command +*/}} +{{- define "postgresql.v1.readinessProbeCommand" -}} +{{- $customUser := include "postgresql.v1.username" . -}} +- | +{{- if (include "postgresql.v1.database" .) }} + exec pg_isready -U {{ default "postgres" $customUser | quote }} -d "dbname={{ include "postgresql.v1.database" . }} {{- if .Values.tls.enabled }} sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}{{- end }}" -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} +{{- else }} + exec pg_isready -U {{ default "postgres" $customUser | quote }} {{- if .Values.tls.enabled }} -d "sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}"{{- end }} -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} +{{- end }} +{{- if contains "bitnami/" .Values.image.repository }} + [ -f /opt/bitnami/postgresql/tmp/.initialized ] || [ -f /bitnami/postgresql/.initialized ] +{{- end }} +{{- end -}} + +{{/* +Compile all warnings into a single message, and call fail. +*/}} +{{- define "postgresql.v1.validateValues" -}} +{{- $messages := list -}} +{{- $messages := append $messages (include "postgresql.v1.validateValues.ldapConfigurationMethod" .) -}} +{{- $messages := append $messages (include "postgresql.v1.validateValues.psp" .) -}} +{{- $messages := without $messages "" -}} +{{- $message := join "\n" $messages -}} + +{{- if $message -}} +{{- printf "\nVALUES VALIDATION:\n%s" $message | fail -}} +{{- end -}} +{{- end -}} + +{{/* +Validate values of Postgresql - If ldap.url is used then you don't need the other settings for ldap +*/}} +{{- define "postgresql.v1.validateValues.ldapConfigurationMethod" -}} +{{- if and .Values.ldap.enabled (and (not (empty .Values.ldap.url)) (not (empty .Values.ldap.server))) -}} +postgresql: ldap.url, ldap.server + You cannot set both `ldap.url` and `ldap.server` at the same time. + Please provide a unique way to configure LDAP. + More info at https://www.postgresql.org/docs/current/auth-ldap.html +{{- end -}} +{{- end -}} + +{{/* +Validate values of Postgresql - If PSP is enabled RBAC should be enabled too +*/}} +{{- define "postgresql.v1.validateValues.psp" -}} +{{- if and .Values.psp.create (not .Values.rbac.create) -}} +postgresql: psp.create, rbac.create + RBAC should be enabled if PSP is enabled in order for PSP to work. + More info at https://kubernetes.io/docs/concepts/policy/pod-security-policy/#authorizing-policies +{{- end -}} +{{- end -}} + +{{/* +Return the path to the cert file. +*/}} +{{- define "postgresql.v1.tlsCert" -}} +{{- if .Values.tls.autoGenerated -}} + {{- printf "/opt/bitnami/postgresql/certs/tls.crt" -}} +{{- else -}} + {{- required "Certificate filename is required when TLS in enabled" .Values.tls.certFilename | printf "/opt/bitnami/postgresql/certs/%s" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the path to the cert key file. +*/}} +{{- define "postgresql.v1.tlsCertKey" -}} +{{- if .Values.tls.autoGenerated -}} + {{- printf "/opt/bitnami/postgresql/certs/tls.key" -}} +{{- else -}} +{{- required "Certificate Key filename is required when TLS in enabled" .Values.tls.certKeyFilename | printf "/opt/bitnami/postgresql/certs/%s" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the path to the CA cert file. +*/}} +{{- define "postgresql.v1.tlsCACert" -}} +{{- if .Values.tls.autoGenerated -}} + {{- printf "/opt/bitnami/postgresql/certs/ca.crt" -}} +{{- else -}} + {{- printf "/opt/bitnami/postgresql/certs/%s" .Values.tls.certCAFilename -}} +{{- end -}} +{{- end -}} + +{{/* +Return the path to the CRL file. +*/}} +{{- define "postgresql.v1.tlsCRL" -}} +{{- if .Values.tls.crlFilename -}} +{{- printf "/opt/bitnami/postgresql/certs/%s" .Values.tls.crlFilename -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if a TLS credentials secret object should be created +*/}} +{{- define "postgresql.v1.createTlsSecret" -}} +{{- if and .Values.tls.autoGenerated (not .Values.tls.certificatesSecret) -}} + {{- true -}} +{{- end -}} +{{- end -}} + +{{/* +Return the path to the CA cert file. +*/}} +{{- define "postgresql.v1.tlsSecretName" -}} +{{- if .Values.tls.autoGenerated -}} + {{- printf "%s-crt" (include "common.names.fullname" .) -}} +{{- else -}} + {{ required "A secret containing TLS certificates is required when TLS is enabled" .Values.tls.certificatesSecret }} +{{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/backup/cronjob.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/backup/cronjob.yaml new file mode 100644 index 000000000..cdf87f743 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/backup/cronjob.yaml @@ -0,0 +1,114 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if .Values.backup.enabled }} +{{- $customUser := include "postgresql.v1.username" . }} +apiVersion: batch/v1 +kind: CronJob +metadata: + name: {{ include "postgresql.v1.primary.fullname" . }}-pgdumpall + namespace: {{ .Release.Namespace | quote }} + {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.backup.cronjob.labels .Values.commonLabels ) "context" . ) }} + labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: pg_dumpall + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.backup.cronjob.annotations .Values.commonAnnotations ) "context" . ) }} + {{- if $annotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} +spec: + schedule: {{ quote .Values.backup.cronjob.schedule }} + {{- if .Values.backup.cronjob.timezone }} + timeZone: {{ .Values.backup.cronjob.timezone | quote }} + {{- end }} + concurrencyPolicy: {{ .Values.backup.cronjob.concurrencyPolicy }} + failedJobsHistoryLimit: {{ .Values.backup.cronjob.failedJobsHistoryLimit }} + successfulJobsHistoryLimit: {{ .Values.backup.cronjob.successfulJobsHistoryLimit }} + {{- if .Values.backup.cronjob.startingDeadlineSeconds }} + startingDeadlineSeconds: {{ .Values.backup.cronjob.startingDeadlineSeconds }} + {{- end }} + jobTemplate: + spec: + {{- if .Values.backup.cronjob.ttlSecondsAfterFinished }} + ttlSecondsAfterFinished: {{ .Values.backup.cronjob.ttlSecondsAfterFinished }} + {{- end }} + template: + metadata: + labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 12 }} + app.kubernetes.io/component: pg_dumpall + {{- if $annotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 12 }} + {{- end }} + spec: + {{- include "postgresql.v1.imagePullSecrets" . | nindent 10 }} + {{- if .Values.backup.cronjob.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.backup.cronjob.nodeSelector "context" $) | nindent 12 }} + {{- end }} + containers: + - name: {{ include "postgresql.v1.primary.fullname" . }}-pgdumpall + image: {{ include "postgresql.v1.image" . }} + imagePullPolicy: {{ .Values.image.pullPolicy | quote }} + env: + - name: PGUSER + {{- if .Values.auth.enablePostgresUser }} + value: postgres + {{- else }} + value: {{ $customUser | quote }} + {{- end }} + {{- if .Values.auth.usePasswordFiles }} + - name: PGPASSFILE + value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.adminPasswordKey" .) }} + {{- else }} + - name: PGPASSWORD + valueFrom: + secretKeyRef: + name: {{ include "postgresql.v1.secretName" . }} + key: {{ include "postgresql.v1.adminPasswordKey" . }} + {{- end }} + - name: PGHOST + value: {{ include "postgresql.v1.primary.fullname" . }} + - name: PGPORT + value: {{ include "postgresql.v1.service.port" . | quote }} + - name: PGDUMP_DIR + value: {{ .Values.backup.cronjob.storage.mountPath }} + {{- if .Values.tls.enabled }} + - name: PGSSLROOTCERT + {{- if .Values.tls.autoGenerated }} + value: /tmp/certs/ca.crt + {{- else }} + value: {{- printf "/tmp/certs/%s" .Values.tls.certCAFilename -}} + {{- end }} + {{- end }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.backup.cronjob.command "context" $) | nindent 14 }} + volumeMounts: + {{- if .Values.tls.enabled }} + - name: certs + mountPath: /certs + {{- end }} + - name: datadir + mountPath: {{ .Values.backup.cronjob.storage.mountPath }} + subPath: {{ .Values.backup.cronjob.storage.subPath }} + {{- if .Values.backup.cronjob.containerSecurityContext.enabled }} + securityContext: {{- omit .Values.backup.cronjob.containerSecurityContext "enabled" | toYaml | nindent 14 }} + {{- end }} + restartPolicy: {{ .Values.backup.cronjob.restartPolicy }} + {{- if .Values.backup.cronjob.podSecurityContext.enabled }} + securityContext: + fsGroup: {{ .Values.backup.cronjob.podSecurityContext.fsGroup }} + {{- end }} + volumes: + {{- if .Values.tls.enabled }} + - name: raw-certificates + emptyDir: /tmp/certs + {{- end }} + {{- if .Values.backup.cronjob.storage.existingClaim }} + - name: datadir + persistentVolumeClaim: + claimName: {{ printf "%s" (tpl .Values.backup.cronjob.storage.existingClaim .) }} + {{- else }} + - name: datadir + persistentVolumeClaim: + claimName: {{ include "postgresql.v1.primary.fullname" . }}-pgdumpall + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/backup/pvc.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/backup/pvc.yaml new file mode 100644 index 000000000..6fe9cbf76 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/backup/pvc.yaml @@ -0,0 +1,34 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.backup.enabled (not .Values.backup.cronjob.storage.existingClaim) -}} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "postgresql.v1.primary.fullname" . }}-pgdumpall + namespace: {{ .Release.Namespace | quote }} + {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.backup.cronjob.labels .Values.commonLabels ) "context" . ) }} + labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: pg_dumpall + {{- if or .Values.backup.cronjob.annotations .Values.commonAnnotations .Values.backup.cronjob.storage.resourcePolicy }} + annotations: + {{- if or .Values.backup.cronjob.annotations .Values.commonAnnotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.backup.cronjob.annotations .Values.commonAnnotations ) "context" . ) }} + {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} + {{- if .Values.backup.cronjob.storage.resourcePolicy }} + helm.sh/resource-policy: {{ .Values.backup.cronjob.storage.resourcePolicy | quote }} + {{- end }} + {{- end }} +spec: + accessModes: + {{- range .Values.backup.cronjob.storage.accessModes }} + - {{ . | quote }} + {{- end }} + resources: + requests: + storage: {{ .Values.backup.cronjob.storage.size | quote }} + {{ include "common.storage.class" (dict "persistence" .Values.backup.cronjob.storage "global" .Values.global) }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/extra-list.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/extra-list.yaml new file mode 100644 index 000000000..2d35a580e --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/extra-list.yaml @@ -0,0 +1,9 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- range .Values.extraDeploy }} +--- +{{ include "common.tplvalues.render" (dict "value" . "context" $) }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/networkpolicy-egress.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/networkpolicy-egress.yaml new file mode 100644 index 000000000..b67817c05 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/networkpolicy-egress.yaml @@ -0,0 +1,34 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.networkPolicy.enabled (or .Values.networkPolicy.egressRules.denyConnectionsToExternal .Values.networkPolicy.egressRules.customRules) }} +apiVersion: {{ include "common.capabilities.networkPolicy.apiVersion" . }} +kind: NetworkPolicy +metadata: + name: {{ printf "%s-egress" (include "common.names.fullname" .) }} + namespace: {{ .Release.Namespace }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + podSelector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 6 }} + policyTypes: + - Egress + egress: + {{- if .Values.networkPolicy.egressRules.denyConnectionsToExternal }} + - ports: + - port: 53 + protocol: UDP + - port: 53 + protocol: TCP + - to: + - namespaceSelector: {} + {{- end }} + {{- if .Values.networkPolicy.egressRules.customRules }} + {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.egressRules.customRules "context" $) | nindent 4 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/configmap.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/configmap.yaml new file mode 100644 index 000000000..7a69891c9 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/configmap.yaml @@ -0,0 +1,26 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if (include "postgresql.v1.primary.createConfigmap" .) }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ printf "%s-configuration" (include "postgresql.v1.primary.fullname" .) }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: primary + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +data: + {{- if .Values.primary.configuration }} + postgresql.conf: | + {{- include "common.tplvalues.render" ( dict "value" .Values.primary.configuration "context" $ ) | nindent 4 }} + {{- end }} + {{- if .Values.primary.pgHbaConfiguration }} + pg_hba.conf: | + {{- include "common.tplvalues.render" ( dict "value" .Values.primary.pgHbaConfiguration "context" $ ) | nindent 4 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/extended-configmap.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/extended-configmap.yaml new file mode 100644 index 000000000..456f8ee55 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/extended-configmap.yaml @@ -0,0 +1,20 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if (include "postgresql.v1.primary.createExtendedConfigmap" .) }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ printf "%s-extended-configuration" (include "postgresql.v1.primary.fullname" .) }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: primary + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +data: + override.conf: |- + {{- include "common.tplvalues.render" ( dict "value" .Values.primary.extendedConfiguration "context" $ ) | nindent 4 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/initialization-configmap.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/initialization-configmap.yaml new file mode 100644 index 000000000..80d804a0f --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/initialization-configmap.yaml @@ -0,0 +1,17 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.primary.initdb.scripts (not .Values.primary.initdb.scriptsConfigMap) }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ printf "%s-init-scripts" (include "postgresql.v1.primary.fullname" .) }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +data: {{- include "common.tplvalues.render" (dict "value" .Values.primary.initdb.scripts "context" .) | nindent 2 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/metrics-configmap.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/metrics-configmap.yaml new file mode 100644 index 000000000..7da2bcd26 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/metrics-configmap.yaml @@ -0,0 +1,18 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.metrics.enabled .Values.metrics.customMetrics }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ printf "%s-metrics" (include "postgresql.v1.primary.fullname" .) }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +data: + custom-metrics.yaml: {{ toYaml .Values.metrics.customMetrics | quote }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/metrics-svc.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/metrics-svc.yaml new file mode 100644 index 000000000..3d94510c7 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/metrics-svc.yaml @@ -0,0 +1,31 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if .Values.metrics.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ printf "%s-metrics" (include "postgresql.v1.primary.fullname" .) }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: metrics + {{- if or .Values.commonAnnotations .Values.metrics.service.annotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.metrics.service.annotations .Values.commonAnnotations ) "context" . ) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} +spec: + type: ClusterIP + sessionAffinity: {{ .Values.metrics.service.sessionAffinity }} + {{- if .Values.metrics.service.clusterIP }} + clusterIP: {{ .Values.metrics.service.clusterIP }} + {{- end }} + ports: + - name: http-metrics + port: {{ .Values.metrics.service.ports.metrics }} + targetPort: http-metrics + {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.primary.podLabels .Values.commonLabels ) "context" . ) }} + selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: primary +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/networkpolicy.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/networkpolicy.yaml new file mode 100644 index 000000000..9da3fb491 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/networkpolicy.yaml @@ -0,0 +1,61 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.networkPolicy.enabled (or .Values.networkPolicy.metrics.enabled .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.enabled) }} +apiVersion: {{ include "common.capabilities.networkPolicy.apiVersion" . }} +kind: NetworkPolicy +metadata: + name: {{ printf "%s-ingress" (include "postgresql.v1.primary.fullname" .) }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: primary + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + {{- $primaryPodLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.primary.podLabels .Values.commonLabels ) "context" . ) }} + podSelector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $primaryPodLabels "context" $ ) | nindent 6 }} + app.kubernetes.io/component: primary + ingress: + {{- if and .Values.metrics.enabled .Values.networkPolicy.metrics.enabled (or .Values.networkPolicy.metrics.namespaceSelector .Values.networkPolicy.metrics.podSelector) }} + - from: + {{- if .Values.networkPolicy.metrics.namespaceSelector }} + - namespaceSelector: + matchLabels: {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.metrics.namespaceSelector "context" $) | nindent 14 }} + {{- end }} + {{- if .Values.networkPolicy.metrics.podSelector }} + - podSelector: + matchLabels: {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.metrics.podSelector "context" $) | nindent 14 }} + {{- end }} + ports: + - port: {{ .Values.metrics.containerPorts.metrics }} + {{- end }} + {{- if and .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.enabled (or .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.namespaceSelector .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.podSelector) }} + - from: + {{- if .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.namespaceSelector }} + - namespaceSelector: + matchLabels: {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.namespaceSelector "context" $) | nindent 14 }} + {{- end }} + {{- if .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.podSelector }} + - podSelector: + matchLabels: {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.podSelector "context" $) | nindent 14 }} + {{- end }} + ports: + - port: {{ .Values.containerPorts.postgresql }} + {{- end }} + {{- if and .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.enabled (eq .Values.architecture "replication") }} + - from: + {{- $readPodLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.podLabels .Values.commonLabels ) "context" . ) }} + - podSelector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $readPodLabels "context" $ ) | nindent 14 }} + app.kubernetes.io/component: read + ports: + - port: {{ .Values.containerPorts.postgresql }} + {{- end }} + {{- if .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.customRules }} + {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.customRules "context" $) | nindent 4 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/servicemonitor.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/servicemonitor.yaml new file mode 100644 index 000000000..05d54f3b3 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/servicemonitor.yaml @@ -0,0 +1,46 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ include "postgresql.v1.primary.fullname" . }} + namespace: {{ default .Release.Namespace .Values.metrics.serviceMonitor.namespace | quote }} + {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.metrics.serviceMonitor.labels .Values.commonLabels ) "context" . ) }} + labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: metrics + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + {{- if .Values.metrics.serviceMonitor.jobLabel }} + jobLabel: {{ .Values.metrics.serviceMonitor.jobLabel }} + {{- end }} + selector: + {{- $svcLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.metrics.serviceMonitor.selector .Values.commonLabels ) "context" . ) }} + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $svcLabels "context" $ ) | nindent 6 }} + app.kubernetes.io/component: metrics + endpoints: + - port: http-metrics + {{- if .Values.metrics.serviceMonitor.interval }} + interval: {{ .Values.metrics.serviceMonitor.interval }} + {{- end }} + {{- if .Values.metrics.serviceMonitor.scrapeTimeout }} + scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }} + {{- end }} + {{- if .Values.metrics.serviceMonitor.relabelings }} + relabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.relabelings "context" $) | nindent 6 }} + {{- end }} + {{- if .Values.metrics.serviceMonitor.metricRelabelings }} + metricRelabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.metricRelabelings "context" $) | nindent 6 }} + {{- end }} + {{- if .Values.metrics.serviceMonitor.honorLabels }} + honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }} + {{- end }} + namespaceSelector: + matchNames: + - {{ .Release.Namespace | quote }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/statefulset.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/statefulset.yaml new file mode 100644 index 000000000..1f0c96203 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/statefulset.yaml @@ -0,0 +1,662 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- $customUser := include "postgresql.v1.username" . }} +apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }} +kind: StatefulSet +metadata: + name: {{ include "postgresql.v1.primary.fullname" . }} + namespace: {{ .Release.Namespace | quote }} + {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.primary.labels .Values.commonLabels ) "context" . ) }} + labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: primary + {{- if or .Values.commonAnnotations .Values.primary.annotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.primary.annotations .Values.commonAnnotations ) "context" . ) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} +spec: + replicas: 1 + serviceName: {{ include "postgresql.v1.primary.svc.headless" . }} + {{- if .Values.primary.updateStrategy }} + updateStrategy: {{- toYaml .Values.primary.updateStrategy | nindent 4 }} + {{- end }} + {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.primary.podLabels .Values.commonLabels ) "context" . ) }} + selector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }} + app.kubernetes.io/component: primary + template: + metadata: + name: {{ include "postgresql.v1.primary.fullname" . }} + labels: {{- include "common.labels.standard" ( dict "customLabels" $podLabels "context" $ ) | nindent 8 }} + app.kubernetes.io/component: primary + {{- if or (include "postgresql.v1.primary.createConfigmap" .) (include "postgresql.v1.primary.createExtendedConfigmap" .) .Values.primary.podAnnotations }} + annotations: + {{- if (include "postgresql.v1.primary.createConfigmap" .) }} + checksum/configuration: {{ pick (include (print $.Template.BasePath "/primary/configmap.yaml") . | fromYaml) "data" | toYaml | sha256sum }} + {{- end }} + {{- if (include "postgresql.v1.primary.createExtendedConfigmap" .) }} + checksum/extended-configuration: {{ pick (include (print $.Template.BasePath "/primary/extended-configmap.yaml") . | fromYaml) "data" | toYaml | sha256sum }} + {{- end }} + {{- if .Values.primary.podAnnotations }} + {{- include "common.tplvalues.render" ( dict "value" .Values.primary.podAnnotations "context" $ ) | nindent 8 }} + {{- end }} + {{- end }} + spec: + {{- if .Values.primary.extraPodSpec }} + {{- include "common.tplvalues.render" (dict "value" .Values.primary.extraPodSpec "context" $) | nindent 6 }} + {{- end }} + serviceAccountName: {{ include "postgresql.v1.serviceAccountName" . }} + {{- include "postgresql.v1.imagePullSecrets" . | nindent 6 }} + automountServiceAccountToken: {{ .Values.primary.automountServiceAccountToken }} + {{- if .Values.primary.hostAliases }} + hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.primary.hostAliases "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.primary.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.primary.affinity "context" $) | nindent 8 }} + {{- else }} + affinity: + podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.primary.podAffinityPreset "component" "primary" "customLabels" $podLabels "context" $) | nindent 10 }} + podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.primary.podAntiAffinityPreset "component" "primary" "customLabels" $podLabels "context" $) | nindent 10 }} + nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.primary.nodeAffinityPreset.type "key" .Values.primary.nodeAffinityPreset.key "values" .Values.primary.nodeAffinityPreset.values) | nindent 10 }} + {{- end }} + {{- if .Values.primary.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.primary.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.primary.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.primary.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.primary.topologySpreadConstraints }} + topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.primary.topologySpreadConstraints "context" .) | nindent 8 }} + {{- end }} + {{- if .Values.primary.priorityClassName }} + priorityClassName: {{ .Values.primary.priorityClassName }} + {{- end }} + {{- if .Values.primary.schedulerName }} + schedulerName: {{ .Values.primary.schedulerName | quote }} + {{- end }} + {{- if .Values.primary.terminationGracePeriodSeconds }} + terminationGracePeriodSeconds: {{ .Values.primary.terminationGracePeriodSeconds }} + {{- end }} + {{- if .Values.primary.podSecurityContext.enabled }} + securityContext: {{- omit .Values.primary.podSecurityContext "enabled" | toYaml | nindent 8 }} + {{- end }} + hostNetwork: {{ .Values.primary.hostNetwork }} + hostIPC: {{ .Values.primary.hostIPC }} + {{- if or (and .Values.tls.enabled (not .Values.volumePermissions.enabled)) (and .Values.volumePermissions.enabled (or .Values.primary.persistence.enabled .Values.shmVolume.enabled)) .Values.primary.initContainers }} + initContainers: + {{- if and .Values.tls.enabled (not .Values.volumePermissions.enabled) }} + - name: copy-certs + image: {{ include "postgresql.v1.volumePermissions.image" . }} + imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }} + {{- if .Values.primary.resources }} + resources: {{- toYaml .Values.primary.resources | nindent 12 }} + {{- end }} + # We don't require a privileged container in this case + {{- if .Values.primary.containerSecurityContext.enabled }} + securityContext: {{- omit .Values.primary.containerSecurityContext "enabled" | toYaml | nindent 12 }} + {{- end }} + command: + - /bin/sh + - -ec + - | + cp /tmp/certs/* /opt/bitnami/postgresql/certs/ + chmod 600 {{ include "postgresql.v1.tlsCertKey" . }} + volumeMounts: + - name: raw-certificates + mountPath: /tmp/certs + - name: postgresql-certificates + mountPath: /opt/bitnami/postgresql/certs + {{- else if and .Values.volumePermissions.enabled (or .Values.primary.persistence.enabled .Values.shmVolume.enabled) }} + - name: init-chmod-data + image: {{ include "postgresql.v1.volumePermissions.image" . }} + imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }} + {{- if .Values.volumePermissions.resources }} + resources: {{- toYaml .Values.volumePermissions.resources | nindent 12 }} + {{- end }} + command: + - /bin/sh + - -ec + - | + {{- if .Values.primary.persistence.enabled }} + {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} + chown `id -u`:`id -G | cut -d " " -f2` {{ .Values.primary.persistence.mountPath }} + {{- else }} + chown {{ .Values.primary.containerSecurityContext.runAsUser }}:{{ .Values.primary.podSecurityContext.fsGroup }} {{ .Values.primary.persistence.mountPath }} + {{- end }} + mkdir -p {{ .Values.primary.persistence.mountPath }}/data {{- if (include "postgresql.v1.mountConfigurationCM" .) }} {{ .Values.primary.persistence.mountPath }}/conf {{- end }} + chmod 700 {{ .Values.primary.persistence.mountPath }}/data {{- if (include "postgresql.v1.mountConfigurationCM" .) }} {{ .Values.primary.persistence.mountPath }}/conf {{- end }} + find {{ .Values.primary.persistence.mountPath }} -mindepth 1 -maxdepth 1 {{- if not (include "postgresql.v1.mountConfigurationCM" .) }} -not -name "conf" {{- end }} -not -name ".snapshot" -not -name "lost+found" | \ + {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} + xargs -r chown -R `id -u`:`id -G | cut -d " " -f2` + {{- else }} + xargs -r chown -R {{ .Values.primary.containerSecurityContext.runAsUser }}:{{ .Values.primary.podSecurityContext.fsGroup }} + {{- end }} + {{- end }} + {{- if .Values.shmVolume.enabled }} + chmod -R 777 /dev/shm + {{- end }} + {{- if .Values.tls.enabled }} + cp /tmp/certs/* /opt/bitnami/postgresql/certs/ + {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} + chown -R `id -u`:`id -G | cut -d " " -f2` /opt/bitnami/postgresql/certs/ + {{- else }} + chown -R {{ .Values.primary.containerSecurityContext.runAsUser }}:{{ .Values.primary.podSecurityContext.fsGroup }} /opt/bitnami/postgresql/certs/ + {{- end }} + chmod 600 {{ include "postgresql.v1.tlsCertKey" . }} + {{- end }} + {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} + securityContext: {{- omit .Values.volumePermissions.containerSecurityContext "runAsUser" | toYaml | nindent 12 }} + {{- else }} + securityContext: {{- .Values.volumePermissions.containerSecurityContext | toYaml | nindent 12 }} + {{- end }} + volumeMounts: + {{- if .Values.primary.persistence.enabled }} + - name: data + mountPath: {{ .Values.primary.persistence.mountPath }} + {{- if .Values.primary.persistence.subPath }} + subPath: {{ .Values.primary.persistence.subPath }} + {{- end }} + {{- end }} + {{- if .Values.shmVolume.enabled }} + - name: dshm + mountPath: /dev/shm + {{- end }} + {{- if .Values.tls.enabled }} + - name: raw-certificates + mountPath: /tmp/certs + - name: postgresql-certificates + mountPath: /opt/bitnami/postgresql/certs + {{- end }} + {{- end }} + {{- if .Values.primary.initContainers }} + {{- include "common.tplvalues.render" ( dict "value" .Values.primary.initContainers "context" $ ) | nindent 8 }} + {{- end }} + {{- end }} + containers: + - name: postgresql + image: {{ include "postgresql.v1.image" . }} + imagePullPolicy: {{ .Values.image.pullPolicy | quote }} + {{- if .Values.primary.containerSecurityContext.enabled }} + securityContext: {{- omit .Values.primary.containerSecurityContext "enabled" | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} + {{- else if .Values.primary.command }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.primary.command "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} + {{- else if .Values.primary.args }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.primary.args "context" $) | nindent 12 }} + {{- end }} + env: + - name: BITNAMI_DEBUG + value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }} + - name: POSTGRESQL_PORT_NUMBER + value: {{ .Values.containerPorts.postgresql | quote }} + - name: POSTGRESQL_VOLUME_DIR + value: {{ .Values.primary.persistence.mountPath | quote }} + {{- if .Values.primary.persistence.mountPath }} + - name: PGDATA + value: {{ .Values.postgresqlDataDir | quote }} + {{- end }} + # Authentication + {{- if or (eq $customUser "postgres") (empty $customUser) }} + {{- if .Values.auth.enablePostgresUser }} + {{- if .Values.auth.usePasswordFiles }} + - name: POSTGRES_PASSWORD_FILE + value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.adminPasswordKey" .) }} + {{- else }} + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "postgresql.v1.secretName" . }} + key: {{ include "postgresql.v1.adminPasswordKey" . }} + {{- end }} + {{- else }} + - name: ALLOW_EMPTY_PASSWORD + value: "true" + {{- end }} + {{- else }} + - name: POSTGRES_USER + value: {{ $customUser | quote }} + {{- if .Values.auth.usePasswordFiles }} + - name: POSTGRES_PASSWORD_FILE + value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.userPasswordKey" .) }} + {{- else }} + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "postgresql.v1.secretName" . }} + key: {{ include "postgresql.v1.userPasswordKey" . }} + {{- end }} + {{- if .Values.auth.enablePostgresUser }} + {{- if .Values.auth.usePasswordFiles }} + - name: POSTGRES_POSTGRES_PASSWORD_FILE + value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.adminPasswordKey" .) }} + {{- else }} + - name: POSTGRES_POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "postgresql.v1.secretName" . }} + key: {{ include "postgresql.v1.adminPasswordKey" . }} + {{- end }} + {{- end }} + {{- end }} + {{- if (include "postgresql.v1.database" .) }} + - name: POSTGRES_DATABASE + value: {{ (include "postgresql.v1.database" .) | quote }} + {{- end }} + # Replication + {{- if or (eq .Values.architecture "replication") .Values.primary.standby.enabled }} + - name: POSTGRES_REPLICATION_MODE + value: {{ ternary "slave" "master" .Values.primary.standby.enabled | quote }} + - name: POSTGRES_REPLICATION_USER + value: {{ .Values.auth.replicationUsername | quote }} + {{- if .Values.auth.usePasswordFiles }} + - name: POSTGRES_REPLICATION_PASSWORD_FILE + value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.replicationPasswordKey" .) }} + {{- else }} + - name: POSTGRES_REPLICATION_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "postgresql.v1.secretName" . }} + key: {{ include "postgresql.v1.replicationPasswordKey" . }} + {{- end }} + {{- if ne .Values.replication.synchronousCommit "off" }} + - name: POSTGRES_SYNCHRONOUS_COMMIT_MODE + value: {{ .Values.replication.synchronousCommit | quote }} + - name: POSTGRES_NUM_SYNCHRONOUS_REPLICAS + value: {{ .Values.replication.numSynchronousReplicas | quote }} + {{- end }} + - name: POSTGRES_CLUSTER_APP_NAME + value: {{ .Values.replication.applicationName }} + {{- end }} + # Initdb + {{- if .Values.primary.initdb.args }} + - name: POSTGRES_INITDB_ARGS + value: {{ .Values.primary.initdb.args | quote }} + {{- end }} + {{- if .Values.primary.initdb.postgresqlWalDir }} + - name: POSTGRES_INITDB_WALDIR + value: {{ .Values.primary.initdb.postgresqlWalDir | quote }} + {{- end }} + {{- if .Values.primary.initdb.user }} + - name: POSTGRES_INITSCRIPTS_USERNAME + value: {{ .Values.primary.initdb.user }} + {{- end }} + {{- if .Values.primary.initdb.password }} + - name: POSTGRES_INITSCRIPTS_PASSWORD + value: {{ .Values.primary.initdb.password | quote }} + {{- end }} + # Standby + {{- if .Values.primary.standby.enabled }} + - name: POSTGRES_MASTER_HOST + value: {{ .Values.primary.standby.primaryHost }} + - name: POSTGRES_MASTER_PORT_NUMBER + value: {{ .Values.primary.standby.primaryPort | quote }} + {{- end }} + # LDAP + - name: POSTGRESQL_ENABLE_LDAP + value: {{ ternary "yes" "no" .Values.ldap.enabled | quote }} + {{- if .Values.ldap.enabled }} + {{- if or .Values.ldap.url .Values.ldap.uri }} + - name: POSTGRESQL_LDAP_URL + value: {{ coalesce .Values.ldap.url .Values.ldap.uri }} + {{- else }} + - name: POSTGRESQL_LDAP_SERVER + value: {{ .Values.ldap.server }} + - name: POSTGRESQL_LDAP_PORT + value: {{ .Values.ldap.port | quote }} + - name: POSTGRESQL_LDAP_SCHEME + value: {{ .Values.ldap.scheme }} + {{- if (include "postgresql.v1.ldap.tls.enabled" .) }} + - name: POSTGRESQL_LDAP_TLS + value: "1" + {{- end }} + - name: POSTGRESQL_LDAP_PREFIX + value: {{ .Values.ldap.prefix | quote }} + - name: POSTGRESQL_LDAP_SUFFIX + value: {{ .Values.ldap.suffix | quote }} + - name: POSTGRESQL_LDAP_BASE_DN + value: {{ coalesce .Values.ldap.baseDN .Values.ldap.basedn }} + - name: POSTGRESQL_LDAP_BIND_DN + value: {{ coalesce .Values.ldap.bindDN .Values.ldap.binddn}} + {{- if or (not (empty .Values.ldap.bind_password)) (not (empty .Values.ldap.bindpw)) }} + - name: POSTGRESQL_LDAP_BIND_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "postgresql.v1.secretName" . }} + key: ldap-password + {{- end }} + - name: POSTGRESQL_LDAP_SEARCH_ATTR + value: {{ coalesce .Values.ldap.search_attr .Values.ldap.searchAttribute }} + - name: POSTGRESQL_LDAP_SEARCH_FILTER + value: {{ coalesce .Values.ldap.search_filter .Values.ldap.searchFilter }} + {{- end }} + {{- end }} + # TLS + - name: POSTGRESQL_ENABLE_TLS + value: {{ ternary "yes" "no" .Values.tls.enabled | quote }} + {{- if .Values.tls.enabled }} + - name: POSTGRESQL_TLS_PREFER_SERVER_CIPHERS + value: {{ ternary "yes" "no" .Values.tls.preferServerCiphers | quote }} + - name: POSTGRESQL_TLS_CERT_FILE + value: {{ include "postgresql.v1.tlsCert" . }} + - name: POSTGRESQL_TLS_KEY_FILE + value: {{ include "postgresql.v1.tlsCertKey" . }} + {{- if .Values.tls.certCAFilename }} + - name: POSTGRESQL_TLS_CA_FILE + value: {{ include "postgresql.v1.tlsCACert" . }} + {{- end }} + {{- if .Values.tls.crlFilename }} + - name: POSTGRESQL_TLS_CRL_FILE + value: {{ include "postgresql.v1.tlsCRL" . }} + {{- end }} + {{- end }} + # Audit + - name: POSTGRESQL_LOG_HOSTNAME + value: {{ .Values.audit.logHostname | quote }} + - name: POSTGRESQL_LOG_CONNECTIONS + value: {{ .Values.audit.logConnections | quote }} + - name: POSTGRESQL_LOG_DISCONNECTIONS + value: {{ .Values.audit.logDisconnections | quote }} + {{- if .Values.audit.logLinePrefix }} + - name: POSTGRESQL_LOG_LINE_PREFIX + value: {{ .Values.audit.logLinePrefix | quote }} + {{- end }} + {{- if .Values.audit.logTimezone }} + - name: POSTGRESQL_LOG_TIMEZONE + value: {{ .Values.audit.logTimezone | quote }} + {{- end }} + {{- if .Values.audit.pgAuditLog }} + - name: POSTGRESQL_PGAUDIT_LOG + value: {{ .Values.audit.pgAuditLog | quote }} + {{- end }} + - name: POSTGRESQL_PGAUDIT_LOG_CATALOG + value: {{ .Values.audit.pgAuditLogCatalog | quote }} + # Others + - name: POSTGRESQL_CLIENT_MIN_MESSAGES + value: {{ .Values.audit.clientMinMessages | quote }} + - name: POSTGRESQL_SHARED_PRELOAD_LIBRARIES + value: {{ .Values.postgresqlSharedPreloadLibraries | quote }} + {{- if .Values.primary.extraEnvVars }} + {{- include "common.tplvalues.render" (dict "value" .Values.primary.extraEnvVars "context" $) | nindent 12 }} + {{- end }} + {{- if or .Values.primary.extraEnvVarsCM .Values.primary.extraEnvVarsSecret }} + envFrom: + {{- if .Values.primary.extraEnvVarsCM }} + - configMapRef: + name: {{ .Values.primary.extraEnvVarsCM }} + {{- end }} + {{- if .Values.primary.extraEnvVarsSecret }} + - secretRef: + name: {{ .Values.primary.extraEnvVarsSecret }} + {{- end }} + {{- end }} + ports: + - name: tcp-postgresql + containerPort: {{ .Values.containerPorts.postgresql }} + {{- if not .Values.diagnosticMode.enabled }} + {{- if .Values.primary.customStartupProbe }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.primary.customStartupProbe "context" $) | nindent 12 }} + {{- else if .Values.primary.startupProbe.enabled }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.primary.startupProbe "enabled") "context" $) | nindent 12 }} + exec: + command: + - /bin/sh + - -c + {{- if (include "postgresql.v1.database" .) }} + - exec pg_isready -U {{ default "postgres" $customUser | quote }} -d "dbname={{ include "postgresql.v1.database" . }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}{{- end }}" -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} + {{- else }} + - exec pg_isready -U {{ default "postgres" $customUser | quote }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} -d "sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}"{{- end }} -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} + {{- end }} + {{- end }} + {{- if .Values.primary.customLivenessProbe }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.primary.customLivenessProbe "context" $) | nindent 12 }} + {{- else if .Values.primary.livenessProbe.enabled }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.primary.livenessProbe "enabled") "context" $) | nindent 12 }} + exec: + command: + - /bin/sh + - -c + {{- if (include "postgresql.v1.database" .) }} + - exec pg_isready -U {{ default "postgres" $customUser | quote }} -d "dbname={{ include "postgresql.v1.database" . }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}{{- end }}" -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} + {{- else }} + - exec pg_isready -U {{ default "postgres" $customUser | quote }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} -d "sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}"{{- end }} -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} + {{- end }} + {{- end }} + {{- if .Values.primary.customReadinessProbe }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.primary.customReadinessProbe "context" $) | nindent 12 }} + {{- else if .Values.primary.readinessProbe.enabled }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.primary.readinessProbe "enabled") "context" $) | nindent 12 }} + exec: + command: + - /bin/sh + - -c + - -e + {{- include "postgresql.v1.readinessProbeCommand" . | nindent 16 }} + {{- end }} + {{- end }} + {{- if .Values.primary.resources }} + resources: {{- toYaml .Values.primary.resources | nindent 12 }} + {{- end }} + {{- if .Values.primary.lifecycleHooks }} + lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.primary.lifecycleHooks "context" $) | nindent 12 }} + {{- end }} + volumeMounts: + {{- if or .Values.primary.initdb.scriptsConfigMap .Values.primary.initdb.scripts }} + - name: custom-init-scripts + mountPath: /docker-entrypoint-initdb.d/ + {{- end }} + {{- if .Values.primary.initdb.scriptsSecret }} + - name: custom-init-scripts-secret + mountPath: /docker-entrypoint-initdb.d/secret + {{- end }} + {{- if or .Values.primary.extendedConfiguration .Values.primary.existingExtendedConfigmap }} + - name: postgresql-extended-config + mountPath: {{ .Values.primary.persistence.mountPath }}/conf/conf.d/ + {{- end }} + {{- if .Values.auth.usePasswordFiles }} + - name: postgresql-password + mountPath: /opt/bitnami/postgresql/secrets/ + {{- end }} + {{- if .Values.tls.enabled }} + - name: postgresql-certificates + mountPath: /opt/bitnami/postgresql/certs + readOnly: true + {{- end }} + {{- if .Values.shmVolume.enabled }} + - name: dshm + mountPath: /dev/shm + {{- end }} + {{- if .Values.primary.persistence.enabled }} + - name: data + mountPath: {{ .Values.primary.persistence.mountPath }} + {{- if .Values.primary.persistence.subPath }} + subPath: {{ .Values.primary.persistence.subPath }} + {{- end }} + {{- end }} + {{- if or .Values.primary.configuration .Values.primary.pgHbaConfiguration .Values.primary.existingConfigmap }} + - name: postgresql-config + mountPath: {{ .Values.primary.persistence.mountPath }}/conf + {{- end }} + {{- if .Values.primary.extraVolumeMounts }} + {{- include "common.tplvalues.render" (dict "value" .Values.primary.extraVolumeMounts "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.metrics.enabled }} + - name: metrics + image: {{ include "postgresql.v1.metrics.image" . }} + imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }} + {{- if .Values.metrics.containerSecurityContext.enabled }} + securityContext: {{- omit .Values.metrics.containerSecurityContext "enabled" | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} + {{- else if or .Values.metrics.customMetrics .Values.metrics.collectors }} + args: + {{- if .Values.metrics.customMetrics }} + - --extend.query-path + - /conf/custom-metrics.yaml + {{- end }} + {{- range $name, $enabled := .Values.metrics.collectors }} + - --{{ if not $enabled }}no-{{ end }}collector.{{ $name }} + {{- end }} + {{- end }} + env: + {{- $database := required "In order to enable metrics you need to specify a database (.Values.auth.database or .Values.global.postgresql.auth.database)" (include "postgresql.v1.database" .) }} + - name: DATA_SOURCE_URI + value: {{ printf "127.0.0.1:%d/%s?sslmode=disable" (int (include "postgresql.v1.service.port" .)) $database }} + {{- $pwdKey := ternary (include "postgresql.v1.adminPasswordKey" .) (include "postgresql.v1.userPasswordKey" .) (or (eq $customUser "postgres") (empty $customUser)) }} + {{- if .Values.auth.usePasswordFiles }} + - name: DATA_SOURCE_PASS_FILE + value: {{ printf "/opt/bitnami/postgresql/secrets/%s" $pwdKey }} + {{- else }} + - name: DATA_SOURCE_PASS + valueFrom: + secretKeyRef: + name: {{ include "postgresql.v1.secretName" . }} + key: {{ $pwdKey }} + {{- end }} + - name: DATA_SOURCE_USER + value: {{ default "postgres" $customUser | quote }} + {{- if .Values.metrics.extraEnvVars }} + {{- include "common.tplvalues.render" (dict "value" .Values.metrics.extraEnvVars "context" $) | nindent 12 }} + {{- end }} + ports: + - name: http-metrics + containerPort: {{ .Values.metrics.containerPorts.metrics }} + {{- if not .Values.diagnosticMode.enabled }} + {{- if .Values.metrics.customStartupProbe }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customStartupProbe "context" $) | nindent 12 }} + {{- else if .Values.metrics.startupProbe.enabled }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.startupProbe "enabled") "context" $) | nindent 12 }} + tcpSocket: + port: http-metrics + {{- end }} + {{- if .Values.metrics.customLivenessProbe }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customLivenessProbe "context" $) | nindent 12 }} + {{- else if .Values.metrics.livenessProbe.enabled }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.livenessProbe "enabled") "context" $) | nindent 12 }} + httpGet: + path: / + port: http-metrics + {{- end }} + {{- if .Values.metrics.customReadinessProbe }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customReadinessProbe "context" $) | nindent 12 }} + {{- else if .Values.metrics.readinessProbe.enabled }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.readinessProbe "enabled") "context" $) | nindent 12 }} + httpGet: + path: / + port: http-metrics + {{- end }} + {{- end }} + volumeMounts: + {{- if .Values.auth.usePasswordFiles }} + - name: postgresql-password + mountPath: /opt/bitnami/postgresql/secrets/ + {{- end }} + {{- if .Values.metrics.customMetrics }} + - name: custom-metrics + mountPath: /conf + readOnly: true + {{- end }} + {{- if .Values.metrics.resources }} + resources: {{- toYaml .Values.metrics.resources | nindent 12 }} + {{- end }} + {{- end }} + {{- if .Values.primary.sidecars }} + {{- include "common.tplvalues.render" ( dict "value" .Values.primary.sidecars "context" $ ) | nindent 8 }} + {{- end }} + volumes: + {{- if or .Values.primary.configuration .Values.primary.pgHbaConfiguration .Values.primary.existingConfigmap }} + - name: postgresql-config + configMap: + name: {{ include "postgresql.v1.primary.configmapName" . }} + {{- end }} + {{- if or .Values.primary.extendedConfiguration .Values.primary.existingExtendedConfigmap }} + - name: postgresql-extended-config + configMap: + name: {{ include "postgresql.v1.primary.extendedConfigmapName" . }} + {{- end }} + {{- if .Values.auth.usePasswordFiles }} + - name: postgresql-password + secret: + secretName: {{ include "postgresql.v1.secretName" . }} + {{- end }} + {{- if or .Values.primary.initdb.scriptsConfigMap .Values.primary.initdb.scripts }} + - name: custom-init-scripts + configMap: + name: {{ include "postgresql.v1.initdb.scriptsCM" . }} + {{- end }} + {{- if .Values.primary.initdb.scriptsSecret }} + - name: custom-init-scripts-secret + secret: + secretName: {{ tpl .Values.primary.initdb.scriptsSecret $ }} + {{- end }} + {{- if .Values.tls.enabled }} + - name: raw-certificates + secret: + secretName: {{ include "postgresql.v1.tlsSecretName" . }} + - name: postgresql-certificates + emptyDir: {} + {{- end }} + {{- if .Values.primary.extraVolumes }} + {{- include "common.tplvalues.render" ( dict "value" .Values.primary.extraVolumes "context" $ ) | nindent 8 }} + {{- end }} + {{- if and .Values.metrics.enabled .Values.metrics.customMetrics }} + - name: custom-metrics + configMap: + name: {{ printf "%s-metrics" (include "postgresql.v1.primary.fullname" .) }} + {{- end }} + {{- if .Values.shmVolume.enabled }} + - name: dshm + emptyDir: + medium: Memory + {{- if .Values.shmVolume.sizeLimit }} + sizeLimit: {{ .Values.shmVolume.sizeLimit }} + {{- end }} + {{- end }} + {{- if and .Values.primary.persistence.enabled .Values.primary.persistence.existingClaim }} + - name: data + persistentVolumeClaim: + claimName: {{ tpl .Values.primary.persistence.existingClaim $ }} + {{- else if not .Values.primary.persistence.enabled }} + - name: data + emptyDir: {} + {{- else }} + {{- if .Values.primary.persistentVolumeClaimRetentionPolicy.enabled }} + persistentVolumeClaimRetentionPolicy: + whenDeleted: {{ .Values.primary.persistentVolumeClaimRetentionPolicy.whenDeleted }} + whenScaled: {{ .Values.primary.persistentVolumeClaimRetentionPolicy.whenScaled }} + {{- end }} + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: data + {{- if .Values.primary.persistence.annotations }} + annotations: {{- include "common.tplvalues.render" (dict "value" .Values.primary.persistence.annotations "context" $) | nindent 10 }} + {{- end }} + {{- if .Values.primary.persistence.labels }} + labels: {{- include "common.tplvalues.render" (dict "value" .Values.primary.persistence.labels "context" $) | nindent 10 }} + {{- end }} + spec: + accessModes: + {{- range .Values.primary.persistence.accessModes }} + - {{ . | quote }} + {{- end }} + {{- if .Values.primary.persistence.dataSource }} + dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.primary.persistence.dataSource "context" $) | nindent 10 }} + {{- end }} + resources: + requests: + storage: {{ .Values.primary.persistence.size | quote }} + {{- if .Values.primary.persistence.selector }} + selector: {{- include "common.tplvalues.render" (dict "value" .Values.primary.persistence.selector "context" $) | nindent 10 }} + {{- end }} + {{- include "common.storage.class" (dict "persistence" .Values.primary.persistence "global" .Values.global) | nindent 8 }} + {{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/svc-headless.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/svc-headless.yaml new file mode 100644 index 000000000..b18565aea --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/svc-headless.yaml @@ -0,0 +1,36 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +apiVersion: v1 +kind: Service +metadata: + name: {{ include "postgresql.v1.primary.svc.headless" . }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: primary + annotations: + {{- if or .Values.primary.service.headless.annotations .Values.commonAnnotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.primary.service.headless.annotations .Values.commonAnnotations ) "context" . ) }} + {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} + # Use this annotation in addition to the actual publishNotReadyAddresses + # field below because the annotation will stop being respected soon but the + # field is broken in some versions of Kubernetes: + # https://github.com/kubernetes/kubernetes/issues/58662 + service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" +spec: + type: ClusterIP + clusterIP: None + # We want all pods in the StatefulSet to have their addresses published for + # the sake of the other Postgresql pods even before they're ready, since they + # have to be able to talk to each other in order to become ready. + publishNotReadyAddresses: true + ports: + - name: tcp-postgresql + port: {{ template "postgresql.v1.service.port" . }} + targetPort: tcp-postgresql + {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.primary.podLabels .Values.commonLabels ) "context" . ) }} + selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: primary diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/svc.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/svc.yaml new file mode 100644 index 000000000..90f7e4690 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/svc.yaml @@ -0,0 +1,51 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +apiVersion: v1 +kind: Service +metadata: + name: {{ include "postgresql.v1.primary.fullname" . }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: primary + {{- if or .Values.commonAnnotations .Values.primary.service.annotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.primary.service.annotations .Values.commonAnnotations ) "context" . ) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.primary.service.type }} + {{- if or (eq .Values.primary.service.type "LoadBalancer") (eq .Values.primary.service.type "NodePort") }} + externalTrafficPolicy: {{ .Values.primary.service.externalTrafficPolicy | quote }} + {{- end }} + {{- if and (eq .Values.primary.service.type "LoadBalancer") (not (empty .Values.primary.service.loadBalancerSourceRanges)) }} + loadBalancerSourceRanges: {{ .Values.primary.service.loadBalancerSourceRanges | toJson}} + {{- end }} + {{- if and (eq .Values.primary.service.type "LoadBalancer") (not (empty .Values.primary.service.loadBalancerIP)) }} + loadBalancerIP: {{ .Values.primary.service.loadBalancerIP }} + {{- end }} + {{- if and .Values.primary.service.clusterIP (eq .Values.primary.service.type "ClusterIP") }} + clusterIP: {{ .Values.primary.service.clusterIP }} + {{- end }} + {{- if .Values.primary.service.sessionAffinity }} + sessionAffinity: {{ .Values.primary.service.sessionAffinity }} + {{- end }} + {{- if .Values.primary.service.sessionAffinityConfig }} + sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.primary.service.sessionAffinityConfig "context" $) | nindent 4 }} + {{- end }} + ports: + - name: tcp-postgresql + port: {{ template "postgresql.v1.service.port" . }} + targetPort: tcp-postgresql + {{- if and (or (eq .Values.primary.service.type "NodePort") (eq .Values.primary.service.type "LoadBalancer")) (not (empty .Values.primary.service.nodePorts.postgresql)) }} + nodePort: {{ .Values.primary.service.nodePorts.postgresql }} + {{- else if eq .Values.primary.service.type "ClusterIP" }} + nodePort: null + {{- end }} + {{- if .Values.primary.service.extraPorts }} + {{- include "common.tplvalues.render" (dict "value" .Values.primary.service.extraPorts "context" $) | nindent 4 }} + {{- end }} + {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.primary.podLabels .Values.commonLabels ) "context" . ) }} + selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: primary diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/prometheusrule.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/prometheusrule.yaml new file mode 100644 index 000000000..6cdb08732 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/prometheusrule.yaml @@ -0,0 +1,22 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.metrics.enabled .Values.metrics.prometheusRule.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: PrometheusRule +metadata: + name: {{ include "common.names.fullname" . }} + namespace: {{ default .Release.Namespace .Values.metrics.prometheusRule.namespace | quote }} + {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.metrics.prometheusRule.labels .Values.commonLabels ) "context" . ) }} + labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: metrics + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + groups: + - name: {{ include "common.names.fullname" . }} + rules: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.prometheusRule.rules "context" $ ) | nindent 8 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/psp.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/psp.yaml new file mode 100644 index 000000000..2cc1bbf47 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/psp.yaml @@ -0,0 +1,42 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and (include "common.capabilities.psp.supported" .) .Values.psp.create }} +apiVersion: policy/v1beta1 +kind: PodSecurityPolicy +metadata: + name: {{ include "common.names.fullname" . }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + privileged: false + volumes: + - 'configMap' + - 'secret' + - 'persistentVolumeClaim' + - 'emptyDir' + - 'projected' + hostNetwork: false + hostIPC: false + hostPID: false + runAsUser: + rule: 'RunAsAny' + seLinux: + rule: 'RunAsAny' + supplementalGroups: + rule: 'MustRunAs' + ranges: + - min: 1 + max: 65535 + fsGroup: + rule: 'MustRunAs' + ranges: + - min: 1 + max: 65535 + readOnlyRootFilesystem: false +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/extended-configmap.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/extended-configmap.yaml new file mode 100644 index 000000000..efa87bb13 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/extended-configmap.yaml @@ -0,0 +1,20 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if (include "postgresql.v1.readReplicas.createExtendedConfigmap" .) }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ printf "%s-extended-configuration" (include "postgresql.v1.readReplica.fullname" .) }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: read + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +data: + override.conf: |- + {{- include "common.tplvalues.render" ( dict "value" .Values.readReplicas.extendedConfiguration "context" $ ) | nindent 4 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/metrics-configmap.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/metrics-configmap.yaml new file mode 100644 index 000000000..a1e06bfc6 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/metrics-configmap.yaml @@ -0,0 +1,18 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.metrics.enabled .Values.metrics.customMetrics (eq .Values.architecture "replication") }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ printf "%s-metrics" (include "postgresql.v1.readReplica.fullname" .) }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +data: + custom-metrics.yaml: {{ toYaml .Values.metrics.customMetrics | quote }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/metrics-svc.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/metrics-svc.yaml new file mode 100644 index 000000000..e9f13e067 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/metrics-svc.yaml @@ -0,0 +1,31 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.metrics.enabled (eq .Values.architecture "replication") }} +apiVersion: v1 +kind: Service +metadata: + name: {{ printf "%s-metrics" (include "postgresql.v1.readReplica.fullname" .) }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: metrics-read + {{- if or .Values.commonAnnotations .Values.metrics.service.annotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.metrics.service.annotations .Values.commonAnnotations ) "context" . ) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} +spec: + type: ClusterIP + sessionAffinity: {{ .Values.metrics.service.sessionAffinity }} + {{- if .Values.metrics.service.clusterIP }} + clusterIP: {{ .Values.metrics.service.clusterIP }} + {{- end }} + ports: + - name: http-metrics + port: {{ .Values.metrics.service.ports.metrics }} + targetPort: http-metrics + {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.podLabels .Values.commonLabels ) "context" . ) }} + selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: read +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/networkpolicy.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/networkpolicy.yaml new file mode 100644 index 000000000..79d3a5aa8 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/networkpolicy.yaml @@ -0,0 +1,39 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.networkPolicy.enabled (eq .Values.architecture "replication") .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.enabled }} +apiVersion: {{ include "common.capabilities.networkPolicy.apiVersion" . }} +kind: NetworkPolicy +metadata: + name: {{ printf "%s-ingress" (include "postgresql.v1.readReplica.fullname" .) }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: read + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.podLabels .Values.commonLabels ) "context" . ) }} + podSelector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }} + app.kubernetes.io/component: read + ingress: + {{- if and .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.enabled (or .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.namespaceSelector .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.podSelector) }} + - from: + {{- if .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.namespaceSelector }} + - namespaceSelector: + matchLabels: {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.namespaceSelector "context" $) | nindent 14 }} + {{- end }} + {{- if .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.podSelector }} + - podSelector: + matchLabels: {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.podSelector "context" $) | nindent 14 }} + {{- end }} + ports: + - port: {{ .Values.containerPorts.postgresql }} + {{- end }} + {{- if .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.customRules }} + {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.customRules "context" $) | nindent 4 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/servicemonitor.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/servicemonitor.yaml new file mode 100644 index 000000000..845734b1f --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/servicemonitor.yaml @@ -0,0 +1,46 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled (eq .Values.architecture "replication") }} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ include "postgresql.v1.readReplica.fullname" . }} + namespace: {{ default .Release.Namespace .Values.metrics.serviceMonitor.namespace | quote }} + {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.metrics.serviceMonitor.labels .Values.commonLabels ) "context" . ) }} + labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: metrics-read + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + {{- if .Values.metrics.serviceMonitor.jobLabel }} + jobLabel: {{ .Values.metrics.serviceMonitor.jobLabel }} + {{- end }} + selector: + {{- $svcLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.metrics.serviceMonitor.selector .Values.commonLabels ) "context" . ) }} + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $svcLabels "context" $ ) | nindent 6 }} + app.kubernetes.io/component: metrics-read + endpoints: + - port: http-metrics + {{- if .Values.metrics.serviceMonitor.interval }} + interval: {{ .Values.metrics.serviceMonitor.interval }} + {{- end }} + {{- if .Values.metrics.serviceMonitor.scrapeTimeout }} + scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }} + {{- end }} + {{- if .Values.metrics.serviceMonitor.relabelings }} + relabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.relabelings "context" $) | nindent 6 }} + {{- end }} + {{- if .Values.metrics.serviceMonitor.metricRelabelings }} + metricRelabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.metricRelabelings "context" $) | nindent 6 }} + {{- end }} + {{- if .Values.metrics.serviceMonitor.honorLabels }} + honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }} + {{- end }} + namespaceSelector: + matchNames: + - {{ .Release.Namespace | quote }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/statefulset.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/statefulset.yaml new file mode 100644 index 000000000..f11ae0a89 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/statefulset.yaml @@ -0,0 +1,553 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if eq .Values.architecture "replication" }} +{{- $customUser := include "postgresql.v1.username" . }} +apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }} +kind: StatefulSet +metadata: + name: {{ include "postgresql.v1.readReplica.fullname" . }} + namespace: {{ .Release.Namespace | quote }} + {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.labels .Values.commonLabels ) "context" . ) }} + labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: read + {{- if or .Values.commonAnnotations .Values.readReplicas.annotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.annotations .Values.commonAnnotations ) "context" . ) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.readReplicas.replicaCount }} + serviceName: {{ include "postgresql.v1.readReplica.svc.headless" . }} + {{- if .Values.readReplicas.updateStrategy }} + updateStrategy: {{- toYaml .Values.readReplicas.updateStrategy | nindent 4 }} + {{- end }} + {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.podLabels .Values.commonLabels ) "context" . ) }} + selector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }} + app.kubernetes.io/component: read + template: + metadata: + name: {{ include "postgresql.v1.readReplica.fullname" . }} + labels: {{- include "common.labels.standard" ( dict "customLabels" $podLabels "context" $ ) | nindent 8 }} + app.kubernetes.io/component: read + {{- if or (include "postgresql.v1.readReplicas.createExtendedConfigmap" .) .Values.readReplicas.podAnnotations }} + annotations: + {{- if (include "postgresql.v1.readReplicas.createExtendedConfigmap" .) }} + checksum/extended-configuration: {{ pick (include (print $.Template.BasePath "/primary/extended-configmap.yaml") . | fromYaml) "data" | toYaml | sha256sum }} + {{- end }} + {{- if .Values.readReplicas.podAnnotations }} + {{- include "common.tplvalues.render" ( dict "value" .Values.readReplicas.podAnnotations "context" $ ) | nindent 8 }} + {{- end }} + {{- end }} + spec: + {{- if .Values.readReplicas.extraPodSpec }} + {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.extraPodSpec "context" $) | nindent 6 }} + {{- end }} + serviceAccountName: {{ include "postgresql.v1.serviceAccountName" . }} + {{- include "postgresql.v1.imagePullSecrets" . | nindent 6 }} + automountServiceAccountToken: {{ .Values.readReplicas.automountServiceAccountToken }} + {{- if .Values.readReplicas.hostAliases }} + hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.hostAliases "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.readReplicas.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.affinity "context" $) | nindent 8 }} + {{- else }} + affinity: + podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.readReplicas.podAffinityPreset "component" "read" "customLabels" $podLabels "context" $) | nindent 10 }} + podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.readReplicas.podAntiAffinityPreset "component" "read" "customLabels" $podLabels "context" $) | nindent 10 }} + nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.readReplicas.nodeAffinityPreset.type "key" .Values.readReplicas.nodeAffinityPreset.key "values" .Values.readReplicas.nodeAffinityPreset.values) | nindent 10 }} + {{- end }} + {{- if .Values.readReplicas.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.readReplicas.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.readReplicas.topologySpreadConstraints }} + topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.topologySpreadConstraints "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.readReplicas.priorityClassName }} + priorityClassName: {{ .Values.readReplicas.priorityClassName }} + {{- end }} + {{- if .Values.readReplicas.schedulerName }} + schedulerName: {{ .Values.readReplicas.schedulerName | quote }} + {{- end }} + {{- if .Values.readReplicas.terminationGracePeriodSeconds }} + terminationGracePeriodSeconds: {{ .Values.readReplicas.terminationGracePeriodSeconds }} + {{- end }} + {{- if .Values.readReplicas.podSecurityContext.enabled }} + securityContext: {{- omit .Values.readReplicas.podSecurityContext "enabled" | toYaml | nindent 8 }} + {{- end }} + hostNetwork: {{ .Values.readReplicas.hostNetwork }} + hostIPC: {{ .Values.readReplicas.hostIPC }} + {{- if or (and .Values.tls.enabled (not .Values.volumePermissions.enabled)) (and .Values.volumePermissions.enabled (or .Values.readReplicas.persistence.enabled .Values.shmVolume.enabled)) .Values.readReplicas.initContainers }} + initContainers: + {{- if and .Values.tls.enabled (not .Values.volumePermissions.enabled) }} + - name: copy-certs + image: {{ include "postgresql.v1.volumePermissions.image" . }} + imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }} + {{- if .Values.readReplicas.resources }} + resources: {{- toYaml .Values.readReplicas.resources | nindent 12 }} + {{- end }} + # We don't require a privileged container in this case + {{- if .Values.readReplicas.containerSecurityContext.enabled }} + securityContext: {{- omit .Values.readReplicas.containerSecurityContext "enabled" | toYaml | nindent 12 }} + {{- end }} + command: + - /bin/sh + - -ec + - | + cp /tmp/certs/* /opt/bitnami/postgresql/certs/ + chmod 600 {{ include "postgresql.v1.tlsCertKey" . }} + volumeMounts: + - name: raw-certificates + mountPath: /tmp/certs + - name: postgresql-certificates + mountPath: /opt/bitnami/postgresql/certs + {{- else if and .Values.volumePermissions.enabled (or .Values.readReplicas.persistence.enabled .Values.shmVolume.enabled) }} + - name: init-chmod-data + image: {{ include "postgresql.v1.volumePermissions.image" . }} + imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }} + {{- if .Values.readReplicas.resources }} + resources: {{- toYaml .Values.readReplicas.resources | nindent 12 }} + {{- end }} + command: + - /bin/sh + - -ec + - | + {{- if .Values.readReplicas.persistence.enabled }} + {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} + chown `id -u`:`id -G | cut -d " " -f2` {{ .Values.readReplicas.persistence.mountPath }} + {{- else }} + chown {{ .Values.readReplicas.containerSecurityContext.runAsUser }}:{{ .Values.readReplicas.podSecurityContext.fsGroup }} {{ .Values.readReplicas.persistence.mountPath }} + {{- end }} + mkdir -p {{ .Values.readReplicas.persistence.mountPath }}/data {{- if (include "postgresql.v1.mountConfigurationCM" .) }} {{ .Values.readReplicas.persistence.mountPath }}/conf {{- end }} + chmod 700 {{ .Values.readReplicas.persistence.mountPath }}/data {{- if (include "postgresql.v1.mountConfigurationCM" .) }} {{ .Values.readReplicas.persistence.mountPath }}/conf {{- end }} + find {{ .Values.readReplicas.persistence.mountPath }} -mindepth 1 -maxdepth 1 {{- if not (include "postgresql.v1.mountConfigurationCM" .) }} -not -name "conf" {{- end }} -not -name ".snapshot" -not -name "lost+found" | \ + {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} + xargs -r chown -R `id -u`:`id -G | cut -d " " -f2` + {{- else }} + xargs -r chown -R {{ .Values.readReplicas.containerSecurityContext.runAsUser }}:{{ .Values.readReplicas.podSecurityContext.fsGroup }} + {{- end }} + {{- end }} + {{- if .Values.shmVolume.enabled }} + chmod -R 777 /dev/shm + {{- end }} + {{- if .Values.tls.enabled }} + cp /tmp/certs/* /opt/bitnami/postgresql/certs/ + {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} + chown -R `id -u`:`id -G | cut -d " " -f2` /opt/bitnami/postgresql/certs/ + {{- else }} + chown -R {{ .Values.readReplicas.containerSecurityContext.runAsUser }}:{{ .Values.readReplicas.podSecurityContext.fsGroup }} /opt/bitnami/postgresql/certs/ + {{- end }} + chmod 600 {{ include "postgresql.v1.tlsCertKey" . }} + {{- end }} + {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} + securityContext: {{- omit .Values.volumePermissions.containerSecurityContext "runAsUser" | toYaml | nindent 12 }} + {{- else }} + securityContext: {{- .Values.volumePermissions.containerSecurityContext | toYaml | nindent 12 }} + {{- end }} + volumeMounts: + {{ if .Values.readReplicas.persistence.enabled }} + - name: data + mountPath: {{ .Values.readReplicas.persistence.mountPath }} + {{- if .Values.readReplicas.persistence.subPath }} + subPath: {{ .Values.readReplicas.persistence.subPath }} + {{- end }} + {{- end }} + {{- if .Values.shmVolume.enabled }} + - name: dshm + mountPath: /dev/shm + {{- end }} + {{- if .Values.tls.enabled }} + - name: raw-certificates + mountPath: /tmp/certs + - name: postgresql-certificates + mountPath: /opt/bitnami/postgresql/certs + {{- end }} + {{- end }} + {{- if .Values.readReplicas.initContainers }} + {{- include "common.tplvalues.render" ( dict "value" .Values.readReplicas.initContainers "context" $ ) | nindent 8 }} + {{- end }} + {{- end }} + containers: + - name: postgresql + image: {{ include "postgresql.v1.image" . }} + imagePullPolicy: {{ .Values.image.pullPolicy | quote }} + {{- if .Values.readReplicas.containerSecurityContext.enabled }} + securityContext: {{- omit .Values.readReplicas.containerSecurityContext "enabled" | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} + {{- else if .Values.readReplicas.command }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.command "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} + {{- else if .Values.readReplicas.args }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.args "context" $) | nindent 12 }} + {{- end }} + env: + - name: BITNAMI_DEBUG + value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }} + - name: POSTGRESQL_PORT_NUMBER + value: {{ .Values.containerPorts.postgresql | quote }} + - name: POSTGRESQL_VOLUME_DIR + value: {{ .Values.readReplicas.persistence.mountPath | quote }} + {{- if .Values.readReplicas.persistence.mountPath }} + - name: PGDATA + value: {{ .Values.postgresqlDataDir | quote }} + {{- end }} + # Authentication + {{- if or (eq $customUser "postgres") (empty $customUser) }} + {{- if .Values.auth.enablePostgresUser }} + {{- if .Values.auth.usePasswordFiles }} + - name: POSTGRES_PASSWORD_FILE + value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.adminPasswordKey" .) }} + {{- else }} + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "postgresql.v1.secretName" . }} + key: {{ include "postgresql.v1.adminPasswordKey" . }} + {{- end }} + {{- else }} + - name: ALLOW_EMPTY_PASSWORD + value: "true" + {{- end }} + {{- else }} + - name: POSTGRES_USER + value: {{ $customUser | quote }} + {{- if .Values.auth.usePasswordFiles }} + - name: POSTGRES_PASSWORD_FILE + value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.userPasswordKey" .) }} + {{- else }} + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "postgresql.v1.secretName" . }} + key: {{ include "postgresql.v1.userPasswordKey" . }} + {{- end }} + {{- if .Values.auth.enablePostgresUser }} + {{- if .Values.auth.usePasswordFiles }} + - name: POSTGRES_POSTGRES_PASSWORD_FILE + value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.adminPasswordKey" .) }} + {{- else }} + - name: POSTGRES_POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "postgresql.v1.secretName" . }} + key: {{ include "postgresql.v1.adminPasswordKey" . }} + {{- end }} + {{- end }} + {{- end }} + # Replication + - name: POSTGRES_REPLICATION_MODE + value: "slave" + - name: POSTGRES_REPLICATION_USER + value: {{ .Values.auth.replicationUsername | quote }} + {{- if .Values.auth.usePasswordFiles }} + - name: POSTGRES_REPLICATION_PASSWORD_FILE + value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.replicationPasswordKey" .) }} + {{- else }} + - name: POSTGRES_REPLICATION_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "postgresql.v1.secretName" . }} + key: {{ include "postgresql.v1.replicationPasswordKey" . }} + {{- end }} + - name: POSTGRES_CLUSTER_APP_NAME + value: {{ .Values.replication.applicationName }} + - name: POSTGRES_MASTER_HOST + value: {{ include "postgresql.v1.primary.fullname" . }} + - name: POSTGRES_MASTER_PORT_NUMBER + value: {{ include "postgresql.v1.service.port" . | quote }} + # TLS + - name: POSTGRESQL_ENABLE_TLS + value: {{ ternary "yes" "no" .Values.tls.enabled | quote }} + {{- if .Values.tls.enabled }} + - name: POSTGRESQL_TLS_PREFER_SERVER_CIPHERS + value: {{ ternary "yes" "no" .Values.tls.preferServerCiphers | quote }} + - name: POSTGRESQL_TLS_CERT_FILE + value: {{ include "postgresql.v1.tlsCert" . }} + - name: POSTGRESQL_TLS_KEY_FILE + value: {{ include "postgresql.v1.tlsCertKey" . }} + {{- if .Values.tls.certCAFilename }} + - name: POSTGRESQL_TLS_CA_FILE + value: {{ include "postgresql.v1.tlsCACert" . }} + {{- end }} + {{- if .Values.tls.crlFilename }} + - name: POSTGRESQL_TLS_CRL_FILE + value: {{ include "postgresql.v1.tlsCRL" . }} + {{- end }} + {{- end }} + # Audit + - name: POSTGRESQL_LOG_HOSTNAME + value: {{ .Values.audit.logHostname | quote }} + - name: POSTGRESQL_LOG_CONNECTIONS + value: {{ .Values.audit.logConnections | quote }} + - name: POSTGRESQL_LOG_DISCONNECTIONS + value: {{ .Values.audit.logDisconnections | quote }} + {{- if .Values.audit.logLinePrefix }} + - name: POSTGRESQL_LOG_LINE_PREFIX + value: {{ .Values.audit.logLinePrefix | quote }} + {{- end }} + {{- if .Values.audit.logTimezone }} + - name: POSTGRESQL_LOG_TIMEZONE + value: {{ .Values.audit.logTimezone | quote }} + {{- end }} + {{- if .Values.audit.pgAuditLog }} + - name: POSTGRESQL_PGAUDIT_LOG + value: {{ .Values.audit.pgAuditLog | quote }} + {{- end }} + - name: POSTGRESQL_PGAUDIT_LOG_CATALOG + value: {{ .Values.audit.pgAuditLogCatalog | quote }} + # Others + - name: POSTGRESQL_CLIENT_MIN_MESSAGES + value: {{ .Values.audit.clientMinMessages | quote }} + - name: POSTGRESQL_SHARED_PRELOAD_LIBRARIES + value: {{ .Values.postgresqlSharedPreloadLibraries | quote }} + {{- if .Values.readReplicas.extraEnvVars }} + {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.extraEnvVars "context" $) | nindent 12 }} + {{- end }} + {{- if or .Values.readReplicas.extraEnvVarsCM .Values.readReplicas.extraEnvVarsSecret }} + envFrom: + {{- if .Values.readReplicas.extraEnvVarsCM }} + - configMapRef: + name: {{ .Values.readReplicas.extraEnvVarsCM }} + {{- end }} + {{- if .Values.readReplicas.extraEnvVarsSecret }} + - secretRef: + name: {{ .Values.readReplicas.extraEnvVarsSecret }} + {{- end }} + {{- end }} + ports: + - name: tcp-postgresql + containerPort: {{ .Values.containerPorts.postgresql }} + {{- if not .Values.diagnosticMode.enabled }} + {{- if .Values.readReplicas.customStartupProbe }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.customStartupProbe "context" $) | nindent 12 }} + {{- else if .Values.readReplicas.startupProbe.enabled }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.readReplicas.startupProbe "enabled") "context" $) | nindent 12 }} + exec: + command: + - /bin/sh + - -c + {{- if (include "postgresql.v1.database" .) }} + - exec pg_isready -U {{ default "postgres" $customUser| quote }} -d "dbname={{ include "postgresql.v1.database" . }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}{{- end }}" -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} + {{- else }} + - exec pg_isready -U {{ default "postgres" $customUser | quote }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} -d "sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}"{{- end }} -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} + {{- end }} + {{- end }} + {{- if .Values.readReplicas.customLivenessProbe }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.customLivenessProbe "context" $) | nindent 12 }} + {{- else if .Values.readReplicas.livenessProbe.enabled }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.readReplicas.livenessProbe "enabled") "context" $) | nindent 12 }} + exec: + command: + - /bin/sh + - -c + {{- if (include "postgresql.v1.database" .) }} + - exec pg_isready -U {{ default "postgres" $customUser | quote }} -d "dbname={{ include "postgresql.v1.database" . }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}{{- end }}" -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} + {{- else }} + - exec pg_isready -U {{default "postgres" $customUser | quote }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} -d "sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}"{{- end }} -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} + {{- end }} + {{- end }} + {{- if .Values.readReplicas.customReadinessProbe }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.customReadinessProbe "context" $) | nindent 12 }} + {{- else if .Values.readReplicas.readinessProbe.enabled }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.readReplicas.readinessProbe "enabled") "context" $) | nindent 12 }} + exec: + command: + - /bin/sh + - -c + - -e + {{- include "postgresql.v1.readinessProbeCommand" . | nindent 16 }} + {{- end }} + {{- end }} + {{- if .Values.readReplicas.resources }} + resources: {{- toYaml .Values.readReplicas.resources | nindent 12 }} + {{- end }} + {{- if .Values.readReplicas.lifecycleHooks }} + lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.lifecycleHooks "context" $) | nindent 12 }} + {{- end }} + volumeMounts: + {{- if .Values.auth.usePasswordFiles }} + - name: postgresql-password + mountPath: /opt/bitnami/postgresql/secrets/ + {{- end }} + {{- if .Values.readReplicas.extendedConfiguration }} + - name: postgresql-extended-config + mountPath: {{ .Values.readReplicas.persistence.mountPath }}/conf/conf.d/ + {{- end }} + {{- if .Values.tls.enabled }} + - name: postgresql-certificates + mountPath: /opt/bitnami/postgresql/certs + readOnly: true + {{- end }} + {{- if .Values.shmVolume.enabled }} + - name: dshm + mountPath: /dev/shm + {{- end }} + {{- if .Values.readReplicas.persistence.enabled }} + - name: data + mountPath: {{ .Values.readReplicas.persistence.mountPath }} + {{- if .Values.readReplicas.persistence.subPath }} + subPath: {{ .Values.readReplicas.persistence.subPath }} + {{- end }} + {{- end }} + {{- if .Values.readReplicas.extraVolumeMounts }} + {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.extraVolumeMounts "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.metrics.enabled }} + - name: metrics + image: {{ include "postgresql.v1.metrics.image" . }} + imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }} + {{- if .Values.metrics.containerSecurityContext.enabled }} + securityContext: {{- omit .Values.metrics.containerSecurityContext "enabled" | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} + {{- else if .Values.metrics.customMetrics }} + args: [ "--extend.query-path", "/conf/custom-metrics.yaml" ] + {{- end }} + env: + {{- $database := required "In order to enable metrics you need to specify a database (.Values.auth.database or .Values.global.postgresql.auth.database)" (include "postgresql.v1.database" .) }} + - name: DATA_SOURCE_URI + value: {{ printf "127.0.0.1:%d/%s?sslmode=disable" (int (include "postgresql.v1.service.port" .)) $database }} + {{- if .Values.auth.usePasswordFiles }} + - name: DATA_SOURCE_PASS_FILE + value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.userPasswordKey" .) }} + {{- else }} + - name: DATA_SOURCE_PASS + valueFrom: + secretKeyRef: + name: {{ include "postgresql.v1.secretName" . }} + key: {{ include "postgresql.v1.userPasswordKey" . }} + {{- end }} + - name: DATA_SOURCE_USER + value: {{ default "postgres" $customUser | quote }} + {{- if .Values.metrics.extraEnvVars }} + {{- include "common.tplvalues.render" (dict "value" .Values.metrics.extraEnvVars "context" $) | nindent 12 }} + {{- end }} + ports: + - name: http-metrics + containerPort: {{ .Values.metrics.containerPorts.metrics }} + {{- if not .Values.diagnosticMode.enabled }} + {{- if .Values.metrics.customStartupProbe }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customStartupProbe "context" $) | nindent 12 }} + {{- else if .Values.metrics.startupProbe.enabled }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.startupProbe "enabled") "context" $) | nindent 12 }} + tcpSocket: + port: http-metrics + {{- end }} + {{- if .Values.metrics.customLivenessProbe }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customLivenessProbe "context" $) | nindent 12 }} + {{- else if .Values.metrics.livenessProbe.enabled }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.livenessProbe "enabled") "context" $) | nindent 12 }} + httpGet: + path: / + port: http-metrics + {{- end }} + {{- if .Values.metrics.customReadinessProbe }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customReadinessProbe "context" $) | nindent 12 }} + {{- else if .Values.metrics.readinessProbe.enabled }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.readinessProbe "enabled") "context" $) | nindent 12 }} + httpGet: + path: / + port: http-metrics + {{- end }} + {{- end }} + volumeMounts: + {{- if .Values.auth.usePasswordFiles }} + - name: postgresql-password + mountPath: /opt/bitnami/postgresql/secrets/ + {{- end }} + {{- if .Values.metrics.customMetrics }} + - name: custom-metrics + mountPath: /conf + readOnly: true + {{- end }} + {{- if .Values.metrics.resources }} + resources: {{- toYaml .Values.metrics.resources | nindent 12 }} + {{- end }} + {{- end }} + {{- if .Values.readReplicas.sidecars }} + {{- include "common.tplvalues.render" ( dict "value" .Values.readReplicas.sidecars "context" $ ) | nindent 8 }} + {{- end }} + volumes: + {{- if .Values.readReplicas.extendedConfiguration }} + - name: postgresql-extended-config + configMap: + name: {{ include "postgresql.v1.readReplicas.extendedConfigmapName" . }} + {{- end }} + {{- if .Values.auth.usePasswordFiles }} + - name: postgresql-password + secret: + secretName: {{ include "postgresql.v1.secretName" . }} + {{- end }} + {{- if .Values.tls.enabled }} + - name: raw-certificates + secret: + secretName: {{ include "postgresql.v1.tlsSecretName" . }} + - name: postgresql-certificates + emptyDir: {} + {{- end }} + {{- if and .Values.metrics.enabled .Values.metrics.customMetrics }} + - name: custom-metrics + configMap: + name: {{ printf "%s-metrics" (include "postgresql.v1.readReplica.fullname" .) }} + {{- end }} + {{- if .Values.shmVolume.enabled }} + - name: dshm + emptyDir: + medium: Memory + {{- if .Values.shmVolume.sizeLimit }} + sizeLimit: {{ .Values.shmVolume.sizeLimit }} + {{- end }} + {{- end }} + {{- if .Values.readReplicas.extraVolumes }} + {{- include "common.tplvalues.render" ( dict "value" .Values.readReplicas.extraVolumes "context" $ ) | nindent 8 }} + {{- end }} + {{- if and .Values.readReplicas.persistence.enabled .Values.readReplicas.persistence.existingClaim }} + - name: data + persistentVolumeClaim: + claimName: {{ tpl .Values.readReplicas.persistence.existingClaim $ }} + {{- else if not .Values.readReplicas.persistence.enabled }} + - name: data + emptyDir: {} + {{- else }} + {{- if .Values.readReplicas.persistentVolumeClaimRetentionPolicy.enabled }} + persistentVolumeClaimRetentionPolicy: + whenDeleted: {{ .Values.readReplicas.persistentVolumeClaimRetentionPolicy.whenDeleted }} + whenScaled: {{ .Values.readReplicas.persistentVolumeClaimRetentionPolicy.whenScaled }} + {{- end }} + volumeClaimTemplates: + - metadata: + name: data + {{- if .Values.readReplicas.persistence.annotations }} + annotations: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.persistence.annotations "context" $) | nindent 10 }} + {{- end }} + {{- if .Values.readReplicas.persistence.labels }} + labels: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.persistence.labels "context" $) | nindent 10 }} + {{- end }} + spec: + accessModes: + {{- range .Values.readReplicas.persistence.accessModes }} + - {{ . | quote }} + {{- end }} + {{- if .Values.readReplicas.persistence.dataSource }} + dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.persistence.dataSource "context" $) | nindent 10 }} + {{- end }} + resources: + requests: + storage: {{ .Values.readReplicas.persistence.size | quote }} + {{- if .Values.readReplicas.persistence.selector }} + selector: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.persistence.selector "context" $) | nindent 10 }} + {{- end -}} + {{- include "common.storage.class" (dict "persistence" .Values.readReplicas.persistence "global" .Values.global) | nindent 8 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/svc-headless.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/svc-headless.yaml new file mode 100644 index 000000000..249af5f4a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/svc-headless.yaml @@ -0,0 +1,38 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if eq .Values.architecture "replication" }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "postgresql.v1.readReplica.svc.headless" . }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: read + annotations: + {{- if or .Values.readReplicas.service.headless.annotations .Values.commonAnnotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.service.headless.annotations .Values.commonAnnotations ) "context" . ) }} + {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} + # Use this annotation in addition to the actual publishNotReadyAddresses + # field below because the annotation will stop being respected soon but the + # field is broken in some versions of Kubernetes: + # https://github.com/kubernetes/kubernetes/issues/58662 + service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" +spec: + type: ClusterIP + clusterIP: None + # We want all pods in the StatefulSet to have their addresses published for + # the sake of the other Postgresql pods even before they're ready, since they + # have to be able to talk to each other in order to become ready. + publishNotReadyAddresses: true + ports: + - name: tcp-postgresql + port: {{ include "postgresql.v1.readReplica.service.port" . }} + targetPort: tcp-postgresql + {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.podLabels .Values.commonLabels ) "context" . ) }} + selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: read +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/svc.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/svc.yaml new file mode 100644 index 000000000..d92c52340 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/svc.yaml @@ -0,0 +1,53 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if eq .Values.architecture "replication" }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "postgresql.v1.readReplica.fullname" . }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: read + {{- if or .Values.commonAnnotations .Values.readReplicas.service.annotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.service.annotations .Values.commonAnnotations ) "context" . ) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.readReplicas.service.type }} + {{- if or (eq .Values.readReplicas.service.type "LoadBalancer") (eq .Values.readReplicas.service.type "NodePort") }} + externalTrafficPolicy: {{ .Values.readReplicas.service.externalTrafficPolicy | quote }} + {{- end }} + {{- if and (eq .Values.readReplicas.service.type "LoadBalancer") (not (empty .Values.readReplicas.service.loadBalancerSourceRanges)) }} + loadBalancerSourceRanges: {{ .Values.readReplicas.service.loadBalancerSourceRanges }} + {{- end }} + {{- if and (eq .Values.readReplicas.service.type "LoadBalancer") (not (empty .Values.readReplicas.service.loadBalancerIP)) }} + loadBalancerIP: {{ .Values.readReplicas.service.loadBalancerIP }} + {{- end }} + {{- if and .Values.readReplicas.service.clusterIP (eq .Values.readReplicas.service.type "ClusterIP") }} + clusterIP: {{ .Values.readReplicas.service.clusterIP }} + {{- end }} + {{- if .Values.readReplicas.service.sessionAffinity }} + sessionAffinity: {{ .Values.readReplicas.service.sessionAffinity }} + {{- end }} + {{- if .Values.readReplicas.service.sessionAffinityConfig }} + sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.service.sessionAffinityConfig "context" $) | nindent 4 }} + {{- end }} + ports: + - name: tcp-postgresql + port: {{ include "postgresql.v1.readReplica.service.port" . }} + targetPort: tcp-postgresql + {{- if and (or (eq .Values.readReplicas.service.type "NodePort") (eq .Values.readReplicas.service.type "LoadBalancer")) (not (empty .Values.readReplicas.service.nodePorts.postgresql)) }} + nodePort: {{ .Values.readReplicas.service.nodePorts.postgresql }} + {{- else if eq .Values.readReplicas.service.type "ClusterIP" }} + nodePort: null + {{- end }} + {{- if .Values.readReplicas.service.extraPorts }} + {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.service.extraPorts "context" $) | nindent 4 }} + {{- end }} + {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.podLabels .Values.commonLabels ) "context" . ) }} + selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: read +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/role.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/role.yaml new file mode 100644 index 000000000..0ae728a7e --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/role.yaml @@ -0,0 +1,32 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if .Values.rbac.create }} +kind: Role +apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }} +metadata: + name: {{ include "common.names.fullname" . }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +# yamllint disable rule:indentation +rules: + {{- if and (include "common.capabilities.psp.supported" .) .Values.psp.create }} + - apiGroups: + - 'policy' + resources: + - 'podsecuritypolicies' + verbs: + - 'use' + resourceNames: + - {{ include "common.names.fullname" . }} + {{- end }} + {{- if .Values.rbac.rules }} + {{- include "common.tplvalues.render" ( dict "value" .Values.rbac.rules "context" $ ) | nindent 2 }} + {{- end }} +# yamllint enable rule:indentation +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/rolebinding.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/rolebinding.yaml new file mode 100644 index 000000000..04323a0c4 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/rolebinding.yaml @@ -0,0 +1,24 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if .Values.rbac.create }} +kind: RoleBinding +apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }} +metadata: + name: {{ include "common.names.fullname" . }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +roleRef: + kind: Role + name: {{ include "common.names.fullname" . }} + apiGroup: rbac.authorization.k8s.io +subjects: + - kind: ServiceAccount + name: {{ include "postgresql.v1.serviceAccountName" . }} + namespace: {{ .Release.Namespace | quote }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/secrets.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/secrets.yaml new file mode 100644 index 000000000..b4267ab64 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/secrets.yaml @@ -0,0 +1,99 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- $host := include "postgresql.v1.primary.fullname" . }} +{{- $port := include "postgresql.v1.service.port" . }} +{{- $customUser := include "postgresql.v1.username" . }} +{{- $postgresPassword := include "common.secrets.lookup" (dict "secret" (include "postgresql.v1.secretName" .) "key" (coalesce .Values.global.postgresql.auth.secretKeys.adminPasswordKey .Values.auth.secretKeys.adminPasswordKey) "defaultValue" (ternary (coalesce .Values.global.postgresql.auth.password .Values.auth.password .Values.global.postgresql.auth.postgresPassword .Values.auth.postgresPassword) (coalesce .Values.global.postgresql.auth.postgresPassword .Values.auth.postgresPassword) (or (empty $customUser) (eq $customUser "postgres"))) "context" $) | trimAll "\"" | b64dec }} +{{- if and (not $postgresPassword) .Values.auth.enablePostgresUser }} +{{- $postgresPassword = randAlphaNum 10 }} +{{- end }} +{{- $replicationPassword := "" }} +{{- if eq .Values.architecture "replication" }} +{{- $replicationPassword = include "common.secrets.passwords.manage" (dict "secret" (include "postgresql.v1.secretName" .) "key" (coalesce .Values.global.postgresql.auth.secretKeys.replicationPasswordKey .Values.auth.secretKeys.replicationPasswordKey) "providedValues" (list "auth.replicationPassword") "context" $) | trimAll "\"" | b64dec }} +{{- end }} +{{- $ldapPassword := "" }} +{{- if and .Values.ldap.enabled (or .Values.ldap.bind_password .Values.ldap.bindpw) }} +{{- $ldapPassword = coalesce .Values.ldap.bind_password .Values.ldap.bindpw }} +{{- end }} +{{- $password := "" }} +{{- if and (not (empty $customUser)) (ne $customUser "postgres") }} +{{- $password = include "common.secrets.passwords.manage" (dict "secret" (include "postgresql.v1.secretName" .) "key" (coalesce .Values.global.postgresql.auth.secretKeys.userPasswordKey .Values.auth.secretKeys.userPasswordKey) "providedValues" (list "global.postgresql.auth.password" "auth.password") "context" $) | trimAll "\"" | b64dec }} +{{- end }} +{{- $database := include "postgresql.v1.database" . }} +{{- if (include "postgresql.v1.createSecret" .) }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +type: Opaque +data: + {{- if $postgresPassword }} + postgres-password: {{ $postgresPassword | b64enc | quote }} + {{- end }} + {{- if $password }} + password: {{ $password | b64enc | quote }} + {{- end }} + {{- if $replicationPassword }} + replication-password: {{ $replicationPassword | b64enc | quote }} + {{- end }} + # We don't auto-generate LDAP password when it's not provided as we do for other passwords + {{- if and .Values.ldap.enabled (or .Values.ldap.bind_password .Values.ldap.bindpw) }} + ldap-password: {{ $ldapPassword | b64enc | quote }} + {{- end }} +{{- end }} +{{- if .Values.serviceBindings.enabled }} +{{- if $postgresPassword }} +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }}-svcbind-postgres + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +type: servicebinding.io/postgresql +data: + provider: {{ print "bitnami" | b64enc | quote }} + type: {{ print "postgresql" | b64enc | quote }} + host: {{ $host | b64enc | quote }} + port: {{ $port | b64enc | quote }} + username: {{ print "postgres" | b64enc | quote }} + database: {{ print "postgres" | b64enc | quote }} + password: {{ $postgresPassword | b64enc | quote }} + uri: {{ printf "postgresql://postgres:%s@%s:%s/postgres" $postgresPassword $host $port | b64enc | quote }} +{{- end }} +{{- if $password }} +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }}-svcbind-custom-user + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +type: servicebinding.io/postgresql +data: + provider: {{ print "bitnami" | b64enc | quote }} + type: {{ print "postgresql" | b64enc | quote }} + host: {{ $host | b64enc | quote }} + port: {{ $port | b64enc | quote }} + username: {{ $customUser | b64enc | quote }} + password: {{ $password | b64enc | quote }} + {{- if $database }} + database: {{ $database | b64enc | quote }} + {{- end }} + uri: {{ printf "postgresql://%s:%s@%s:%s/%s" $customUser $password $host $port $database | b64enc | quote }} +{{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/serviceaccount.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/serviceaccount.yaml new file mode 100644 index 000000000..8886bffc0 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/serviceaccount.yaml @@ -0,0 +1,18 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if .Values.serviceAccount.create }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "postgresql.v1.serviceAccountName" . }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if or .Values.serviceAccount.annotations .Values.commonAnnotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.serviceAccount.annotations .Values.commonAnnotations ) "context" . ) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/tls-secrets.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/tls-secrets.yaml new file mode 100644 index 000000000..7e44a437c --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/templates/tls-secrets.yaml @@ -0,0 +1,30 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if (include "postgresql.v1.createTlsSecret" . ) }} +{{- $secretName := printf "%s-crt" (include "common.names.fullname" .) }} +{{- $ca := genCA "postgresql-ca" 365 }} +{{- $fullname := include "common.names.fullname" . }} +{{- $releaseNamespace := .Release.Namespace }} +{{- $clusterDomain := .Values.clusterDomain }} +{{- $primaryHeadlessServiceName := include "postgresql.v1.primary.svc.headless" . }} +{{- $readHeadlessServiceName := include "postgresql.v1.readReplica.svc.headless" . }} +{{- $altNames := list (printf "*.%s.%s.svc.%s" $fullname $releaseNamespace $clusterDomain) (printf "%s.%s.svc.%s" $fullname $releaseNamespace $clusterDomain) (printf "*.%s.%s.svc.%s" $primaryHeadlessServiceName $releaseNamespace $clusterDomain) (printf "%s.%s.svc.%s" $primaryHeadlessServiceName $releaseNamespace $clusterDomain) (printf "*.%s.%s.svc.%s" $readHeadlessServiceName $releaseNamespace $clusterDomain) (printf "%s.%s.svc.%s" $readHeadlessServiceName $releaseNamespace $clusterDomain) $fullname }} +{{- $cert := genSignedCert $fullname nil $altNames 365 $ca }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ $secretName }} + namespace: {{ .Release.Namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +type: kubernetes.io/tls +data: + tls.crt: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "tls.crt" "defaultValue" $cert.Cert "context" $) }} + tls.key: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "tls.key" "defaultValue" $cert.Key "context" $) }} + ca.crt: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "ca.crt" "defaultValue" $ca.Cert "context" $) }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/values.schema.json b/thunder_deployment/infra/beta9/charts/postgresql/values.schema.json new file mode 100644 index 000000000..fc41483cd --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/values.schema.json @@ -0,0 +1,156 @@ +{ + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "architecture": { + "type": "string", + "title": "PostgreSQL architecture", + "form": true, + "description": "Allowed values: `standalone` or `replication`" + }, + "auth": { + "type": "object", + "title": "Authentication configuration", + "form": true, + "properties": { + "enablePostgresUser": { + "type": "boolean", + "title": "Enable \"postgres\" admin user", + "description": "Assign a password to the \"postgres\" admin user. Otherwise, remote access will be blocked for this user", + "form": true + }, + "postgresPassword": { + "type": "string", + "title": "Password for the \"postgres\" admin user", + "description": "Defaults to a random 10-character alphanumeric string if not set", + "form": true + }, + "database": { + "type": "string", + "title": "PostgreSQL custom database", + "description": "Name of the custom database to be created during the 1st initialization of PostgreSQL", + "form": true + }, + "username": { + "type": "string", + "title": "PostgreSQL custom user", + "description": "Name of the custom user to be created during the 1st initialization of PostgreSQL. This user only has permissions on the PostgreSQL custom database", + "form": true + }, + "password": { + "type": "string", + "title": "Password for the custom user to create", + "description": "Defaults to a random 10-character alphanumeric string if not set", + "form": true + }, + "replicationUsername": { + "type": "string", + "title": "PostgreSQL replication user", + "description": "Name of user used to manage replication.", + "form": true, + "hidden": { + "value": "standalone", + "path": "architecture" + } + }, + "replicationPassword": { + "type": "string", + "title": "Password for PostgreSQL replication user", + "description": "Defaults to a random 10-character alphanumeric string if not set", + "form": true, + "hidden": { + "value": "standalone", + "path": "architecture" + } + } + } + }, + "persistence": { + "type": "object", + "properties": { + "size": { + "type": "string", + "title": "Persistent Volume Size", + "form": true, + "render": "slider", + "sliderMin": 1, + "sliderMax": 100, + "sliderUnit": "Gi" + } + } + }, + "resources": { + "type": "object", + "title": "Required Resources", + "description": "Configure resource requests", + "form": true, + "properties": { + "requests": { + "type": "object", + "properties": { + "memory": { + "type": "string", + "form": true, + "render": "slider", + "title": "Memory Request", + "sliderMin": 10, + "sliderMax": 2048, + "sliderUnit": "Mi" + }, + "cpu": { + "type": "string", + "form": true, + "render": "slider", + "title": "CPU Request", + "sliderMin": 10, + "sliderMax": 2000, + "sliderUnit": "m" + } + } + } + } + }, + "replication": { + "type": "object", + "form": true, + "title": "Replication Details", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enable Replication", + "form": true + }, + "readReplicas": { + "type": "integer", + "title": "read Replicas", + "form": true, + "hidden": { + "value": "standalone", + "path": "architecture" + } + } + } + }, + "volumePermissions": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "form": true, + "title": "Enable Init Containers", + "description": "Change the owner of the persist volume mountpoint to RunAsUser:fsGroup" + } + } + }, + "metrics": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Configure metrics exporter", + "form": true + } + } + } + } +} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/values.yaml b/thunder_deployment/infra/beta9/charts/postgresql/values.yaml new file mode 100644 index 000000000..afedc769b --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/postgresql/values.yaml @@ -0,0 +1,1647 @@ +# Copyright VMware, Inc. +# SPDX-License-Identifier: APACHE-2.0 + +## @section Global parameters +## Please, note that this will override the parameters, including dependencies, configured to use the global value +## +global: + ## @param global.imageRegistry Global Docker image registry + ## + imageRegistry: "" + ## @param global.imagePullSecrets Global Docker registry secret names as an array + ## e.g. + ## imagePullSecrets: + ## - myRegistryKeySecretName + ## + imagePullSecrets: [] + ## @param global.storageClass Global StorageClass for Persistent Volume(s) + ## + storageClass: "" + postgresql: + ## @param global.postgresql.auth.postgresPassword Password for the "postgres" admin user (overrides `auth.postgresPassword`) + ## @param global.postgresql.auth.username Name for a custom user to create (overrides `auth.username`) + ## @param global.postgresql.auth.password Password for the custom user to create (overrides `auth.password`) + ## @param global.postgresql.auth.database Name for a custom database to create (overrides `auth.database`) + ## @param global.postgresql.auth.existingSecret Name of existing secret to use for PostgreSQL credentials (overrides `auth.existingSecret`). + ## @param global.postgresql.auth.secretKeys.adminPasswordKey Name of key in existing secret to use for PostgreSQL credentials (overrides `auth.secretKeys.adminPasswordKey`). Only used when `global.postgresql.auth.existingSecret` is set. + ## @param global.postgresql.auth.secretKeys.userPasswordKey Name of key in existing secret to use for PostgreSQL credentials (overrides `auth.secretKeys.userPasswordKey`). Only used when `global.postgresql.auth.existingSecret` is set. + ## @param global.postgresql.auth.secretKeys.replicationPasswordKey Name of key in existing secret to use for PostgreSQL credentials (overrides `auth.secretKeys.replicationPasswordKey`). Only used when `global.postgresql.auth.existingSecret` is set. + ## + auth: + postgresPassword: "" + username: "" + password: "" + database: "" + existingSecret: "" + secretKeys: + adminPasswordKey: "" + userPasswordKey: "" + replicationPasswordKey: "" + ## @param global.postgresql.service.ports.postgresql PostgreSQL service port (overrides `service.ports.postgresql`) + ## + service: + ports: + postgresql: "" + +## @section Common parameters +## + +## @param kubeVersion Override Kubernetes version +## +kubeVersion: "" +## @param nameOverride String to partially override common.names.fullname template (will maintain the release name) +## +nameOverride: "" +## @param fullnameOverride String to fully override common.names.fullname template +## +fullnameOverride: "" +## @param clusterDomain Kubernetes Cluster Domain +## +clusterDomain: cluster.local +## @param extraDeploy Array of extra objects to deploy with the release (evaluated as a template) +## +extraDeploy: [] +## @param commonLabels Add labels to all the deployed resources +## +commonLabels: {} +## @param commonAnnotations Add annotations to all the deployed resources +## +commonAnnotations: {} +## Enable diagnostic mode in the statefulset +## +diagnosticMode: + ## @param diagnosticMode.enabled Enable diagnostic mode (all probes will be disabled and the command will be overridden) + ## + enabled: false + ## @param diagnosticMode.command Command to override all containers in the statefulset + ## + command: + - sleep + ## @param diagnosticMode.args Args to override all containers in the statefulset + ## + args: + - infinity + +## @section PostgreSQL common parameters +## + +## Bitnami PostgreSQL image version +## ref: https://hub.docker.com/r/bitnami/postgresql/tags/ +## @param image.registry [default: REGISTRY_NAME] PostgreSQL image registry +## @param image.repository [default: REPOSITORY_NAME/postgresql] PostgreSQL image repository +## @skip image.tag PostgreSQL image tag (immutable tags are recommended) +## @param image.digest PostgreSQL image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag +## @param image.pullPolicy PostgreSQL image pull policy +## @param image.pullSecrets Specify image pull secrets +## @param image.debug Specify if debug values should be set +## +image: + registry: docker.io + repository: bitnami/postgresql + tag: 16.1.0-debian-11-r24 + digest: "" + ## Specify a imagePullPolicy + ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images + ## + pullPolicy: IfNotPresent + ## Optionally specify an array of imagePullSecrets. + ## Secrets must be manually created in the namespace. + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + ## Example: + ## pullSecrets: + ## - myRegistryKeySecretName + ## + pullSecrets: [] + ## Set to true if you would like to see extra information on logs + ## + debug: false +## Authentication parameters +## ref: https://github.com/bitnami/containers/tree/main/bitnami/postgresql#setting-the-root-password-on-first-run +## ref: https://github.com/bitnami/containers/tree/main/bitnami/postgresql#creating-a-database-on-first-run +## ref: https://github.com/bitnami/containers/tree/main/bitnami/postgresql#creating-a-database-user-on-first-run +## +auth: + ## @param auth.enablePostgresUser Assign a password to the "postgres" admin user. Otherwise, remote access will be blocked for this user + ## + enablePostgresUser: true + ## @param auth.postgresPassword Password for the "postgres" admin user. Ignored if `auth.existingSecret` is provided + ## + postgresPassword: "" + ## @param auth.username Name for a custom user to create + ## + username: "" + ## @param auth.password Password for the custom user to create. Ignored if `auth.existingSecret` is provided + ## + password: "" + ## @param auth.database Name for a custom database to create + ## + database: "" + ## @param auth.replicationUsername Name of the replication user + ## + replicationUsername: repl_user + ## @param auth.replicationPassword Password for the replication user. Ignored if `auth.existingSecret` is provided + ## + replicationPassword: "" + ## @param auth.existingSecret Name of existing secret to use for PostgreSQL credentials. `auth.postgresPassword`, `auth.password`, and `auth.replicationPassword` will be ignored and picked up from this secret. The secret might also contains the key `ldap-password` if LDAP is enabled. `ldap.bind_password` will be ignored and picked from this secret in this case. + ## + existingSecret: "" + ## @param auth.secretKeys.adminPasswordKey Name of key in existing secret to use for PostgreSQL credentials. Only used when `auth.existingSecret` is set. + ## @param auth.secretKeys.userPasswordKey Name of key in existing secret to use for PostgreSQL credentials. Only used when `auth.existingSecret` is set. + ## @param auth.secretKeys.replicationPasswordKey Name of key in existing secret to use for PostgreSQL credentials. Only used when `auth.existingSecret` is set. + ## + secretKeys: + adminPasswordKey: postgres-password + userPasswordKey: password + replicationPasswordKey: replication-password + ## @param auth.usePasswordFiles Mount credentials as a files instead of using an environment variable + ## + usePasswordFiles: false +## @param architecture PostgreSQL architecture (`standalone` or `replication`) +## +architecture: standalone +## Replication configuration +## Ignored if `architecture` is `standalone` +## +replication: + ## @param replication.synchronousCommit Set synchronous commit mode. Allowed values: `on`, `remote_apply`, `remote_write`, `local` and `off` + ## @param replication.numSynchronousReplicas Number of replicas that will have synchronous replication. Note: Cannot be greater than `readReplicas.replicaCount`. + ## ref: https://www.postgresql.org/docs/current/runtime-config-wal.html#GUC-SYNCHRONOUS-COMMIT + ## + synchronousCommit: "off" + numSynchronousReplicas: 0 + ## @param replication.applicationName Cluster application name. Useful for advanced replication settings + ## + applicationName: my_application +## @param containerPorts.postgresql PostgreSQL container port +## +containerPorts: + postgresql: 5432 +## Audit settings +## https://github.com/bitnami/containers/tree/main/bitnami/postgresql#auditing +## @param audit.logHostname Log client hostnames +## @param audit.logConnections Add client log-in operations to the log file +## @param audit.logDisconnections Add client log-outs operations to the log file +## @param audit.pgAuditLog Add operations to log using the pgAudit extension +## @param audit.pgAuditLogCatalog Log catalog using pgAudit +## @param audit.clientMinMessages Message log level to share with the user +## @param audit.logLinePrefix Template for log line prefix (default if not set) +## @param audit.logTimezone Timezone for the log timestamps +## +audit: + logHostname: false + logConnections: false + logDisconnections: false + pgAuditLog: "" + pgAuditLogCatalog: "off" + clientMinMessages: error + logLinePrefix: "" + logTimezone: "" +## LDAP configuration +## @param ldap.enabled Enable LDAP support +## DEPRECATED ldap.url It will removed in a future, please use 'ldap.uri' instead +## @param ldap.server IP address or name of the LDAP server. +## @param ldap.port Port number on the LDAP server to connect to +## @param ldap.prefix String to prepend to the user name when forming the DN to bind +## @param ldap.suffix String to append to the user name when forming the DN to bind +## DEPRECATED ldap.baseDN It will removed in a future, please use 'ldap.basedn' instead +## DEPRECATED ldap.bindDN It will removed in a future, please use 'ldap.binddn' instead +## DEPRECATED ldap.bind_password It will removed in a future, please use 'ldap.bindpw' instead +## @param ldap.basedn Root DN to begin the search for the user in +## @param ldap.binddn DN of user to bind to LDAP +## @param ldap.bindpw Password for the user to bind to LDAP +## DEPRECATED ldap.search_attr It will removed in a future, please use 'ldap.searchAttribute' instead +## DEPRECATED ldap.search_filter It will removed in a future, please use 'ldap.searchFilter' instead +## @param ldap.searchAttribute Attribute to match against the user name in the search +## @param ldap.searchFilter The search filter to use when doing search+bind authentication +## @param ldap.scheme Set to `ldaps` to use LDAPS +## DEPRECATED ldap.tls as string is deprecated,please use 'ldap.tls.enabled' instead +## @param ldap.tls.enabled Se to true to enable TLS encryption +## +ldap: + enabled: false + server: "" + port: "" + prefix: "" + suffix: "" + basedn: "" + binddn: "" + bindpw: "" + searchAttribute: "" + searchFilter: "" + scheme: "" + tls: + enabled: false + ## @param ldap.uri LDAP URL beginning in the form `ldap[s]://host[:port]/basedn`. If provided, all the other LDAP parameters will be ignored. + ## Ref: https://www.postgresql.org/docs/current/auth-ldap.html + ## + uri: "" +## @param postgresqlDataDir PostgreSQL data dir folder +## +postgresqlDataDir: /bitnami/postgresql/data +## @param postgresqlSharedPreloadLibraries Shared preload libraries (comma-separated list) +## +postgresqlSharedPreloadLibraries: "pgaudit" +## Start PostgreSQL pod(s) without limitations on shm memory. +## By default docker and containerd (and possibly other container runtimes) limit `/dev/shm` to `64M` +## ref: https://github.com/docker-library/postgres/issues/416 +## ref: https://github.com/containerd/containerd/issues/3654 +## +shmVolume: + ## @param shmVolume.enabled Enable emptyDir volume for /dev/shm for PostgreSQL pod(s) + ## + enabled: true + ## @param shmVolume.sizeLimit Set this to enable a size limit on the shm tmpfs + ## Note: the size of the tmpfs counts against container's memory limit + ## e.g: + ## sizeLimit: 1Gi + ## + sizeLimit: "" +## TLS configuration +## +tls: + ## @param tls.enabled Enable TLS traffic support + ## + enabled: false + ## @param tls.autoGenerated Generate automatically self-signed TLS certificates + ## + autoGenerated: false + ## @param tls.preferServerCiphers Whether to use the server's TLS cipher preferences rather than the client's + ## + preferServerCiphers: true + ## @param tls.certificatesSecret Name of an existing secret that contains the certificates + ## + certificatesSecret: "" + ## @param tls.certFilename Certificate filename + ## + certFilename: "" + ## @param tls.certKeyFilename Certificate key filename + ## + certKeyFilename: "" + ## @param tls.certCAFilename CA Certificate filename + ## If provided, PostgreSQL will authenticate TLS/SSL clients by requesting them a certificate + ## ref: https://www.postgresql.org/docs/9.6/auth-methods.html + ## + certCAFilename: "" + ## @param tls.crlFilename File containing a Certificate Revocation List + ## + crlFilename: "" + +## @section PostgreSQL Primary parameters +## +primary: + ## @param primary.name Name of the primary database (eg primary, master, leader, ...) + ## + name: primary + ## @param primary.configuration PostgreSQL Primary main configuration to be injected as ConfigMap + ## ref: https://www.postgresql.org/docs/current/static/runtime-config.html + ## + configuration: "" + ## @param primary.pgHbaConfiguration PostgreSQL Primary client authentication configuration + ## ref: https://www.postgresql.org/docs/current/static/auth-pg-hba-conf.html + ## e.g:# + ## pgHbaConfiguration: |- + ## local all all trust + ## host all all localhost trust + ## host mydatabase mysuser 192.168.0.0/24 md5 + ## + pgHbaConfiguration: "" + ## @param primary.existingConfigmap Name of an existing ConfigMap with PostgreSQL Primary configuration + ## NOTE: `primary.configuration` and `primary.pgHbaConfiguration` will be ignored + ## + existingConfigmap: "" + ## @param primary.extendedConfiguration Extended PostgreSQL Primary configuration (appended to main or default configuration) + ## ref: https://github.com/bitnami/containers/tree/main/bitnami/postgresql#allow-settings-to-be-loaded-from-files-other-than-the-default-postgresqlconf + ## + extendedConfiguration: "" + ## @param primary.existingExtendedConfigmap Name of an existing ConfigMap with PostgreSQL Primary extended configuration + ## NOTE: `primary.extendedConfiguration` will be ignored + ## + existingExtendedConfigmap: "" + ## Initdb configuration + ## ref: https://github.com/bitnami/containers/tree/main/bitnami/postgresql#specifying-initdb-arguments + ## + initdb: + ## @param primary.initdb.args PostgreSQL initdb extra arguments + ## + args: "" + ## @param primary.initdb.postgresqlWalDir Specify a custom location for the PostgreSQL transaction log + ## + postgresqlWalDir: "" + ## @param primary.initdb.scripts Dictionary of initdb scripts + ## Specify dictionary of scripts to be run at first boot + ## e.g: + ## scripts: + ## my_init_script.sh: | + ## #!/bin/sh + ## echo "Do something." + ## + scripts: {} + ## @param primary.initdb.scriptsConfigMap ConfigMap with scripts to be run at first boot + ## NOTE: This will override `primary.initdb.scripts` + ## + scriptsConfigMap: "" + ## @param primary.initdb.scriptsSecret Secret with scripts to be run at first boot (in case it contains sensitive information) + ## NOTE: This can work along `primary.initdb.scripts` or `primary.initdb.scriptsConfigMap` + ## + scriptsSecret: "" + ## @param primary.initdb.user Specify the PostgreSQL username to execute the initdb scripts + ## + user: "" + ## @param primary.initdb.password Specify the PostgreSQL password to execute the initdb scripts + ## + password: "" + ## Configure current cluster's primary server to be the standby server in other cluster. + ## This will allow cross cluster replication and provide cross cluster high availability. + ## You will need to configure pgHbaConfiguration if you want to enable this feature with local cluster replication enabled. + ## @param primary.standby.enabled Whether to enable current cluster's primary as standby server of another cluster or not + ## @param primary.standby.primaryHost The Host of replication primary in the other cluster + ## @param primary.standby.primaryPort The Port of replication primary in the other cluster + ## + standby: + enabled: false + primaryHost: "" + primaryPort: "" + ## @param primary.extraEnvVars Array with extra environment variables to add to PostgreSQL Primary nodes + ## e.g: + ## extraEnvVars: + ## - name: FOO + ## value: "bar" + ## + extraEnvVars: [] + ## @param primary.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for PostgreSQL Primary nodes + ## + extraEnvVarsCM: "" + ## @param primary.extraEnvVarsSecret Name of existing Secret containing extra env vars for PostgreSQL Primary nodes + ## + extraEnvVarsSecret: "" + ## @param primary.command Override default container command (useful when using custom images) + ## + command: [] + ## @param primary.args Override default container args (useful when using custom images) + ## + args: [] + ## Configure extra options for PostgreSQL Primary containers' liveness, readiness and startup probes + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes + ## @param primary.livenessProbe.enabled Enable livenessProbe on PostgreSQL Primary containers + ## @param primary.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe + ## @param primary.livenessProbe.periodSeconds Period seconds for livenessProbe + ## @param primary.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe + ## @param primary.livenessProbe.failureThreshold Failure threshold for livenessProbe + ## @param primary.livenessProbe.successThreshold Success threshold for livenessProbe + ## + livenessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + successThreshold: 1 + ## @param primary.readinessProbe.enabled Enable readinessProbe on PostgreSQL Primary containers + ## @param primary.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe + ## @param primary.readinessProbe.periodSeconds Period seconds for readinessProbe + ## @param primary.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe + ## @param primary.readinessProbe.failureThreshold Failure threshold for readinessProbe + ## @param primary.readinessProbe.successThreshold Success threshold for readinessProbe + ## + readinessProbe: + enabled: true + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + successThreshold: 1 + ## @param primary.startupProbe.enabled Enable startupProbe on PostgreSQL Primary containers + ## @param primary.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe + ## @param primary.startupProbe.periodSeconds Period seconds for startupProbe + ## @param primary.startupProbe.timeoutSeconds Timeout seconds for startupProbe + ## @param primary.startupProbe.failureThreshold Failure threshold for startupProbe + ## @param primary.startupProbe.successThreshold Success threshold for startupProbe + ## + startupProbe: + enabled: false + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 15 + successThreshold: 1 + ## @param primary.customLivenessProbe Custom livenessProbe that overrides the default one + ## + customLivenessProbe: {} + ## @param primary.customReadinessProbe Custom readinessProbe that overrides the default one + ## + customReadinessProbe: {} + ## @param primary.customStartupProbe Custom startupProbe that overrides the default one + ## + customStartupProbe: {} + ## @param primary.lifecycleHooks for the PostgreSQL Primary container to automate configuration before or after startup + ## + lifecycleHooks: {} + ## PostgreSQL Primary resource requests and limits + ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + ## @param primary.resources.limits The resources limits for the PostgreSQL Primary containers + ## @param primary.resources.requests.memory The requested memory for the PostgreSQL Primary containers + ## @param primary.resources.requests.cpu The requested cpu for the PostgreSQL Primary containers + ## + resources: + limits: {} + requests: + memory: 256Mi + cpu: 250m + ## Pod Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ + ## @param primary.podSecurityContext.enabled Enable security context + ## @param primary.podSecurityContext.fsGroupChangePolicy Set filesystem group change policy + ## @param primary.podSecurityContext.sysctls Set kernel settings using the sysctl interface + ## @param primary.podSecurityContext.supplementalGroups Set filesystem extra groups + ## @param primary.podSecurityContext.fsGroup Group ID for the pod + ## + podSecurityContext: + enabled: true + fsGroupChangePolicy: Always + sysctls: [] + supplementalGroups: [] + fsGroup: 1001 + ## Container Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ + ## @param primary.containerSecurityContext.enabled Enabled containers' Security Context + ## @param primary.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container + ## @param primary.containerSecurityContext.runAsUser Set containers' Security Context runAsUser + ## @param primary.containerSecurityContext.runAsNonRoot Set container's Security Context runAsNonRoot + ## @param primary.containerSecurityContext.privileged Set container's Security Context privileged + ## @param primary.containerSecurityContext.readOnlyRootFilesystem Set container's Security Context readOnlyRootFilesystem + ## @param primary.containerSecurityContext.allowPrivilegeEscalation Set container's Security Context allowPrivilegeEscalation + ## @param primary.containerSecurityContext.capabilities.drop List of capabilities to be dropped + ## @param primary.containerSecurityContext.seccompProfile.type Set container's Security Context seccomp profile + ## + containerSecurityContext: + enabled: true + seLinuxOptions: null + runAsUser: 1001 + runAsNonRoot: true + privileged: false + readOnlyRootFilesystem: false + allowPrivilegeEscalation: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: "RuntimeDefault" + ## @param primary.automountServiceAccountToken Mount Service Account token in pod + ## + automountServiceAccountToken: false + ## @param primary.hostAliases PostgreSQL primary pods host aliases + ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ + ## + hostAliases: [] + ## @param primary.hostNetwork Specify if host network should be enabled for PostgreSQL pod (postgresql primary) + ## + hostNetwork: false + ## @param primary.hostIPC Specify if host IPC should be enabled for PostgreSQL pod (postgresql primary) + ## + hostIPC: false + ## @param primary.labels Map of labels to add to the statefulset (postgresql primary) + ## + labels: {} + ## @param primary.annotations Annotations for PostgreSQL primary pods + ## + annotations: {} + ## @param primary.podLabels Map of labels to add to the pods (postgresql primary) + ## + podLabels: {} + ## @param primary.podAnnotations Map of annotations to add to the pods (postgresql primary) + ## + podAnnotations: {} + ## @param primary.podAffinityPreset PostgreSQL primary pod affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity + ## + podAffinityPreset: "" + ## @param primary.podAntiAffinityPreset PostgreSQL primary pod anti-affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity + ## + podAntiAffinityPreset: soft + ## PostgreSQL Primary node affinity preset + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity + ## + nodeAffinityPreset: + ## @param primary.nodeAffinityPreset.type PostgreSQL primary node affinity preset type. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` + ## + type: "" + ## @param primary.nodeAffinityPreset.key PostgreSQL primary node label key to match Ignored if `primary.affinity` is set. + ## E.g. + ## key: "kubernetes.io/e2e-az-name" + ## + key: "" + ## @param primary.nodeAffinityPreset.values PostgreSQL primary node label values to match. Ignored if `primary.affinity` is set. + ## E.g. + ## values: + ## - e2e-az1 + ## - e2e-az2 + ## + values: [] + ## @param primary.affinity Affinity for PostgreSQL primary pods assignment + ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity + ## Note: primary.podAffinityPreset, primary.podAntiAffinityPreset, and primary.nodeAffinityPreset will be ignored when it's set + ## + affinity: {} + ## @param primary.nodeSelector Node labels for PostgreSQL primary pods assignment + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ + ## + nodeSelector: {} + ## @param primary.tolerations Tolerations for PostgreSQL primary pods assignment + ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + ## + tolerations: [] + ## @param primary.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template + ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods + ## + topologySpreadConstraints: [] + ## @param primary.priorityClassName Priority Class to use for each pod (postgresql primary) + ## + priorityClassName: "" + ## @param primary.schedulerName Use an alternate scheduler, e.g. "stork". + ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ + ## + schedulerName: "" + ## @param primary.terminationGracePeriodSeconds Seconds PostgreSQL primary pod needs to terminate gracefully + ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods + ## + terminationGracePeriodSeconds: "" + ## @param primary.updateStrategy.type PostgreSQL Primary statefulset strategy type + ## @param primary.updateStrategy.rollingUpdate PostgreSQL Primary statefulset rolling update configuration parameters + ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies + ## + updateStrategy: + type: RollingUpdate + rollingUpdate: {} + ## @param primary.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the PostgreSQL Primary container(s) + ## + extraVolumeMounts: [] + ## @param primary.extraVolumes Optionally specify extra list of additional volumes for the PostgreSQL Primary pod(s) + ## + extraVolumes: [] + ## @param primary.sidecars Add additional sidecar containers to the PostgreSQL Primary pod(s) + ## For example: + ## sidecars: + ## - name: your-image-name + ## image: your-image + ## imagePullPolicy: Always + ## ports: + ## - name: portname + ## containerPort: 1234 + ## + sidecars: [] + ## @param primary.initContainers Add additional init containers to the PostgreSQL Primary pod(s) + ## Example + ## + ## initContainers: + ## - name: do-something + ## image: busybox + ## command: ['do', 'something'] + ## + initContainers: [] + ## @param primary.extraPodSpec Optionally specify extra PodSpec for the PostgreSQL Primary pod(s) + ## + extraPodSpec: {} + ## PostgreSQL Primary service configuration + ## + service: + ## @param primary.service.type Kubernetes Service type + ## + type: ClusterIP + ## @param primary.service.ports.postgresql PostgreSQL service port + ## + ports: + postgresql: 5432 + ## Node ports to expose + ## NOTE: choose port between <30000-32767> + ## @param primary.service.nodePorts.postgresql Node port for PostgreSQL + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport + ## + nodePorts: + postgresql: "" + ## @param primary.service.clusterIP Static clusterIP or None for headless services + ## e.g: + ## clusterIP: None + ## + clusterIP: "" + ## @param primary.service.annotations Annotations for PostgreSQL primary service + ## + annotations: {} + ## @param primary.service.loadBalancerIP Load balancer IP if service type is `LoadBalancer` + ## Set the LoadBalancer service type to internal only + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer + ## + loadBalancerIP: "" + ## @param primary.service.externalTrafficPolicy Enable client source IP preservation + ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + ## + externalTrafficPolicy: Cluster + ## @param primary.service.loadBalancerSourceRanges Addresses that are allowed when service is LoadBalancer + ## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service + ## + ## loadBalancerSourceRanges: + ## - 10.10.10.0/24 + ## + loadBalancerSourceRanges: [] + ## @param primary.service.extraPorts Extra ports to expose in the PostgreSQL primary service + ## + extraPorts: [] + ## @param primary.service.sessionAffinity Session Affinity for Kubernetes service, can be "None" or "ClientIP" + ## If "ClientIP", consecutive client requests will be directed to the same Pod + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies + ## + sessionAffinity: None + ## @param primary.service.sessionAffinityConfig Additional settings for the sessionAffinity + ## sessionAffinityConfig: + ## clientIP: + ## timeoutSeconds: 300 + ## + sessionAffinityConfig: {} + ## Headless service properties + ## + headless: + ## @param primary.service.headless.annotations Additional custom annotations for headless PostgreSQL primary service + ## + annotations: {} + ## PostgreSQL Primary persistence configuration + ## + persistence: + ## @param primary.persistence.enabled Enable PostgreSQL Primary data persistence using PVC + ## + enabled: true + ## @param primary.persistence.existingClaim Name of an existing PVC to use + ## + existingClaim: "" + ## @param primary.persistence.mountPath The path the volume will be mounted at + ## Note: useful when using custom PostgreSQL images + ## + mountPath: /bitnami/postgresql + ## @param primary.persistence.subPath The subdirectory of the volume to mount to + ## Useful in dev environments and one PV for multiple services + ## + subPath: "" + ## @param primary.persistence.storageClass PVC Storage Class for PostgreSQL Primary data volume + ## If defined, storageClassName: + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. (gp2 on AWS, standard on + ## GKE, AWS & OpenStack) + ## + storageClass: "" + ## @param primary.persistence.accessModes PVC Access Mode for PostgreSQL volume + ## + accessModes: + - ReadWriteOnce + ## @param primary.persistence.size PVC Storage Request for PostgreSQL volume + ## + size: 8Gi + ## @param primary.persistence.annotations Annotations for the PVC + ## + annotations: {} + ## @param primary.persistence.labels Labels for the PVC + ## + labels: {} + ## @param primary.persistence.selector Selector to match an existing Persistent Volume (this value is evaluated as a template) + ## selector: + ## matchLabels: + ## app: my-app + ## + selector: {} + ## @param primary.persistence.dataSource Custom PVC data source + ## + dataSource: {} + ## PostgreSQL Primary Persistent Volume Claim Retention Policy + ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention + ## + persistentVolumeClaimRetentionPolicy: + ## @param primary.persistentVolumeClaimRetentionPolicy.enabled Enable Persistent volume retention policy for Primary Statefulset + ## + enabled: false + ## @param primary.persistentVolumeClaimRetentionPolicy.whenScaled Volume retention behavior when the replica count of the StatefulSet is reduced + ## + whenScaled: Retain + ## @param primary.persistentVolumeClaimRetentionPolicy.whenDeleted Volume retention behavior that applies when the StatefulSet is deleted + ## + whenDeleted: Retain + +## @section PostgreSQL read only replica parameters (only used when `architecture` is set to `replication`) +## +readReplicas: + ## @param readReplicas.name Name of the read replicas database (eg secondary, slave, ...) + ## + name: read + ## @param readReplicas.replicaCount Number of PostgreSQL read only replicas + ## + replicaCount: 1 + ## @param readReplicas.extendedConfiguration Extended PostgreSQL read only replicas configuration (appended to main or default configuration) + ## ref: https://github.com/bitnami/containers/tree/main/bitnami/postgresql#allow-settings-to-be-loaded-from-files-other-than-the-default-postgresqlconf + ## + extendedConfiguration: "" + ## @param readReplicas.extraEnvVars Array with extra environment variables to add to PostgreSQL read only nodes + ## e.g: + ## extraEnvVars: + ## - name: FOO + ## value: "bar" + ## + extraEnvVars: [] + ## @param readReplicas.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for PostgreSQL read only nodes + ## + extraEnvVarsCM: "" + ## @param readReplicas.extraEnvVarsSecret Name of existing Secret containing extra env vars for PostgreSQL read only nodes + ## + extraEnvVarsSecret: "" + ## @param readReplicas.command Override default container command (useful when using custom images) + ## + command: [] + ## @param readReplicas.args Override default container args (useful when using custom images) + ## + args: [] + ## Configure extra options for PostgreSQL read only containers' liveness, readiness and startup probes + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes + ## @param readReplicas.livenessProbe.enabled Enable livenessProbe on PostgreSQL read only containers + ## @param readReplicas.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe + ## @param readReplicas.livenessProbe.periodSeconds Period seconds for livenessProbe + ## @param readReplicas.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe + ## @param readReplicas.livenessProbe.failureThreshold Failure threshold for livenessProbe + ## @param readReplicas.livenessProbe.successThreshold Success threshold for livenessProbe + ## + livenessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + successThreshold: 1 + ## @param readReplicas.readinessProbe.enabled Enable readinessProbe on PostgreSQL read only containers + ## @param readReplicas.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe + ## @param readReplicas.readinessProbe.periodSeconds Period seconds for readinessProbe + ## @param readReplicas.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe + ## @param readReplicas.readinessProbe.failureThreshold Failure threshold for readinessProbe + ## @param readReplicas.readinessProbe.successThreshold Success threshold for readinessProbe + ## + readinessProbe: + enabled: true + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + successThreshold: 1 + ## @param readReplicas.startupProbe.enabled Enable startupProbe on PostgreSQL read only containers + ## @param readReplicas.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe + ## @param readReplicas.startupProbe.periodSeconds Period seconds for startupProbe + ## @param readReplicas.startupProbe.timeoutSeconds Timeout seconds for startupProbe + ## @param readReplicas.startupProbe.failureThreshold Failure threshold for startupProbe + ## @param readReplicas.startupProbe.successThreshold Success threshold for startupProbe + ## + startupProbe: + enabled: false + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 15 + successThreshold: 1 + ## @param readReplicas.customLivenessProbe Custom livenessProbe that overrides the default one + ## + customLivenessProbe: {} + ## @param readReplicas.customReadinessProbe Custom readinessProbe that overrides the default one + ## + customReadinessProbe: {} + ## @param readReplicas.customStartupProbe Custom startupProbe that overrides the default one + ## + customStartupProbe: {} + ## @param readReplicas.lifecycleHooks for the PostgreSQL read only container to automate configuration before or after startup + ## + lifecycleHooks: {} + ## PostgreSQL read only resource requests and limits + ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + ## @param readReplicas.resources.limits The resources limits for the PostgreSQL read only containers + ## @param readReplicas.resources.requests.memory The requested memory for the PostgreSQL read only containers + ## @param readReplicas.resources.requests.cpu The requested cpu for the PostgreSQL read only containers + ## + resources: + limits: {} + requests: + memory: 256Mi + cpu: 250m + ## Pod Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ + ## @param readReplicas.podSecurityContext.enabled Enable security context + ## @param readReplicas.podSecurityContext.fsGroupChangePolicy Set filesystem group change policy + ## @param readReplicas.podSecurityContext.sysctls Set kernel settings using the sysctl interface + ## @param readReplicas.podSecurityContext.supplementalGroups Set filesystem extra groups + ## @param readReplicas.podSecurityContext.fsGroup Group ID for the pod + ## + podSecurityContext: + enabled: true + fsGroupChangePolicy: Always + sysctls: [] + supplementalGroups: [] + fsGroup: 1001 + ## Container Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ + ## @param readReplicas.containerSecurityContext.enabled Enabled containers' Security Context + ## @param readReplicas.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container + ## @param readReplicas.containerSecurityContext.runAsUser Set containers' Security Context runAsUser + ## @param readReplicas.containerSecurityContext.runAsNonRoot Set container's Security Context runAsNonRoot + ## @param readReplicas.containerSecurityContext.privileged Set container's Security Context privileged + ## @param readReplicas.containerSecurityContext.readOnlyRootFilesystem Set container's Security Context readOnlyRootFilesystem + ## @param readReplicas.containerSecurityContext.allowPrivilegeEscalation Set container's Security Context allowPrivilegeEscalation + ## @param readReplicas.containerSecurityContext.capabilities.drop List of capabilities to be dropped + ## @param readReplicas.containerSecurityContext.seccompProfile.type Set container's Security Context seccomp profile + ## + containerSecurityContext: + enabled: true + seLinuxOptions: null + runAsUser: 1001 + runAsNonRoot: true + privileged: false + readOnlyRootFilesystem: false + allowPrivilegeEscalation: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: "RuntimeDefault" + ## @param readReplicas.automountServiceAccountToken Mount Service Account token in pod + ## + automountServiceAccountToken: false + ## @param readReplicas.hostAliases PostgreSQL read only pods host aliases + ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ + ## + hostAliases: [] + ## @param readReplicas.hostNetwork Specify if host network should be enabled for PostgreSQL pod (PostgreSQL read only) + ## + hostNetwork: false + ## @param readReplicas.hostIPC Specify if host IPC should be enabled for PostgreSQL pod (postgresql primary) + ## + hostIPC: false + ## @param readReplicas.labels Map of labels to add to the statefulset (PostgreSQL read only) + ## + labels: {} + ## @param readReplicas.annotations Annotations for PostgreSQL read only pods + ## + annotations: {} + ## @param readReplicas.podLabels Map of labels to add to the pods (PostgreSQL read only) + ## + podLabels: {} + ## @param readReplicas.podAnnotations Map of annotations to add to the pods (PostgreSQL read only) + ## + podAnnotations: {} + ## @param readReplicas.podAffinityPreset PostgreSQL read only pod affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity + ## + podAffinityPreset: "" + ## @param readReplicas.podAntiAffinityPreset PostgreSQL read only pod anti-affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity + ## + podAntiAffinityPreset: soft + ## PostgreSQL read only node affinity preset + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity + ## + nodeAffinityPreset: + ## @param readReplicas.nodeAffinityPreset.type PostgreSQL read only node affinity preset type. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` + ## + type: "" + ## @param readReplicas.nodeAffinityPreset.key PostgreSQL read only node label key to match Ignored if `primary.affinity` is set. + ## E.g. + ## key: "kubernetes.io/e2e-az-name" + ## + key: "" + ## @param readReplicas.nodeAffinityPreset.values PostgreSQL read only node label values to match. Ignored if `primary.affinity` is set. + ## E.g. + ## values: + ## - e2e-az1 + ## - e2e-az2 + ## + values: [] + ## @param readReplicas.affinity Affinity for PostgreSQL read only pods assignment + ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity + ## Note: primary.podAffinityPreset, primary.podAntiAffinityPreset, and primary.nodeAffinityPreset will be ignored when it's set + ## + affinity: {} + ## @param readReplicas.nodeSelector Node labels for PostgreSQL read only pods assignment + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ + ## + nodeSelector: {} + ## @param readReplicas.tolerations Tolerations for PostgreSQL read only pods assignment + ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + ## + tolerations: [] + ## @param readReplicas.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template + ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods + ## + topologySpreadConstraints: [] + ## @param readReplicas.priorityClassName Priority Class to use for each pod (PostgreSQL read only) + ## + priorityClassName: "" + ## @param readReplicas.schedulerName Use an alternate scheduler, e.g. "stork". + ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ + ## + schedulerName: "" + ## @param readReplicas.terminationGracePeriodSeconds Seconds PostgreSQL read only pod needs to terminate gracefully + ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods + ## + terminationGracePeriodSeconds: "" + ## @param readReplicas.updateStrategy.type PostgreSQL read only statefulset strategy type + ## @param readReplicas.updateStrategy.rollingUpdate PostgreSQL read only statefulset rolling update configuration parameters + ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies + ## + updateStrategy: + type: RollingUpdate + rollingUpdate: {} + ## @param readReplicas.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the PostgreSQL read only container(s) + ## + extraVolumeMounts: [] + ## @param readReplicas.extraVolumes Optionally specify extra list of additional volumes for the PostgreSQL read only pod(s) + ## + extraVolumes: [] + ## @param readReplicas.sidecars Add additional sidecar containers to the PostgreSQL read only pod(s) + ## For example: + ## sidecars: + ## - name: your-image-name + ## image: your-image + ## imagePullPolicy: Always + ## ports: + ## - name: portname + ## containerPort: 1234 + ## + sidecars: [] + ## @param readReplicas.initContainers Add additional init containers to the PostgreSQL read only pod(s) + ## Example + ## + ## initContainers: + ## - name: do-something + ## image: busybox + ## command: ['do', 'something'] + ## + initContainers: [] + ## @param readReplicas.extraPodSpec Optionally specify extra PodSpec for the PostgreSQL read only pod(s) + ## + extraPodSpec: {} + ## PostgreSQL read only service configuration + ## + service: + ## @param readReplicas.service.type Kubernetes Service type + ## + type: ClusterIP + ## @param readReplicas.service.ports.postgresql PostgreSQL service port + ## + ports: + postgresql: 5432 + ## Node ports to expose + ## NOTE: choose port between <30000-32767> + ## @param readReplicas.service.nodePorts.postgresql Node port for PostgreSQL + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport + ## + nodePorts: + postgresql: "" + ## @param readReplicas.service.clusterIP Static clusterIP or None for headless services + ## e.g: + ## clusterIP: None + ## + clusterIP: "" + ## @param readReplicas.service.annotations Annotations for PostgreSQL read only service + ## + annotations: {} + ## @param readReplicas.service.loadBalancerIP Load balancer IP if service type is `LoadBalancer` + ## Set the LoadBalancer service type to internal only + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer + ## + loadBalancerIP: "" + ## @param readReplicas.service.externalTrafficPolicy Enable client source IP preservation + ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + ## + externalTrafficPolicy: Cluster + ## @param readReplicas.service.loadBalancerSourceRanges Addresses that are allowed when service is LoadBalancer + ## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service + ## + ## loadBalancerSourceRanges: + ## - 10.10.10.0/24 + ## + loadBalancerSourceRanges: [] + ## @param readReplicas.service.extraPorts Extra ports to expose in the PostgreSQL read only service + ## + extraPorts: [] + ## @param readReplicas.service.sessionAffinity Session Affinity for Kubernetes service, can be "None" or "ClientIP" + ## If "ClientIP", consecutive client requests will be directed to the same Pod + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies + ## + sessionAffinity: None + ## @param readReplicas.service.sessionAffinityConfig Additional settings for the sessionAffinity + ## sessionAffinityConfig: + ## clientIP: + ## timeoutSeconds: 300 + ## + sessionAffinityConfig: {} + ## Headless service properties + ## + headless: + ## @param readReplicas.service.headless.annotations Additional custom annotations for headless PostgreSQL read only service + ## + annotations: {} + ## PostgreSQL read only persistence configuration + ## + persistence: + ## @param readReplicas.persistence.enabled Enable PostgreSQL read only data persistence using PVC + ## + enabled: true + ## @param readReplicas.persistence.existingClaim Name of an existing PVC to use + ## + existingClaim: "" + ## @param readReplicas.persistence.mountPath The path the volume will be mounted at + ## Note: useful when using custom PostgreSQL images + ## + mountPath: /bitnami/postgresql + ## @param readReplicas.persistence.subPath The subdirectory of the volume to mount to + ## Useful in dev environments and one PV for multiple services + ## + subPath: "" + ## @param readReplicas.persistence.storageClass PVC Storage Class for PostgreSQL read only data volume + ## If defined, storageClassName: + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. (gp2 on AWS, standard on + ## GKE, AWS & OpenStack) + ## + storageClass: "" + ## @param readReplicas.persistence.accessModes PVC Access Mode for PostgreSQL volume + ## + accessModes: + - ReadWriteOnce + ## @param readReplicas.persistence.size PVC Storage Request for PostgreSQL volume + ## + size: 8Gi + ## @param readReplicas.persistence.annotations Annotations for the PVC + ## + annotations: {} + ## @param readReplicas.persistence.labels Labels for the PVC + ## + labels: {} + ## @param readReplicas.persistence.selector Selector to match an existing Persistent Volume (this value is evaluated as a template) + ## selector: + ## matchLabels: + ## app: my-app + ## + selector: {} + ## @param readReplicas.persistence.dataSource Custom PVC data source + ## + dataSource: {} + ## PostgreSQL Read only Persistent Volume Claim Retention Policy + ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention + ## + persistentVolumeClaimRetentionPolicy: + ## @param readReplicas.persistentVolumeClaimRetentionPolicy.enabled Enable Persistent volume retention policy for read only Statefulset + ## + enabled: false + ## @param readReplicas.persistentVolumeClaimRetentionPolicy.whenScaled Volume retention behavior when the replica count of the StatefulSet is reduced + ## + whenScaled: Retain + ## @param readReplicas.persistentVolumeClaimRetentionPolicy.whenDeleted Volume retention behavior that applies when the StatefulSet is deleted + ## + whenDeleted: Retain + + +## @section Backup parameters +## This section implements a trivial logical dump cronjob of the database. +## This only comes with the consistency guarantees of the dump program. +## This is not a snapshot based roll forward/backward recovery backup. +## ref: https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/ +backup: + ## @param backup.enabled Enable the logical dump of the database "regularly" + enabled: false + cronjob: + ## @param backup.cronjob.schedule Set the cronjob parameter schedule + schedule: "@daily" + ## @param backup.cronjob.timeZone Set the cronjob parameter timeZone + timeZone: "" + ## @param backup.cronjob.concurrencyPolicy Set the cronjob parameter concurrencyPolicy + concurrencyPolicy: Allow + ## @param backup.cronjob.failedJobsHistoryLimit Set the cronjob parameter failedJobsHistoryLimit + failedJobsHistoryLimit: 1 + ## @param backup.cronjob.successfulJobsHistoryLimit Set the cronjob parameter successfulJobsHistoryLimit + successfulJobsHistoryLimit: 3 + ## @param backup.cronjob.startingDeadlineSeconds Set the cronjob parameter startingDeadlineSeconds + startingDeadlineSeconds: "" + ## @param backup.cronjob.ttlSecondsAfterFinished Set the cronjob parameter ttlSecondsAfterFinished + ttlSecondsAfterFinished: "" + ## @param backup.cronjob.restartPolicy Set the cronjob parameter restartPolicy + restartPolicy: OnFailure + ## @param backup.cronjob.podSecurityContext.enabled Enable PodSecurityContext for CronJob/Backup + ## @param backup.cronjob.podSecurityContext.fsGroupChangePolicy Set filesystem group change policy + ## @param backup.cronjob.podSecurityContext.sysctls Set kernel settings using the sysctl interface + ## @param backup.cronjob.podSecurityContext.supplementalGroups Set filesystem extra groups + ## @param backup.cronjob.podSecurityContext.fsGroup Group ID for the CronJob + podSecurityContext: + enabled: true + fsGroupChangePolicy: Always + sysctls: [] + supplementalGroups: [] + fsGroup: 1001 + ## backup container's Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container + ## @param backup.cronjob.containerSecurityContext.enabled Enabled containers' Security Context + ## @param backup.cronjob.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container + ## @param backup.cronjob.containerSecurityContext.runAsUser Set containers' Security Context runAsUser + ## @param backup.cronjob.containerSecurityContext.runAsNonRoot Set container's Security Context runAsNonRoot + ## @param backup.cronjob.containerSecurityContext.privileged Set container's Security Context privileged + ## @param backup.cronjob.containerSecurityContext.readOnlyRootFilesystem Set container's Security Context readOnlyRootFilesystem + ## @param backup.cronjob.containerSecurityContext.allowPrivilegeEscalation Set container's Security Context allowPrivilegeEscalation + ## @param backup.cronjob.containerSecurityContext.capabilities.drop List of capabilities to be dropped + ## @param backup.cronjob.containerSecurityContext.seccompProfile.type Set container's Security Context seccomp profile + containerSecurityContext: + enabled: true + seLinuxOptions: null + runAsUser: 1001 + runAsNonRoot: true + privileged: false + readOnlyRootFilesystem: false + allowPrivilegeEscalation: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: "RuntimeDefault" + ## @param backup.cronjob.command Set backup container's command to run + command: + - /bin/sh + - -c + - "pg_dumpall --clean --if-exists --load-via-partition-root --quote-all-identifiers --no-password --file=${PGDUMP_DIR}/pg_dumpall-$(date '+%Y-%m-%d-%H-%M').pgdump" + + ## @param backup.cronjob.labels Set the cronjob labels + labels: {} + ## @param backup.cronjob.annotations Set the cronjob annotations + annotations: {} + ## @param backup.cronjob.nodeSelector Node labels for PostgreSQL backup CronJob pod assignment + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes/ + ## + nodeSelector: {} + storage: + ## @param backup.cronjob.storage.existingClaim Provide an existing `PersistentVolumeClaim` (only when `architecture=standalone`) + ## If defined, PVC must be created manually before volume will be bound + ## + existingClaim: "" + ## @param backup.cronjob.storage.resourcePolicy Setting it to "keep" to avoid removing PVCs during a helm delete operation. Leaving it empty will delete PVCs after the chart deleted + ## + resourcePolicy: "" + ## @param backup.cronjob.storage.storageClass PVC Storage Class for the backup data volume + ## If defined, storageClassName: + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. + ## + storageClass: "" + ## @param backup.cronjob.storage.accessModes PV Access Mode + ## + accessModes: + - ReadWriteOnce + ## @param backup.cronjob.storage.size PVC Storage Request for the backup data volume + ## + size: 8Gi + ## @param backup.cronjob.storage.annotations PVC annotations + ## + annotations: {} + ## @param backup.cronjob.storage.mountPath Path to mount the volume at + ## + mountPath: /backup/pgdump + ## @param backup.cronjob.storage.subPath Subdirectory of the volume to mount at + ## and one PV for multiple services. + ## + subPath: "" + ## Fine tuning for volumeClaimTemplates + ## + volumeClaimTemplates: + ## @param backup.cronjob.storage.volumeClaimTemplates.selector A label query over volumes to consider for binding (e.g. when using local volumes) + ## A label query over volumes to consider for binding (e.g. when using local volumes) + ## See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#labelselector-v1-meta for more details + ## + selector: {} + +## @section NetworkPolicy parameters +## + +## Add networkpolicies +## +networkPolicy: + ## @param networkPolicy.enabled Enable network policies + ## + enabled: false + ## @param networkPolicy.metrics.enabled Enable network policies for metrics (prometheus) + ## @param networkPolicy.metrics.namespaceSelector [object] Monitoring namespace selector labels. These labels will be used to identify the prometheus' namespace. + ## @param networkPolicy.metrics.podSelector [object] Monitoring pod selector labels. These labels will be used to identify the Prometheus pods. + ## + metrics: + enabled: false + ## e.g: + ## namespaceSelector: + ## label: monitoring + ## + namespaceSelector: {} + ## e.g: + ## podSelector: + ## label: monitoring + ## + podSelector: {} + ## Ingress Rules + ## + ingressRules: + ## @param networkPolicy.ingressRules.primaryAccessOnlyFrom.enabled Enable ingress rule that makes PostgreSQL primary node only accessible from a particular origin. + ## @param networkPolicy.ingressRules.primaryAccessOnlyFrom.namespaceSelector [object] Namespace selector label that is allowed to access the PostgreSQL primary node. This label will be used to identified the allowed namespace(s). + ## @param networkPolicy.ingressRules.primaryAccessOnlyFrom.podSelector [object] Pods selector label that is allowed to access the PostgreSQL primary node. This label will be used to identified the allowed pod(s). + ## @param networkPolicy.ingressRules.primaryAccessOnlyFrom.customRules Custom network policy for the PostgreSQL primary node. + ## + primaryAccessOnlyFrom: + enabled: false + ## e.g: + ## namespaceSelector: + ## label: ingress + ## + namespaceSelector: {} + ## e.g: + ## podSelector: + ## label: access + ## + podSelector: {} + ## custom ingress rules + ## e.g: + ## customRules: + ## - from: + ## - namespaceSelector: + ## matchLabels: + ## label: example + ## + customRules: [] + ## @param networkPolicy.ingressRules.readReplicasAccessOnlyFrom.enabled Enable ingress rule that makes PostgreSQL read-only nodes only accessible from a particular origin. + ## @param networkPolicy.ingressRules.readReplicasAccessOnlyFrom.namespaceSelector [object] Namespace selector label that is allowed to access the PostgreSQL read-only nodes. This label will be used to identified the allowed namespace(s). + ## @param networkPolicy.ingressRules.readReplicasAccessOnlyFrom.podSelector [object] Pods selector label that is allowed to access the PostgreSQL read-only nodes. This label will be used to identified the allowed pod(s). + ## @param networkPolicy.ingressRules.readReplicasAccessOnlyFrom.customRules Custom network policy for the PostgreSQL read-only nodes. + ## + readReplicasAccessOnlyFrom: + enabled: false + ## e.g: + ## namespaceSelector: + ## label: ingress + ## + namespaceSelector: {} + ## e.g: + ## podSelector: + ## label: access + ## + podSelector: {} + ## custom ingress rules + ## e.g: + ## CustomRules: + ## - from: + ## - namespaceSelector: + ## matchLabels: + ## label: example + ## + customRules: [] + ## @param networkPolicy.egressRules.denyConnectionsToExternal Enable egress rule that denies outgoing traffic outside the cluster, except for DNS (port 53). + ## @param networkPolicy.egressRules.customRules Custom network policy rule + ## + egressRules: + # Deny connections to external. This is not compatible with an external database. + denyConnectionsToExternal: false + ## Additional custom egress rules + ## e.g: + ## customRules: + ## - to: + ## - namespaceSelector: + ## matchLabels: + ## label: example + ## + customRules: [] + +## @section Volume Permissions parameters +## + +## Init containers parameters: +## volumePermissions: Change the owner and group of the persistent volume(s) mountpoint(s) to 'runAsUser:fsGroup' on each node +## +volumePermissions: + ## @param volumePermissions.enabled Enable init container that changes the owner and group of the persistent volume + ## + enabled: false + ## @param volumePermissions.image.registry [default: REGISTRY_NAME] Init container volume-permissions image registry + ## @param volumePermissions.image.repository [default: REPOSITORY_NAME/os-shell] Init container volume-permissions image repository + ## @skip volumePermissions.image.tag Init container volume-permissions image tag (immutable tags are recommended) + ## @param volumePermissions.image.digest Init container volume-permissions image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag + ## @param volumePermissions.image.pullPolicy Init container volume-permissions image pull policy + ## @param volumePermissions.image.pullSecrets Init container volume-permissions image pull secrets + ## + image: + registry: docker.io + repository: bitnami/os-shell + tag: 11-debian-11-r95 + digest: "" + pullPolicy: IfNotPresent + ## Optionally specify an array of imagePullSecrets. + ## Secrets must be manually created in the namespace. + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + ## Example: + ## pullSecrets: + ## - myRegistryKeySecretName + ## + pullSecrets: [] + ## Init container resource requests and limits + ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + ## @param volumePermissions.resources.limits Init container volume-permissions resource limits + ## @param volumePermissions.resources.requests Init container volume-permissions resource requests + ## + resources: + limits: {} + requests: {} + ## Init container' Security Context + ## Note: the chown of the data folder is done to containerSecurityContext.runAsUser + ## and not the below volumePermissions.containerSecurityContext.runAsUser + ## @param volumePermissions.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container + ## @param volumePermissions.containerSecurityContext.runAsUser User ID for the init container + ## @param volumePermissions.containerSecurityContext.runAsGroup Group ID for the init container + ## @param volumePermissions.containerSecurityContext.runAsNonRoot runAsNonRoot for the init container + ## @param volumePermissions.containerSecurityContext.seccompProfile.type seccompProfile.type for the init container + ## + containerSecurityContext: + seLinuxOptions: null + runAsUser: 0 + runAsGroup: 0 + runAsNonRoot: false + seccompProfile: + type: RuntimeDefault +## @section Other Parameters +## + +## @param serviceBindings.enabled Create secret for service binding (Experimental) +## Ref: https://servicebinding.io/service-provider/ +## +serviceBindings: + enabled: false + +## Service account for PostgreSQL to use. +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/ +## +serviceAccount: + ## @param serviceAccount.create Enable creation of ServiceAccount for PostgreSQL pod + ## + create: true + ## @param serviceAccount.name The name of the ServiceAccount to use. + ## If not set and create is true, a name is generated using the common.names.fullname template + ## + name: "" + ## @param serviceAccount.automountServiceAccountToken Allows auto mount of ServiceAccountToken on the serviceAccount created + ## Can be set to false if pods using this serviceAccount do not need to use K8s API + ## + automountServiceAccountToken: false + ## @param serviceAccount.annotations Additional custom annotations for the ServiceAccount + ## + annotations: {} +## Creates role for ServiceAccount +## @param rbac.create Create Role and RoleBinding (required for PSP to work) +## +rbac: + create: false + ## @param rbac.rules Custom RBAC rules to set + ## e.g: + ## rules: + ## - apiGroups: + ## - "" + ## resources: + ## - pods + ## verbs: + ## - get + ## - list + ## + rules: [] +## Pod Security Policy +## ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/ +## @param psp.create Whether to create a PodSecurityPolicy. WARNING: PodSecurityPolicy is deprecated in Kubernetes v1.21 or later, unavailable in v1.25 or later +## +psp: + create: false + +## @section Metrics Parameters +## + +metrics: + ## @param metrics.enabled Start a prometheus exporter + ## + enabled: false + ## @param metrics.image.registry [default: REGISTRY_NAME] PostgreSQL Prometheus Exporter image registry + ## @param metrics.image.repository [default: REPOSITORY_NAME/postgres-exporter] PostgreSQL Prometheus Exporter image repository + ## @skip metrics.image.tag PostgreSQL Prometheus Exporter image tag (immutable tags are recommended) + ## @param metrics.image.digest PostgreSQL image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag + ## @param metrics.image.pullPolicy PostgreSQL Prometheus Exporter image pull policy + ## @param metrics.image.pullSecrets Specify image pull secrets + ## + image: + registry: docker.io + repository: bitnami/postgres-exporter + tag: 0.15.0-debian-11-r6 + digest: "" + pullPolicy: IfNotPresent + ## Optionally specify an array of imagePullSecrets. + ## Secrets must be manually created in the namespace. + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + ## Example: + ## pullSecrets: + ## - myRegistryKeySecretName + ## + pullSecrets: [] + ## @param metrics.collectors Control enabled collectors + ## ref: https://github.com/prometheus-community/postgres_exporter#flags + ## Example: + ## collectors: + ## wal: false + collectors: {} + ## @param metrics.customMetrics Define additional custom metrics + ## ref: https://github.com/prometheus-community/postgres_exporter#adding-new-metrics-via-a-config-file-deprecated + ## customMetrics: + ## pg_database: + ## query: "SELECT d.datname AS name, CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT') THEN pg_catalog.pg_database_size(d.datname) ELSE 0 END AS size_bytes FROM pg_catalog.pg_database d where datname not in ('template0', 'template1', 'postgres')" + ## metrics: + ## - name: + ## usage: "LABEL" + ## description: "Name of the database" + ## - size_bytes: + ## usage: "GAUGE" + ## description: "Size of the database in bytes" + ## + customMetrics: {} + ## @param metrics.extraEnvVars Extra environment variables to add to PostgreSQL Prometheus exporter + ## see: https://github.com/prometheus-community/postgres_exporter#environment-variables + ## For example: + ## extraEnvVars: + ## - name: PG_EXPORTER_DISABLE_DEFAULT_METRICS + ## value: "true" + ## + extraEnvVars: [] + ## PostgreSQL Prometheus exporter containers' Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container + ## @param metrics.containerSecurityContext.enabled Enabled containers' Security Context + ## @param metrics.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container + ## @param metrics.containerSecurityContext.runAsUser Set containers' Security Context runAsUser + ## @param metrics.containerSecurityContext.runAsNonRoot Set container's Security Context runAsNonRoot + ## @param metrics.containerSecurityContext.privileged Set container's Security Context privileged + ## @param metrics.containerSecurityContext.readOnlyRootFilesystem Set container's Security Context readOnlyRootFilesystem + ## @param metrics.containerSecurityContext.allowPrivilegeEscalation Set container's Security Context allowPrivilegeEscalation + ## @param metrics.containerSecurityContext.capabilities.drop List of capabilities to be dropped + ## @param metrics.containerSecurityContext.seccompProfile.type Set container's Security Context seccomp profile + ## + containerSecurityContext: + enabled: true + seLinuxOptions: null + runAsUser: 1001 + runAsNonRoot: true + privileged: false + readOnlyRootFilesystem: false + allowPrivilegeEscalation: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: "RuntimeDefault" + ## Configure extra options for PostgreSQL Prometheus exporter containers' liveness, readiness and startup probes + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes + ## @param metrics.livenessProbe.enabled Enable livenessProbe on PostgreSQL Prometheus exporter containers + ## @param metrics.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe + ## @param metrics.livenessProbe.periodSeconds Period seconds for livenessProbe + ## @param metrics.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe + ## @param metrics.livenessProbe.failureThreshold Failure threshold for livenessProbe + ## @param metrics.livenessProbe.successThreshold Success threshold for livenessProbe + ## + livenessProbe: + enabled: true + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + successThreshold: 1 + ## @param metrics.readinessProbe.enabled Enable readinessProbe on PostgreSQL Prometheus exporter containers + ## @param metrics.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe + ## @param metrics.readinessProbe.periodSeconds Period seconds for readinessProbe + ## @param metrics.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe + ## @param metrics.readinessProbe.failureThreshold Failure threshold for readinessProbe + ## @param metrics.readinessProbe.successThreshold Success threshold for readinessProbe + ## + readinessProbe: + enabled: true + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + successThreshold: 1 + ## @param metrics.startupProbe.enabled Enable startupProbe on PostgreSQL Prometheus exporter containers + ## @param metrics.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe + ## @param metrics.startupProbe.periodSeconds Period seconds for startupProbe + ## @param metrics.startupProbe.timeoutSeconds Timeout seconds for startupProbe + ## @param metrics.startupProbe.failureThreshold Failure threshold for startupProbe + ## @param metrics.startupProbe.successThreshold Success threshold for startupProbe + ## + startupProbe: + enabled: false + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 15 + successThreshold: 1 + ## @param metrics.customLivenessProbe Custom livenessProbe that overrides the default one + ## + customLivenessProbe: {} + ## @param metrics.customReadinessProbe Custom readinessProbe that overrides the default one + ## + customReadinessProbe: {} + ## @param metrics.customStartupProbe Custom startupProbe that overrides the default one + ## + customStartupProbe: {} + ## @param metrics.containerPorts.metrics PostgreSQL Prometheus exporter metrics container port + ## + containerPorts: + metrics: 9187 + ## PostgreSQL Prometheus exporter resource requests and limits + ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + ## @param metrics.resources.limits The resources limits for the PostgreSQL Prometheus exporter container + ## @param metrics.resources.requests The requested resources for the PostgreSQL Prometheus exporter container + ## + resources: + limits: {} + requests: {} + ## Service configuration + ## + service: + ## @param metrics.service.ports.metrics PostgreSQL Prometheus Exporter service port + ## + ports: + metrics: 9187 + ## @param metrics.service.clusterIP Static clusterIP or None for headless services + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#choosing-your-own-ip-address + ## + clusterIP: "" + ## @param metrics.service.sessionAffinity Control where client requests go, to the same pod or round-robin + ## Values: ClientIP or None + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/ + ## + sessionAffinity: None + ## @param metrics.service.annotations [object] Annotations for Prometheus to auto-discover the metrics endpoint + ## + annotations: + prometheus.io/scrape: "true" + prometheus.io/port: "{{ .Values.metrics.service.ports.metrics }}" + ## Prometheus Operator ServiceMonitor configuration + ## + serviceMonitor: + ## @param metrics.serviceMonitor.enabled Create ServiceMonitor Resource for scraping metrics using Prometheus Operator + ## + enabled: false + ## @param metrics.serviceMonitor.namespace Namespace for the ServiceMonitor Resource (defaults to the Release Namespace) + ## + namespace: "" + ## @param metrics.serviceMonitor.interval Interval at which metrics should be scraped. + ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint + ## + interval: "" + ## @param metrics.serviceMonitor.scrapeTimeout Timeout after which the scrape is ended + ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint + ## + scrapeTimeout: "" + ## @param metrics.serviceMonitor.labels Additional labels that can be used so ServiceMonitor will be discovered by Prometheus + ## + labels: {} + ## @param metrics.serviceMonitor.selector Prometheus instance selector labels + ## ref: https://github.com/bitnami/charts/tree/main/bitnami/prometheus-operator#prometheus-configuration + ## + selector: {} + ## @param metrics.serviceMonitor.relabelings RelabelConfigs to apply to samples before scraping + ## + relabelings: [] + ## @param metrics.serviceMonitor.metricRelabelings MetricRelabelConfigs to apply to samples before ingestion + ## + metricRelabelings: [] + ## @param metrics.serviceMonitor.honorLabels Specify honorLabels parameter to add the scrape endpoint + ## + honorLabels: false + ## @param metrics.serviceMonitor.jobLabel The name of the label on the target service to use as the job name in prometheus. + ## + jobLabel: "" + ## Custom PrometheusRule to be defined + ## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart + ## ref: https://github.com/coreos/prometheus-operator#customresourcedefinitions + ## + prometheusRule: + ## @param metrics.prometheusRule.enabled Create a PrometheusRule for Prometheus Operator + ## + enabled: false + ## @param metrics.prometheusRule.namespace Namespace for the PrometheusRule Resource (defaults to the Release Namespace) + ## + namespace: "" + ## @param metrics.prometheusRule.labels Additional labels that can be used so PrometheusRule will be discovered by Prometheus + ## + labels: {} + ## @param metrics.prometheusRule.rules PrometheusRule definitions + ## Make sure to constraint the rules to the current postgresql service. + ## rules: + ## - alert: HugeReplicationLag + ## expr: pg_replication_lag{service="{{ printf "%s-metrics" (include "common.names.fullname" .) }}"} / 3600 > 1 + ## for: 1m + ## labels: + ## severity: critical + ## annotations: + ## description: replication for {{ include "common.names.fullname" . }} PostgreSQL is lagging by {{ "{{ $value }}" }} hour(s). + ## summary: PostgreSQL replication is lagging by {{ "{{ $value }}" }} hour(s). + ## + rules: [] diff --git a/thunder_deployment/infra/beta9/charts/redis/.helmignore b/thunder_deployment/infra/beta9/charts/redis/.helmignore new file mode 100644 index 000000000..fb56657ab --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +# img folder +img/ diff --git a/thunder_deployment/infra/beta9/charts/redis/Chart.lock b/thunder_deployment/infra/beta9/charts/redis/Chart.lock new file mode 100644 index 000000000..01190b829 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: oci://registry-1.docker.io/bitnamicharts + version: 2.14.1 +digest: sha256:5ccbe5f1fe4459864a8c9d7329c400b678666b6cfb1450818a830bda81995bc3 +generated: "2023-12-19T19:11:00.40217662Z" diff --git a/thunder_deployment/infra/beta9/charts/redis/Chart.yaml b/thunder_deployment/infra/beta9/charts/redis/Chart.yaml new file mode 100644 index 000000000..f3d0d1d1c --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/Chart.yaml @@ -0,0 +1,36 @@ +annotations: + category: Database + images: | + - name: os-shell + image: docker.io/bitnami/os-shell:11-debian-11-r94 + - name: redis-exporter + image: docker.io/bitnami/redis-exporter:1.56.0-debian-11-r1 + - name: redis-sentinel + image: docker.io/bitnami/redis-sentinel:7.2.4-debian-11-r3 + - name: redis + image: docker.io/bitnami/redis:7.2.4-debian-11-r2 + licenses: Apache-2.0 +apiVersion: v2 +appVersion: 7.2.4 +dependencies: +- name: common + repository: oci://registry-1.docker.io/bitnamicharts + tags: + - bitnami-common + version: 2.x.x +description: Redis(R) is an open source, advanced key-value store. It is often referred + to as a data structure server since keys can contain strings, hashes, lists, sets + and sorted sets. +home: https://bitnami.com +icon: https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png +keywords: +- redis +- keyvalue +- database +maintainers: +- name: VMware, Inc. + url: https://github.com/bitnami/charts +name: redis +sources: +- https://github.com/bitnami/charts/tree/main/bitnami/redis +version: 18.9.1 diff --git a/thunder_deployment/infra/beta9/charts/redis/README.md b/thunder_deployment/infra/beta9/charts/redis/README.md new file mode 100644 index 000000000..829954184 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/README.md @@ -0,0 +1,1223 @@ + + +# Bitnami package for Redis(R) + +Redis(R) is an open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets. + +[Overview of Redis®](http://redis.io) + +Disclaimer: Redis is a registered trademark of Redis Ltd. Any rights therein are reserved to Redis Ltd. Any use by Bitnami is for referential purposes only and does not indicate any sponsorship, endorsement, or affiliation between Redis Ltd. + +## TL;DR + +```console +helm install my-release oci://registry-1.docker.io/bitnamicharts/redis +``` + +Looking to use Redisreg; in production? Try [VMware Tanzu Application Catalog](https://bitnami.com/enterprise), the enterprise edition of Bitnami Application Catalog. + +## Introduction + +This chart bootstraps a [Redis®](https://github.com/bitnami/containers/tree/main/bitnami/redis) deployment on a [Kubernetes](https://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. + +Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. + +### Choose between Redis® Helm Chart and Redis® Cluster Helm Chart + +You can choose any of the two Redis® Helm charts for deploying a Redis® cluster. + +1. [Redis® Helm Chart](https://github.com/bitnami/charts/tree/main/bitnami/redis) will deploy a master-replica cluster, with the [option](https://github.com/bitnami/charts/tree/main/bitnami/redis#redis-sentinel-configuration-parameters) of enabling using Redis® Sentinel. +2. [Redis® Cluster Helm Chart](https://github.com/bitnami/charts/tree/main/bitnami/redis-cluster) will deploy a Redis® Cluster topology with sharding. + +The main features of each chart are the following: + +| Redis® | Redis® Cluster | +|--------------------------------------------------------|------------------------------------------------------------------------| +| Supports multiple databases | Supports only one database. Better if you have a big dataset | +| Single write point (single master) | Multiple write points (multiple masters) | +| ![Redis® Topology](img/redis-topology.png) | ![Redis® Cluster Topology](img/redis-cluster-topology.png) | + +## Prerequisites + +- Kubernetes 1.23+ +- Helm 3.8.0+ +- PV provisioner support in the underlying infrastructure + +## Installing the Chart + +To install the chart with the release name `my-release`: + +```console +helm install my-release oci://REGISTRY_NAME/REPOSITORY_NAME/redis +``` + +> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. + +The command deploys Redis® on the Kubernetes cluster in the default configuration. The [Parameters](#parameters) section lists the parameters that can be configured during installation. + +> **Tip**: List all releases using `helm list` + +## Uninstalling the Chart + +To uninstall/delete the `my-release` deployment: + +```console +helm delete my-release +``` + +The command removes all the Kubernetes components associated with the chart and deletes the release. + +## Parameters + +### Global parameters + +| Name | Description | Value | +| ------------------------- | ------------------------------------------------------ | ----- | +| `global.imageRegistry` | Global Docker image registry | `""` | +| `global.imagePullSecrets` | Global Docker registry secret names as an array | `[]` | +| `global.storageClass` | Global StorageClass for Persistent Volume(s) | `""` | +| `global.redis.password` | Global Redis® password (overrides `auth.password`) | `""` | + +### Common parameters + +| Name | Description | Value | +| ------------------------- | -------------------------------------------------------------------------------------------------------------- | --------------- | +| `kubeVersion` | Override Kubernetes version | `""` | +| `nameOverride` | String to partially override common.names.fullname | `""` | +| `fullnameOverride` | String to fully override common.names.fullname | `""` | +| `namespaceOverride` | String to fully override common.names.namespace | `""` | +| `commonLabels` | Labels to add to all deployed objects | `{}` | +| `commonAnnotations` | Annotations to add to all deployed objects | `{}` | +| `secretAnnotations` | Annotations to add to secret | `{}` | +| `clusterDomain` | Kubernetes cluster domain name | `cluster.local` | +| `extraDeploy` | Array of extra objects to deploy with the release | `[]` | +| `useHostnames` | Use hostnames internally when announcing replication. If false, the hostname will be resolved to an IP address | `true` | +| `nameResolutionThreshold` | Failure threshold for internal hostnames resolution | `5` | +| `nameResolutionTimeout` | Timeout seconds between probes for internal hostnames resolution | `5` | +| `diagnosticMode.enabled` | Enable diagnostic mode (all probes will be disabled and the command will be overridden) | `false` | +| `diagnosticMode.command` | Command to override all containers in the deployment | `["sleep"]` | +| `diagnosticMode.args` | Args to override all containers in the deployment | `["infinity"]` | + +### Redis® Image parameters + +| Name | Description | Value | +| ------------------- | ---------------------------------------------------------------------------------------------------------- | ----------------------- | +| `image.registry` | Redis® image registry | `REGISTRY_NAME` | +| `image.repository` | Redis® image repository | `REPOSITORY_NAME/redis` | +| `image.digest` | Redis® image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | +| `image.pullPolicy` | Redis® image pull policy | `IfNotPresent` | +| `image.pullSecrets` | Redis® image pull secrets | `[]` | +| `image.debug` | Enable image debug mode | `false` | + +### Redis® common configuration parameters + +| Name | Description | Value | +| -------------------------------- | ------------------------------------------------------------------------------------- | ------------- | +| `architecture` | Redis® architecture. Allowed values: `standalone` or `replication` | `replication` | +| `auth.enabled` | Enable password authentication | `true` | +| `auth.sentinel` | Enable password authentication on sentinels too | `true` | +| `auth.password` | Redis® password | `""` | +| `auth.existingSecret` | The name of an existing secret with Redis® credentials | `""` | +| `auth.existingSecretPasswordKey` | Password key to be retrieved from existing secret | `""` | +| `auth.usePasswordFiles` | Mount credentials as files instead of using an environment variable | `false` | +| `commonConfiguration` | Common configuration to be added into the ConfigMap | `""` | +| `existingConfigmap` | The name of an existing ConfigMap with your custom configuration for Redis® nodes | `""` | + +### Redis® master configuration parameters + +| Name | Description | Value | +| ---------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------ | +| `master.count` | Number of Redis® master instances to deploy (experimental, requires additional configuration) | `1` | +| `master.configuration` | Configuration for Redis® master nodes | `""` | +| `master.disableCommands` | Array with Redis® commands to disable on master nodes | `["FLUSHDB","FLUSHALL"]` | +| `master.command` | Override default container command (useful when using custom images) | `[]` | +| `master.args` | Override default container args (useful when using custom images) | `[]` | +| `master.enableServiceLinks` | Whether information about services should be injected into pod's environment variable | `true` | +| `master.preExecCmds` | Additional commands to run prior to starting Redis® master | `[]` | +| `master.extraFlags` | Array with additional command line flags for Redis® master | `[]` | +| `master.extraEnvVars` | Array with extra environment variables to add to Redis® master nodes | `[]` | +| `master.extraEnvVarsCM` | Name of existing ConfigMap containing extra env vars for Redis® master nodes | `""` | +| `master.extraEnvVarsSecret` | Name of existing Secret containing extra env vars for Redis® master nodes | `""` | +| `master.containerPorts.redis` | Container port to open on Redis® master nodes | `6379` | +| `master.startupProbe.enabled` | Enable startupProbe on Redis® master nodes | `false` | +| `master.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `20` | +| `master.startupProbe.periodSeconds` | Period seconds for startupProbe | `5` | +| `master.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `5` | +| `master.startupProbe.failureThreshold` | Failure threshold for startupProbe | `5` | +| `master.startupProbe.successThreshold` | Success threshold for startupProbe | `1` | +| `master.livenessProbe.enabled` | Enable livenessProbe on Redis® master nodes | `true` | +| `master.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `20` | +| `master.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `5` | +| `master.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `5` | +| `master.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `5` | +| `master.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` | +| `master.readinessProbe.enabled` | Enable readinessProbe on Redis® master nodes | `true` | +| `master.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `20` | +| `master.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `5` | +| `master.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `1` | +| `master.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `5` | +| `master.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` | +| `master.customStartupProbe` | Custom startupProbe that overrides the default one | `{}` | +| `master.customLivenessProbe` | Custom livenessProbe that overrides the default one | `{}` | +| `master.customReadinessProbe` | Custom readinessProbe that overrides the default one | `{}` | +| `master.resources.limits` | The resources limits for the Redis® master containers | `{}` | +| `master.resources.requests` | The requested resources for the Redis® master containers | `{}` | +| `master.podSecurityContext.enabled` | Enabled Redis® master pods' Security Context | `true` | +| `master.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | +| `master.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | +| `master.podSecurityContext.supplementalGroups` | Set filesystem extra groups | `[]` | +| `master.podSecurityContext.fsGroup` | Set Redis® master pod's Security Context fsGroup | `1001` | +| `master.containerSecurityContext.enabled` | Enabled Redis® master containers' Security Context | `true` | +| `master.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | +| `master.containerSecurityContext.runAsUser` | Set Redis® master containers' Security Context runAsUser | `1001` | +| `master.containerSecurityContext.runAsGroup` | Set Redis® master containers' Security Context runAsGroup | `0` | +| `master.containerSecurityContext.runAsNonRoot` | Set Redis® master containers' Security Context runAsNonRoot | `true` | +| `master.containerSecurityContext.allowPrivilegeEscalation` | Is it possible to escalate Redis® pod(s) privileges | `false` | +| `master.containerSecurityContext.seccompProfile.type` | Set Redis® master containers' Security Context seccompProfile | `RuntimeDefault` | +| `master.containerSecurityContext.capabilities.drop` | Set Redis® master containers' Security Context capabilities to drop | `["ALL"]` | +| `master.kind` | Use either Deployment, StatefulSet (default) or DaemonSet | `StatefulSet` | +| `master.schedulerName` | Alternate scheduler for Redis® master pods | `""` | +| `master.updateStrategy.type` | Redis® master statefulset strategy type | `RollingUpdate` | +| `master.minReadySeconds` | How many seconds a pod needs to be ready before killing the next, during update | `0` | +| `master.priorityClassName` | Redis® master pods' priorityClassName | `""` | +| `master.automountServiceAccountToken` | Mount Service Account token in pod | `false` | +| `master.hostAliases` | Redis® master pods host aliases | `[]` | +| `master.podLabels` | Extra labels for Redis® master pods | `{}` | +| `master.podAnnotations` | Annotations for Redis® master pods | `{}` | +| `master.shareProcessNamespace` | Share a single process namespace between all of the containers in Redis® master pods | `false` | +| `master.podAffinityPreset` | Pod affinity preset. Ignored if `master.affinity` is set. Allowed values: `soft` or `hard` | `""` | +| `master.podAntiAffinityPreset` | Pod anti-affinity preset. Ignored if `master.affinity` is set. Allowed values: `soft` or `hard` | `soft` | +| `master.nodeAffinityPreset.type` | Node affinity preset type. Ignored if `master.affinity` is set. Allowed values: `soft` or `hard` | `""` | +| `master.nodeAffinityPreset.key` | Node label key to match. Ignored if `master.affinity` is set | `""` | +| `master.nodeAffinityPreset.values` | Node label values to match. Ignored if `master.affinity` is set | `[]` | +| `master.affinity` | Affinity for Redis® master pods assignment | `{}` | +| `master.nodeSelector` | Node labels for Redis® master pods assignment | `{}` | +| `master.tolerations` | Tolerations for Redis® master pods assignment | `[]` | +| `master.topologySpreadConstraints` | Spread Constraints for Redis® master pod assignment | `[]` | +| `master.dnsPolicy` | DNS Policy for Redis® master pod | `""` | +| `master.dnsConfig` | DNS Configuration for Redis® master pod | `{}` | +| `master.lifecycleHooks` | for the Redis® master container(s) to automate configuration before or after startup | `{}` | +| `master.extraVolumes` | Optionally specify extra list of additional volumes for the Redis® master pod(s) | `[]` | +| `master.extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for the Redis® master container(s) | `[]` | +| `master.sidecars` | Add additional sidecar containers to the Redis® master pod(s) | `[]` | +| `master.initContainers` | Add additional init containers to the Redis® master pod(s) | `[]` | +| `master.persistence.enabled` | Enable persistence on Redis® master nodes using Persistent Volume Claims | `true` | +| `master.persistence.medium` | Provide a medium for `emptyDir` volumes. | `""` | +| `master.persistence.sizeLimit` | Set this to enable a size limit for `emptyDir` volumes. | `""` | +| `master.persistence.path` | The path the volume will be mounted at on Redis® master containers | `/data` | +| `master.persistence.subPath` | The subdirectory of the volume to mount on Redis® master containers | `""` | +| `master.persistence.subPathExpr` | Used to construct the subPath subdirectory of the volume to mount on Redis® master containers | `""` | +| `master.persistence.storageClass` | Persistent Volume storage class | `""` | +| `master.persistence.accessModes` | Persistent Volume access modes | `["ReadWriteOnce"]` | +| `master.persistence.size` | Persistent Volume size | `8Gi` | +| `master.persistence.annotations` | Additional custom annotations for the PVC | `{}` | +| `master.persistence.labels` | Additional custom labels for the PVC | `{}` | +| `master.persistence.selector` | Additional labels to match for the PVC | `{}` | +| `master.persistence.dataSource` | Custom PVC data source | `{}` | +| `master.persistence.existingClaim` | Use a existing PVC which must be created manually before bound | `""` | +| `master.persistentVolumeClaimRetentionPolicy.enabled` | Controls if and how PVCs are deleted during the lifecycle of a StatefulSet | `false` | +| `master.persistentVolumeClaimRetentionPolicy.whenScaled` | Volume retention behavior when the replica count of the StatefulSet is reduced | `Retain` | +| `master.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted | `Retain` | +| `master.service.type` | Redis® master service type | `ClusterIP` | +| `master.service.ports.redis` | Redis® master service port | `6379` | +| `master.service.nodePorts.redis` | Node port for Redis® master | `""` | +| `master.service.externalTrafficPolicy` | Redis® master service external traffic policy | `Cluster` | +| `master.service.extraPorts` | Extra ports to expose (normally used with the `sidecar` value) | `[]` | +| `master.service.internalTrafficPolicy` | Redis® master service internal traffic policy (requires Kubernetes v1.22 or greater to be usable) | `Cluster` | +| `master.service.clusterIP` | Redis® master service Cluster IP | `""` | +| `master.service.loadBalancerIP` | Redis® master service Load Balancer IP | `""` | +| `master.service.loadBalancerClass` | master service Load Balancer class if service type is `LoadBalancer` (optional, cloud specific) | `""` | +| `master.service.loadBalancerSourceRanges` | Redis® master service Load Balancer sources | `[]` | +| `master.service.externalIPs` | Redis® master service External IPs | `[]` | +| `master.service.annotations` | Additional custom annotations for Redis® master service | `{}` | +| `master.service.sessionAffinity` | Session Affinity for Kubernetes service, can be "None" or "ClientIP" | `None` | +| `master.service.sessionAffinityConfig` | Additional settings for the sessionAffinity | `{}` | +| `master.terminationGracePeriodSeconds` | Integer setting the termination grace period for the redis-master pods | `30` | +| `master.serviceAccount.create` | Specifies whether a ServiceAccount should be created | `true` | +| `master.serviceAccount.name` | The name of the ServiceAccount to use. | `""` | +| `master.serviceAccount.automountServiceAccountToken` | Whether to auto mount the service account token | `false` | +| `master.serviceAccount.annotations` | Additional custom annotations for the ServiceAccount | `{}` | + +### Redis® replicas configuration parameters + +| Name | Description | Value | +| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------ | +| `replica.kind` | Use either DaemonSet or StatefulSet (default) | `StatefulSet` | +| `replica.replicaCount` | Number of Redis® replicas to deploy | `3` | +| `replica.configuration` | Configuration for Redis® replicas nodes | `""` | +| `replica.disableCommands` | Array with Redis® commands to disable on replicas nodes | `["FLUSHDB","FLUSHALL"]` | +| `replica.command` | Override default container command (useful when using custom images) | `[]` | +| `replica.args` | Override default container args (useful when using custom images) | `[]` | +| `replica.enableServiceLinks` | Whether information about services should be injected into pod's environment variable | `true` | +| `replica.preExecCmds` | Additional commands to run prior to starting Redis® replicas | `[]` | +| `replica.extraFlags` | Array with additional command line flags for Redis® replicas | `[]` | +| `replica.extraEnvVars` | Array with extra environment variables to add to Redis® replicas nodes | `[]` | +| `replica.extraEnvVarsCM` | Name of existing ConfigMap containing extra env vars for Redis® replicas nodes | `""` | +| `replica.extraEnvVarsSecret` | Name of existing Secret containing extra env vars for Redis® replicas nodes | `""` | +| `replica.externalMaster.enabled` | Use external master for bootstrapping | `false` | +| `replica.externalMaster.host` | External master host to bootstrap from | `""` | +| `replica.externalMaster.port` | Port for Redis service external master host | `6379` | +| `replica.containerPorts.redis` | Container port to open on Redis® replicas nodes | `6379` | +| `replica.startupProbe.enabled` | Enable startupProbe on Redis® replicas nodes | `true` | +| `replica.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `10` | +| `replica.startupProbe.periodSeconds` | Period seconds for startupProbe | `10` | +| `replica.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `5` | +| `replica.startupProbe.failureThreshold` | Failure threshold for startupProbe | `22` | +| `replica.startupProbe.successThreshold` | Success threshold for startupProbe | `1` | +| `replica.livenessProbe.enabled` | Enable livenessProbe on Redis® replicas nodes | `true` | +| `replica.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `20` | +| `replica.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `5` | +| `replica.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `5` | +| `replica.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `5` | +| `replica.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` | +| `replica.readinessProbe.enabled` | Enable readinessProbe on Redis® replicas nodes | `true` | +| `replica.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `20` | +| `replica.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `5` | +| `replica.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `1` | +| `replica.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `5` | +| `replica.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` | +| `replica.customStartupProbe` | Custom startupProbe that overrides the default one | `{}` | +| `replica.customLivenessProbe` | Custom livenessProbe that overrides the default one | `{}` | +| `replica.customReadinessProbe` | Custom readinessProbe that overrides the default one | `{}` | +| `replica.resources.limits` | The resources limits for the Redis® replicas containers | `{}` | +| `replica.resources.requests` | The requested resources for the Redis® replicas containers | `{}` | +| `replica.podSecurityContext.enabled` | Enabled Redis® replicas pods' Security Context | `true` | +| `replica.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | +| `replica.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | +| `replica.podSecurityContext.supplementalGroups` | Set filesystem extra groups | `[]` | +| `replica.podSecurityContext.fsGroup` | Set Redis® replicas pod's Security Context fsGroup | `1001` | +| `replica.containerSecurityContext.enabled` | Enabled Redis® replicas containers' Security Context | `true` | +| `replica.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | +| `replica.containerSecurityContext.runAsUser` | Set Redis® replicas containers' Security Context runAsUser | `1001` | +| `replica.containerSecurityContext.runAsGroup` | Set Redis® replicas containers' Security Context runAsGroup | `0` | +| `replica.containerSecurityContext.runAsNonRoot` | Set Redis® replicas containers' Security Context runAsNonRoot | `true` | +| `replica.containerSecurityContext.allowPrivilegeEscalation` | Set Redis® replicas pod's Security Context allowPrivilegeEscalation | `false` | +| `replica.containerSecurityContext.seccompProfile.type` | Set Redis® replicas containers' Security Context seccompProfile | `RuntimeDefault` | +| `replica.containerSecurityContext.capabilities.drop` | Set Redis® replicas containers' Security Context capabilities to drop | `["ALL"]` | +| `replica.schedulerName` | Alternate scheduler for Redis® replicas pods | `""` | +| `replica.updateStrategy.type` | Redis® replicas statefulset strategy type | `RollingUpdate` | +| `replica.minReadySeconds` | How many seconds a pod needs to be ready before killing the next, during update | `0` | +| `replica.priorityClassName` | Redis® replicas pods' priorityClassName | `""` | +| `replica.podManagementPolicy` | podManagementPolicy to manage scaling operation of %%MAIN_CONTAINER_NAME%% pods | `""` | +| `replica.automountServiceAccountToken` | Mount Service Account token in pod | `false` | +| `replica.hostAliases` | Redis® replicas pods host aliases | `[]` | +| `replica.podLabels` | Extra labels for Redis® replicas pods | `{}` | +| `replica.podAnnotations` | Annotations for Redis® replicas pods | `{}` | +| `replica.shareProcessNamespace` | Share a single process namespace between all of the containers in Redis® replicas pods | `false` | +| `replica.podAffinityPreset` | Pod affinity preset. Ignored if `replica.affinity` is set. Allowed values: `soft` or `hard` | `""` | +| `replica.podAntiAffinityPreset` | Pod anti-affinity preset. Ignored if `replica.affinity` is set. Allowed values: `soft` or `hard` | `soft` | +| `replica.nodeAffinityPreset.type` | Node affinity preset type. Ignored if `replica.affinity` is set. Allowed values: `soft` or `hard` | `""` | +| `replica.nodeAffinityPreset.key` | Node label key to match. Ignored if `replica.affinity` is set | `""` | +| `replica.nodeAffinityPreset.values` | Node label values to match. Ignored if `replica.affinity` is set | `[]` | +| `replica.affinity` | Affinity for Redis® replicas pods assignment | `{}` | +| `replica.nodeSelector` | Node labels for Redis® replicas pods assignment | `{}` | +| `replica.tolerations` | Tolerations for Redis® replicas pods assignment | `[]` | +| `replica.topologySpreadConstraints` | Spread Constraints for Redis® replicas pod assignment | `[]` | +| `replica.dnsPolicy` | DNS Policy for Redis® replica pods | `""` | +| `replica.dnsConfig` | DNS Configuration for Redis® replica pods | `{}` | +| `replica.lifecycleHooks` | for the Redis® replica container(s) to automate configuration before or after startup | `{}` | +| `replica.extraVolumes` | Optionally specify extra list of additional volumes for the Redis® replicas pod(s) | `[]` | +| `replica.extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for the Redis® replicas container(s) | `[]` | +| `replica.sidecars` | Add additional sidecar containers to the Redis® replicas pod(s) | `[]` | +| `replica.initContainers` | Add additional init containers to the Redis® replicas pod(s) | `[]` | +| `replica.persistence.enabled` | Enable persistence on Redis® replicas nodes using Persistent Volume Claims | `true` | +| `replica.persistence.medium` | Provide a medium for `emptyDir` volumes. | `""` | +| `replica.persistence.sizeLimit` | Set this to enable a size limit for `emptyDir` volumes. | `""` | +| `replica.persistence.path` | The path the volume will be mounted at on Redis® replicas containers | `/data` | +| `replica.persistence.subPath` | The subdirectory of the volume to mount on Redis® replicas containers | `""` | +| `replica.persistence.subPathExpr` | Used to construct the subPath subdirectory of the volume to mount on Redis® replicas containers | `""` | +| `replica.persistence.storageClass` | Persistent Volume storage class | `""` | +| `replica.persistence.accessModes` | Persistent Volume access modes | `["ReadWriteOnce"]` | +| `replica.persistence.size` | Persistent Volume size | `8Gi` | +| `replica.persistence.annotations` | Additional custom annotations for the PVC | `{}` | +| `replica.persistence.labels` | Additional custom labels for the PVC | `{}` | +| `replica.persistence.selector` | Additional labels to match for the PVC | `{}` | +| `replica.persistence.dataSource` | Custom PVC data source | `{}` | +| `replica.persistence.existingClaim` | Use a existing PVC which must be created manually before bound | `""` | +| `replica.persistentVolumeClaimRetentionPolicy.enabled` | Controls if and how PVCs are deleted during the lifecycle of a StatefulSet | `false` | +| `replica.persistentVolumeClaimRetentionPolicy.whenScaled` | Volume retention behavior when the replica count of the StatefulSet is reduced | `Retain` | +| `replica.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted | `Retain` | +| `replica.service.type` | Redis® replicas service type | `ClusterIP` | +| `replica.service.ports.redis` | Redis® replicas service port | `6379` | +| `replica.service.nodePorts.redis` | Node port for Redis® replicas | `""` | +| `replica.service.externalTrafficPolicy` | Redis® replicas service external traffic policy | `Cluster` | +| `replica.service.internalTrafficPolicy` | Redis® replicas service internal traffic policy (requires Kubernetes v1.22 or greater to be usable) | `Cluster` | +| `replica.service.extraPorts` | Extra ports to expose (normally used with the `sidecar` value) | `[]` | +| `replica.service.clusterIP` | Redis® replicas service Cluster IP | `""` | +| `replica.service.loadBalancerIP` | Redis® replicas service Load Balancer IP | `""` | +| `replica.service.loadBalancerClass` | replicas service Load Balancer class if service type is `LoadBalancer` (optional, cloud specific) | `""` | +| `replica.service.loadBalancerSourceRanges` | Redis® replicas service Load Balancer sources | `[]` | +| `replica.service.annotations` | Additional custom annotations for Redis® replicas service | `{}` | +| `replica.service.sessionAffinity` | Session Affinity for Kubernetes service, can be "None" or "ClientIP" | `None` | +| `replica.service.sessionAffinityConfig` | Additional settings for the sessionAffinity | `{}` | +| `replica.terminationGracePeriodSeconds` | Integer setting the termination grace period for the redis-replicas pods | `30` | +| `replica.autoscaling.enabled` | Enable replica autoscaling settings | `false` | +| `replica.autoscaling.minReplicas` | Minimum replicas for the pod autoscaling | `1` | +| `replica.autoscaling.maxReplicas` | Maximum replicas for the pod autoscaling | `11` | +| `replica.autoscaling.targetCPU` | Percentage of CPU to consider when autoscaling | `""` | +| `replica.autoscaling.targetMemory` | Percentage of Memory to consider when autoscaling | `""` | +| `replica.serviceAccount.create` | Specifies whether a ServiceAccount should be created | `true` | +| `replica.serviceAccount.name` | The name of the ServiceAccount to use. | `""` | +| `replica.serviceAccount.automountServiceAccountToken` | Whether to auto mount the service account token | `false` | +| `replica.serviceAccount.annotations` | Additional custom annotations for the ServiceAccount | `{}` | + +### Redis® Sentinel configuration parameters + +| Name | Description | Value | +| ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | +| `sentinel.enabled` | Use Redis® Sentinel on Redis® pods. | `false` | +| `sentinel.image.registry` | Redis® Sentinel image registry | `REGISTRY_NAME` | +| `sentinel.image.repository` | Redis® Sentinel image repository | `REPOSITORY_NAME/redis-sentinel` | +| `sentinel.image.digest` | Redis® Sentinel image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | +| `sentinel.image.pullPolicy` | Redis® Sentinel image pull policy | `IfNotPresent` | +| `sentinel.image.pullSecrets` | Redis® Sentinel image pull secrets | `[]` | +| `sentinel.image.debug` | Enable image debug mode | `false` | +| `sentinel.annotations` | Additional custom annotations for Redis® Sentinel resource | `{}` | +| `sentinel.masterSet` | Master set name | `mymaster` | +| `sentinel.quorum` | Sentinel Quorum | `2` | +| `sentinel.getMasterTimeout` | Amount of time to allow before get_sentinel_master_info() times out. | `90` | +| `sentinel.automateClusterRecovery` | Automate cluster recovery in cases where the last replica is not considered a good replica and Sentinel won't automatically failover to it. | `false` | +| `sentinel.redisShutdownWaitFailover` | Whether the Redis® master container waits for the failover at shutdown (in addition to the Redis® Sentinel container). | `true` | +| `sentinel.downAfterMilliseconds` | Timeout for detecting a Redis® node is down | `60000` | +| `sentinel.failoverTimeout` | Timeout for performing a election failover | `180000` | +| `sentinel.parallelSyncs` | Number of replicas that can be reconfigured in parallel to use the new master after a failover | `1` | +| `sentinel.configuration` | Configuration for Redis® Sentinel nodes | `""` | +| `sentinel.command` | Override default container command (useful when using custom images) | `[]` | +| `sentinel.args` | Override default container args (useful when using custom images) | `[]` | +| `sentinel.enableServiceLinks` | Whether information about services should be injected into pod's environment variable | `true` | +| `sentinel.preExecCmds` | Additional commands to run prior to starting Redis® Sentinel | `[]` | +| `sentinel.extraEnvVars` | Array with extra environment variables to add to Redis® Sentinel nodes | `[]` | +| `sentinel.extraEnvVarsCM` | Name of existing ConfigMap containing extra env vars for Redis® Sentinel nodes | `""` | +| `sentinel.extraEnvVarsSecret` | Name of existing Secret containing extra env vars for Redis® Sentinel nodes | `""` | +| `sentinel.externalMaster.enabled` | Use external master for bootstrapping | `false` | +| `sentinel.externalMaster.host` | External master host to bootstrap from | `""` | +| `sentinel.externalMaster.port` | Port for Redis service external master host | `6379` | +| `sentinel.containerPorts.sentinel` | Container port to open on Redis® Sentinel nodes | `26379` | +| `sentinel.startupProbe.enabled` | Enable startupProbe on Redis® Sentinel nodes | `true` | +| `sentinel.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `10` | +| `sentinel.startupProbe.periodSeconds` | Period seconds for startupProbe | `10` | +| `sentinel.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `5` | +| `sentinel.startupProbe.failureThreshold` | Failure threshold for startupProbe | `22` | +| `sentinel.startupProbe.successThreshold` | Success threshold for startupProbe | `1` | +| `sentinel.livenessProbe.enabled` | Enable livenessProbe on Redis® Sentinel nodes | `true` | +| `sentinel.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `20` | +| `sentinel.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `10` | +| `sentinel.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `5` | +| `sentinel.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `6` | +| `sentinel.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` | +| `sentinel.readinessProbe.enabled` | Enable readinessProbe on Redis® Sentinel nodes | `true` | +| `sentinel.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `20` | +| `sentinel.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `5` | +| `sentinel.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `1` | +| `sentinel.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `6` | +| `sentinel.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` | +| `sentinel.customStartupProbe` | Custom startupProbe that overrides the default one | `{}` | +| `sentinel.customLivenessProbe` | Custom livenessProbe that overrides the default one | `{}` | +| `sentinel.customReadinessProbe` | Custom readinessProbe that overrides the default one | `{}` | +| `sentinel.persistence.enabled` | Enable persistence on Redis® sentinel nodes using Persistent Volume Claims (Experimental) | `false` | +| `sentinel.persistence.storageClass` | Persistent Volume storage class | `""` | +| `sentinel.persistence.accessModes` | Persistent Volume access modes | `["ReadWriteOnce"]` | +| `sentinel.persistence.size` | Persistent Volume size | `100Mi` | +| `sentinel.persistence.annotations` | Additional custom annotations for the PVC | `{}` | +| `sentinel.persistence.labels` | Additional custom labels for the PVC | `{}` | +| `sentinel.persistence.selector` | Additional labels to match for the PVC | `{}` | +| `sentinel.persistence.dataSource` | Custom PVC data source | `{}` | +| `sentinel.persistence.medium` | Provide a medium for `emptyDir` volumes. | `""` | +| `sentinel.persistence.sizeLimit` | Set this to enable a size limit for `emptyDir` volumes. | `""` | +| `sentinel.persistentVolumeClaimRetentionPolicy.enabled` | Controls if and how PVCs are deleted during the lifecycle of a StatefulSet | `false` | +| `sentinel.persistentVolumeClaimRetentionPolicy.whenScaled` | Volume retention behavior when the replica count of the StatefulSet is reduced | `Retain` | +| `sentinel.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted | `Retain` | +| `sentinel.resources.limits` | The resources limits for the Redis® Sentinel containers | `{}` | +| `sentinel.resources.requests` | The requested resources for the Redis® Sentinel containers | `{}` | +| `sentinel.containerSecurityContext.enabled` | Enabled Redis® Sentinel containers' Security Context | `true` | +| `sentinel.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | +| `sentinel.containerSecurityContext.runAsUser` | Set Redis® Sentinel containers' Security Context runAsUser | `1001` | +| `sentinel.containerSecurityContext.runAsGroup` | Set Redis® Sentinel containers' Security Context runAsGroup | `0` | +| `sentinel.containerSecurityContext.runAsNonRoot` | Set Redis® Sentinel containers' Security Context runAsNonRoot | `true` | +| `sentinel.containerSecurityContext.allowPrivilegeEscalation` | Set Redis® Sentinel containers' Security Context allowPrivilegeEscalation | `false` | +| `sentinel.containerSecurityContext.seccompProfile.type` | Set Redis® Sentinel containers' Security Context seccompProfile | `RuntimeDefault` | +| `sentinel.containerSecurityContext.capabilities.drop` | Set Redis® Sentinel containers' Security Context capabilities to drop | `["ALL"]` | +| `sentinel.lifecycleHooks` | for the Redis® sentinel container(s) to automate configuration before or after startup | `{}` | +| `sentinel.extraVolumes` | Optionally specify extra list of additional volumes for the Redis® Sentinel | `[]` | +| `sentinel.extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for the Redis® Sentinel container(s) | `[]` | +| `sentinel.service.type` | Redis® Sentinel service type | `ClusterIP` | +| `sentinel.service.ports.redis` | Redis® service port for Redis® | `6379` | +| `sentinel.service.ports.sentinel` | Redis® service port for Redis® Sentinel | `26379` | +| `sentinel.service.nodePorts.redis` | Node port for Redis® | `""` | +| `sentinel.service.nodePorts.sentinel` | Node port for Sentinel | `""` | +| `sentinel.service.externalTrafficPolicy` | Redis® Sentinel service external traffic policy | `Cluster` | +| `sentinel.service.extraPorts` | Extra ports to expose (normally used with the `sidecar` value) | `[]` | +| `sentinel.service.clusterIP` | Redis® Sentinel service Cluster IP | `""` | +| `sentinel.service.loadBalancerIP` | Redis® Sentinel service Load Balancer IP | `""` | +| `sentinel.service.loadBalancerClass` | sentinel service Load Balancer class if service type is `LoadBalancer` (optional, cloud specific) | `""` | +| `sentinel.service.loadBalancerSourceRanges` | Redis® Sentinel service Load Balancer sources | `[]` | +| `sentinel.service.annotations` | Additional custom annotations for Redis® Sentinel service | `{}` | +| `sentinel.service.sessionAffinity` | Session Affinity for Kubernetes service, can be "None" or "ClientIP" | `None` | +| `sentinel.service.sessionAffinityConfig` | Additional settings for the sessionAffinity | `{}` | +| `sentinel.service.headless.annotations` | Annotations for the headless service. | `{}` | +| `sentinel.terminationGracePeriodSeconds` | Integer setting the termination grace period for the redis-node pods | `30` | + +### Other Parameters + +| Name | Description | Value | +| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------- | +| `serviceBindings.enabled` | Create secret for service binding (Experimental) | `false` | +| `networkPolicy.enabled` | Enable creation of NetworkPolicy resources | `false` | +| `networkPolicy.allowExternal` | Don't require client label for connections | `true` | +| `networkPolicy.extraIngress` | Add extra ingress rules to the NetworkPolicy | `[]` | +| `networkPolicy.extraEgress` | Add extra egress rules to the NetworkPolicy | `[]` | +| `networkPolicy.ingressNSMatchLabels` | Labels to match to allow traffic from other namespaces | `{}` | +| `networkPolicy.ingressNSPodMatchLabels` | Pod labels to match to allow traffic from other namespaces | `{}` | +| `networkPolicy.metrics.allowExternal` | Don't require client label for connections for metrics endpoint | `true` | +| `networkPolicy.metrics.ingressNSMatchLabels` | Labels to match to allow traffic from other namespaces to metrics endpoint | `{}` | +| `networkPolicy.metrics.ingressNSPodMatchLabels` | Pod labels to match to allow traffic from other namespaces to metrics endpoint | `{}` | +| `podSecurityPolicy.create` | Whether to create a PodSecurityPolicy. WARNING: PodSecurityPolicy is deprecated in Kubernetes v1.21 or later, unavailable in v1.25 or later | `false` | +| `podSecurityPolicy.enabled` | Enable PodSecurityPolicy's RBAC rules | `false` | +| `rbac.create` | Specifies whether RBAC resources should be created | `false` | +| `rbac.rules` | Custom RBAC rules to set | `[]` | +| `serviceAccount.create` | Specifies whether a ServiceAccount should be created | `true` | +| `serviceAccount.name` | The name of the ServiceAccount to use. | `""` | +| `serviceAccount.automountServiceAccountToken` | Whether to auto mount the service account token | `false` | +| `serviceAccount.annotations` | Additional custom annotations for the ServiceAccount | `{}` | +| `pdb.create` | Specifies whether a PodDisruptionBudget should be created | `false` | +| `pdb.minAvailable` | Min number of pods that must still be available after the eviction | `1` | +| `pdb.maxUnavailable` | Max number of pods that can be unavailable after the eviction | `""` | +| `tls.enabled` | Enable TLS traffic | `false` | +| `tls.authClients` | Require clients to authenticate | `true` | +| `tls.autoGenerated` | Enable autogenerated certificates | `false` | +| `tls.existingSecret` | The name of the existing secret that contains the TLS certificates | `""` | +| `tls.certificatesSecret` | DEPRECATED. Use existingSecret instead. | `""` | +| `tls.certFilename` | Certificate filename | `""` | +| `tls.certKeyFilename` | Certificate Key filename | `""` | +| `tls.certCAFilename` | CA Certificate filename | `""` | +| `tls.dhParamsFilename` | File containing DH params (in order to support DH based ciphers) | `""` | + +### Metrics Parameters + +| Name | Description | Value | +| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | -------------------------------- | +| `metrics.enabled` | Start a sidecar prometheus exporter to expose Redis® metrics | `false` | +| `metrics.image.registry` | Redis® Exporter image registry | `REGISTRY_NAME` | +| `metrics.image.repository` | Redis® Exporter image repository | `REPOSITORY_NAME/redis-exporter` | +| `metrics.image.digest` | Redis® Exporter image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | +| `metrics.image.pullPolicy` | Redis® Exporter image pull policy | `IfNotPresent` | +| `metrics.image.pullSecrets` | Redis® Exporter image pull secrets | `[]` | +| `metrics.startupProbe.enabled` | Enable startupProbe on Redis® replicas nodes | `false` | +| `metrics.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `10` | +| `metrics.startupProbe.periodSeconds` | Period seconds for startupProbe | `10` | +| `metrics.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `5` | +| `metrics.startupProbe.failureThreshold` | Failure threshold for startupProbe | `5` | +| `metrics.startupProbe.successThreshold` | Success threshold for startupProbe | `1` | +| `metrics.livenessProbe.enabled` | Enable livenessProbe on Redis® replicas nodes | `true` | +| `metrics.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `10` | +| `metrics.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `10` | +| `metrics.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `5` | +| `metrics.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `5` | +| `metrics.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` | +| `metrics.readinessProbe.enabled` | Enable readinessProbe on Redis® replicas nodes | `true` | +| `metrics.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `5` | +| `metrics.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `10` | +| `metrics.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `1` | +| `metrics.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `3` | +| `metrics.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` | +| `metrics.customStartupProbe` | Custom startupProbe that overrides the default one | `{}` | +| `metrics.customLivenessProbe` | Custom livenessProbe that overrides the default one | `{}` | +| `metrics.customReadinessProbe` | Custom readinessProbe that overrides the default one | `{}` | +| `metrics.command` | Override default metrics container init command (useful when using custom images) | `[]` | +| `metrics.redisTargetHost` | A way to specify an alternative Redis® hostname | `localhost` | +| `metrics.extraArgs` | Extra arguments for Redis® exporter, for example: | `{}` | +| `metrics.extraEnvVars` | Array with extra environment variables to add to Redis® exporter | `[]` | +| `metrics.containerSecurityContext.enabled` | Enabled Redis® exporter containers' Security Context | `true` | +| `metrics.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | +| `metrics.containerSecurityContext.runAsUser` | Set Redis® exporter containers' Security Context runAsUser | `1001` | +| `metrics.containerSecurityContext.runAsGroup` | Set Redis® exporter containers' Security Context runAsGroup | `0` | +| `metrics.containerSecurityContext.runAsNonRoot` | Set Redis® exporter containers' Security Context runAsNonRoot | `true` | +| `metrics.containerSecurityContext.allowPrivilegeEscalation` | Set Redis® exporter containers' Security Context allowPrivilegeEscalation | `false` | +| `metrics.containerSecurityContext.seccompProfile.type` | Set Redis® exporter containers' Security Context seccompProfile | `RuntimeDefault` | +| `metrics.containerSecurityContext.capabilities.drop` | Set Redis® exporter containers' Security Context capabilities to drop | `["ALL"]` | +| `metrics.extraVolumes` | Optionally specify extra list of additional volumes for the Redis® metrics sidecar | `[]` | +| `metrics.extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for the Redis® metrics sidecar | `[]` | +| `metrics.resources.limits` | The resources limits for the Redis® exporter container | `{}` | +| `metrics.resources.requests` | The requested resources for the Redis® exporter container | `{}` | +| `metrics.podLabels` | Extra labels for Redis® exporter pods | `{}` | +| `metrics.podAnnotations` | Annotations for Redis® exporter pods | `{}` | +| `metrics.service.type` | Redis® exporter service type | `ClusterIP` | +| `metrics.service.port` | Redis® exporter service port | `9121` | +| `metrics.service.externalTrafficPolicy` | Redis® exporter service external traffic policy | `Cluster` | +| `metrics.service.extraPorts` | Extra ports to expose (normally used with the `sidecar` value) | `[]` | +| `metrics.service.loadBalancerIP` | Redis® exporter service Load Balancer IP | `""` | +| `metrics.service.loadBalancerClass` | exporter service Load Balancer class if service type is `LoadBalancer` (optional, cloud specific) | `""` | +| `metrics.service.loadBalancerSourceRanges` | Redis® exporter service Load Balancer sources | `[]` | +| `metrics.service.annotations` | Additional custom annotations for Redis® exporter service | `{}` | +| `metrics.service.clusterIP` | Redis® exporter service Cluster IP | `""` | +| `metrics.serviceMonitor.enabled` | Create ServiceMonitor resource(s) for scraping metrics using PrometheusOperator | `false` | +| `metrics.serviceMonitor.namespace` | The namespace in which the ServiceMonitor will be created | `""` | +| `metrics.serviceMonitor.interval` | The interval at which metrics should be scraped | `30s` | +| `metrics.serviceMonitor.scrapeTimeout` | The timeout after which the scrape is ended | `""` | +| `metrics.serviceMonitor.relabellings` | Metrics RelabelConfigs to apply to samples before scraping. | `[]` | +| `metrics.serviceMonitor.metricRelabelings` | Metrics RelabelConfigs to apply to samples before ingestion. | `[]` | +| `metrics.serviceMonitor.honorLabels` | Specify honorLabels parameter to add the scrape endpoint | `false` | +| `metrics.serviceMonitor.additionalLabels` | Additional labels that can be used so ServiceMonitor resource(s) can be discovered by Prometheus | `{}` | +| `metrics.serviceMonitor.podTargetLabels` | Labels from the Kubernetes pod to be transferred to the created metrics | `[]` | +| `metrics.serviceMonitor.sampleLimit` | Limit of how many samples should be scraped from every Pod | `false` | +| `metrics.serviceMonitor.targetLimit` | Limit of how many targets should be scraped | `false` | +| `metrics.serviceMonitor.additionalEndpoints` | Additional endpoints to scrape (e.g sentinel) | `[]` | +| `metrics.podMonitor.enabled` | Create PodMonitor resource(s) for scraping metrics using PrometheusOperator | `false` | +| `metrics.podMonitor.namespace` | The namespace in which the PodMonitor will be created | `""` | +| `metrics.podMonitor.interval` | The interval at which metrics should be scraped | `30s` | +| `metrics.podMonitor.scrapeTimeout` | The timeout after which the scrape is ended | `""` | +| `metrics.podMonitor.relabellings` | Metrics RelabelConfigs to apply to samples before scraping. | `[]` | +| `metrics.podMonitor.metricRelabelings` | Metrics RelabelConfigs to apply to samples before ingestion. | `[]` | +| `metrics.podMonitor.honorLabels` | Specify honorLabels parameter to add the scrape endpoint | `false` | +| `metrics.podMonitor.additionalLabels` | Additional labels that can be used so PodMonitor resource(s) can be discovered by Prometheus | `{}` | +| `metrics.podMonitor.podTargetLabels` | Labels from the Kubernetes pod to be transferred to the created metrics | `[]` | +| `metrics.podMonitor.sampleLimit` | Limit of how many samples should be scraped from every Pod | `false` | +| `metrics.podMonitor.targetLimit` | Limit of how many targets should be scraped | `false` | +| `metrics.podMonitor.additionalEndpoints` | Additional endpoints to scrape (e.g sentinel) | `[]` | +| `metrics.prometheusRule.enabled` | Create a custom prometheusRule Resource for scraping metrics using PrometheusOperator | `false` | +| `metrics.prometheusRule.namespace` | The namespace in which the prometheusRule will be created | `""` | +| `metrics.prometheusRule.additionalLabels` | Additional labels for the prometheusRule | `{}` | +| `metrics.prometheusRule.rules` | Custom Prometheus rules | `[]` | + +### Init Container Parameters + +| Name | Description | Value | +| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | -------------------------- | +| `volumePermissions.enabled` | Enable init container that changes the owner/group of the PV mount point to `runAsUser:fsGroup` | `false` | +| `volumePermissions.image.registry` | OS Shell + Utility image registry | `REGISTRY_NAME` | +| `volumePermissions.image.repository` | OS Shell + Utility image repository | `REPOSITORY_NAME/os-shell` | +| `volumePermissions.image.digest` | OS Shell + Utility image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | +| `volumePermissions.image.pullPolicy` | OS Shell + Utility image pull policy | `IfNotPresent` | +| `volumePermissions.image.pullSecrets` | OS Shell + Utility image pull secrets | `[]` | +| `volumePermissions.resources.limits` | The resources limits for the init container | `{}` | +| `volumePermissions.resources.requests` | The requested resources for the init container | `{}` | +| `volumePermissions.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | +| `volumePermissions.containerSecurityContext.runAsUser` | Set init container's Security Context runAsUser | `0` | +| `sysctl.enabled` | Enable init container to modify Kernel settings | `false` | +| `sysctl.image.registry` | OS Shell + Utility image registry | `REGISTRY_NAME` | +| `sysctl.image.repository` | OS Shell + Utility image repository | `REPOSITORY_NAME/os-shell` | +| `sysctl.image.digest` | OS Shell + Utility image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | +| `sysctl.image.pullPolicy` | OS Shell + Utility image pull policy | `IfNotPresent` | +| `sysctl.image.pullSecrets` | OS Shell + Utility image pull secrets | `[]` | +| `sysctl.command` | Override default init-sysctl container command (useful when using custom images) | `[]` | +| `sysctl.mountHostSys` | Mount the host `/sys` folder to `/host-sys` | `false` | +| `sysctl.resources.limits` | The resources limits for the init container | `{}` | +| `sysctl.resources.requests` | The requested resources for the init container | `{}` | + +### useExternalDNS Parameters + +| Name | Description | Value | +| -------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- | +| `useExternalDNS.enabled` | Enable various syntax that would enable external-dns to work. Note this requires a working installation of `external-dns` to be usable. | `false` | +| `useExternalDNS.additionalAnnotations` | Extra annotations to be utilized when `external-dns` is enabled. | `{}` | +| `useExternalDNS.annotationKey` | The annotation key utilized when `external-dns` is enabled. Setting this to `false` will disable annotations. | `external-dns.alpha.kubernetes.io/` | +| `useExternalDNS.suffix` | The DNS suffix utilized when `external-dns` is enabled. Note that we prepend the suffix with the full name of the release. | `""` | + +Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example, + +```console +helm install my-release \ + --set auth.password=secretpassword \ + oci://REGISTRY_NAME/REPOSITORY_NAME/redis +``` + +> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. + +The above command sets the Redis® server password to `secretpassword`. + +> NOTE: Once this chart is deployed, it is not possible to change the application's access credentials, such as usernames or passwords, using Helm. To change these application credentials after deployment, delete any persistent volumes (PVs) used by the chart and re-deploy it, or use the application's built-in administrative tools if available. + +Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example, + +```console +helm install my-release -f values.yaml oci://REGISTRY_NAME/REPOSITORY_NAME/redis +``` + +> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. +> **Tip**: You can use the default [values.yaml](https://github.com/bitnami/charts/tree/main/bitnami/redis/values.yaml) + +## Configuration and installation details + +### [Rolling VS Immutable tags](https://docs.bitnami.com/tutorials/understand-rolling-tags-containers) + +It is strongly recommended to use immutable tags in a production environment. This ensures your deployment does not change automatically if the same tag is updated with a different image. + +Bitnami will release a new chart updating its containers if a new version of the main container, significant changes, or critical vulnerabilities exist. + +### Use a different Redis® version + +To modify the application version used in this chart, specify a different version of the image using the `image.tag` parameter and/or a different repository using the `image.repository` parameter. + +### Bootstrapping with an External Cluster + +This chart is equipped with the ability to bring online a set of Pods that connect to an existing Redis deployment that lies outside of Kubernetes. This effectively creates a hybrid Redis Deployment where both Pods in Kubernetes and Instances such as Virtual Machines can partake in a single Redis Deployment. This is helpful in situations where one may be migrating Redis from Virtual Machines into Kubernetes, for example. To take advantage of this, use the following as an example configuration: + +```yaml +replica: + externalMaster: + enabled: true + host: external-redis-0.internal +sentinel: + externalMaster: + enabled: true + host: external-redis-0.internal +``` + +:warning: This is currently limited to clusters in which Sentinel and Redis run on the same node! :warning: + +Please also note that the external sentinel must be listening on port `26379`, and this is currently not configurable. + +Once the Kubernetes Redis Deployment is online and confirmed to be working with the existing cluster, the configuration can then be removed and the cluster will remain connected. + +### External DNS + +This chart is equipped to allow leveraging the ExternalDNS project. Doing so will enable ExternalDNS to publish the FQDN for each instance, in the format of `..`. +Example, when using the following configuration: + +```yaml +useExternalDNS: + enabled: true + suffix: prod.example.org + additionalAnnotations: + ttl: 10 +``` + +On a cluster where the name of the Helm release is `a`, the hostname of a Pod is generated as: `a-redis-node-0.a-redis.prod.example.org`. The IP of that FQDN will match that of the associated Pod. This modifies the following parameters of the Redis/Sentinel configuration using this new FQDN: + +- `replica-announce-ip` +- `known-sentinel` +- `known-replica` +- `announce-ip` + +:warning: This requires a working installation of `external-dns` to be fully functional. :warning: + +See the [official ExternalDNS documentation](https://github.com/kubernetes-sigs/external-dns) for additional configuration options. + +### Cluster topologies + +#### Default: Master-Replicas + +When installing the chart with `architecture=replication`, it will deploy a Redis® master StatefulSet and a Redis® replicas StatefulSet. The replicas will be read-replicas of the master. Two services will be exposed: + +- Redis® Master service: Points to the master, where read-write operations can be performed +- Redis® Replicas service: Points to the replicas, where only read operations are allowed by default. + +In case the master crashes, the replicas will wait until the master node is respawned again by the Kubernetes Controller Manager. + +#### Standalone + +When installing the chart with `architecture=standalone`, it will deploy a standalone Redis® StatefulSet. A single service will be exposed: + +- Redis® Master service: Points to the master, where read-write operations can be performed + +#### Master-Replicas with Sentinel + +When installing the chart with `architecture=replication` and `sentinel.enabled=true`, it will deploy a Redis® master StatefulSet (only one master allowed) and a Redis® replicas StatefulSet. In this case, the pods will contain an extra container with Redis® Sentinel. This container will form a cluster of Redis® Sentinel nodes, which will promote a new master in case the actual one fails. + +On graceful termination of the Redis® master pod, a failover of the master is initiated to promote a new master. The Redis® Sentinel container in this pod will wait for the failover to occur before terminating. If `sentinel.redisShutdownWaitFailover=true` is set (the default), the Redis® container will wait for the failover as well before terminating. This increases availability for reads during failover, but may cause stale reads until all clients have switched to the new master. + +In addition to this, only one service is exposed: + +- Redis® service: Exposes port 6379 for Redis® read-only operations and port 26379 for accessing Redis® Sentinel. + +For read-only operations, access the service using port 6379. For write operations, it's necessary to access the Redis® Sentinel cluster and query the current master using the command below (using redis-cli or similar): + +```console +SENTINEL get-master-addr-by-name +``` + +This command will return the address of the current master, which can be accessed from inside the cluster. + +In case the current master crashes, the Sentinel containers will elect a new master node. + +`master.count` greater than `1` is not designed for use when `sentinel.enabled=true`. + +### Multiple masters (experimental) + +When `master.count` is greater than `1`, special care must be taken to create a consistent setup. + +An example of use case is the creation of a redundant set of standalone masters or master-replicas per Kubernetes node where you must ensure: + +- No more than `1` master can be deployed per Kubernetes node +- Replicas and writers can only see the single master of their own Kubernetes node + +One way of achieving this is by setting `master.service.internalTrafficPolicy=Local` in combination with a `master.affinity.podAntiAffinity` spec to never schedule more than one master per Kubernetes node. + +It's recommended to only change `master.count` if you know what you are doing. +`master.count` greater than `1` is not designed for use when `sentinel.enabled=true`. + +### Using a password file + +To use a password file for Redis® you need to create a secret containing the password and then deploy the chart using that secret. Follow these instructions: + +- Create the secret with the password. It is important that the file with the password must be called `redis-password`. + +```console +kubectl create secret generic redis-password-secret --from-file=redis-password.yaml +``` + +- Deploy the Helm Chart using the secret name as parameter: + +```text +usePassword=true +usePasswordFile=true +existingSecret=redis-password-secret +sentinels.enabled=true +metrics.enabled=true +``` + +### Securing traffic using TLS + +TLS support can be enabled in the chart by specifying the `tls.` parameters while creating a release. The following parameters should be configured to properly enable the TLS support in the cluster: + +- `tls.enabled`: Enable TLS support. Defaults to `false` +- `tls.existingSecret`: Name of the secret that contains the certificates. No defaults. +- `tls.certFilename`: Certificate filename. No defaults. +- `tls.certKeyFilename`: Certificate key filename. No defaults. +- `tls.certCAFilename`: CA Certificate filename. No defaults. + +For example: + +First, create the secret with the certificates files: + +```console +kubectl create secret generic certificates-tls-secret --from-file=./cert.pem --from-file=./cert.key --from-file=./ca.pem +``` + +Then, use the following parameters: + +```console +tls.enabled="true" +tls.existingSecret="certificates-tls-secret" +tls.certFilename="cert.pem" +tls.certKeyFilename="cert.key" +tls.certCAFilename="ca.pem" +``` + +### Metrics + +The chart optionally can start a metrics exporter for [prometheus](https://prometheus.io). The metrics endpoint (port 9121) is exposed in the service. Metrics can be scraped from within the cluster using something similar as the described in the [example Prometheus scrape configuration](https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus-kubernetes.yml). If metrics are to be scraped from outside the cluster, the Kubernetes API proxy can be utilized to access the endpoint. + +If you have enabled TLS by specifying `tls.enabled=true` you also need to specify TLS option to the metrics exporter. You can do that via `metrics.extraArgs`. You can find the metrics exporter CLI flags for TLS [here](https://github.com/oliver006/redis_exporter#command-line-flags). For example: + +You can either specify `metrics.extraArgs.skip-tls-verification=true` to skip TLS verification or providing the following values under `metrics.extraArgs` for TLS client authentication: + +```console +tls-client-key-file +tls-client-cert-file +tls-ca-cert-file +``` + +### Deploy a custom metrics script in the sidecar + +A custom Lua script can be added to the `redis-exporter` sidecar by way of the `metrics.extraArgs.script` parameter. The pathname of the script must exist on the container, or the `redis_exporter` process (and therefore the whole pod) will refuse to start. The script can be provided to the sidecar containers via the `metrics.extraVolumes` and `metrics.extraVolumeMounts` parameters: + +```yaml +metrics: + extraVolumeMounts: + - name: '{{ printf "%s-metrics-script-file" (include "common.names.fullname" .) }}' + mountPath: '{{ printf "/mnt/%s/" (include "common.names.name" .) }}' + readOnly: true + extraVolumes: + - name: '{{ printf "%s-metrics-script-file" (include "common.names.fullname" .) }}' + configMap: + name: '{{ printf "%s-metrics-script" (include "common.names.fullname" .) }}' + extraArgs: + script: '{{ printf "/mnt/%s/my_custom_metrics.lua" (include "common.names.name" .) }}' +``` + +Then deploy the script into the correct location via `extraDeploy`: + +```yaml +extraDeploy: + - apiVersion: v1 + kind: ConfigMap + metadata: + name: '{{ printf "%s-metrics-script" (include "common.names.fullname" .) }}' + data: + my_custom_metrics.lua: | + -- LUA SCRIPT CODE HERE, e.g., + return {'bitnami_makes_the_best_charts', '1'} +``` + +### Host Kernel Settings + +Redis® may require some changes in the kernel of the host machine to work as expected, in particular increasing the `somaxconn` value and disabling transparent huge pages. To do so, you can set up a privileged `initContainer` with the `sysctlImage` config values, for example: + +```yaml +sysctlImage: + enabled: true + mountHostSys: true + command: + - /bin/sh + - -c + - |- + install_packages procps + sysctl -w net.core.somaxconn=10000 + echo never > /host-sys/kernel/mm/transparent_hugepage/enabled +``` + +Alternatively, for Kubernetes 1.12+ you can set `securityContext.sysctls` which will configure `sysctls` for master and slave pods. Example: + +```yaml +securityContext: + sysctls: + - name: net.core.somaxconn + value: "10000" +``` + +Note that this will not disable transparent huge tables. + +## Persistence + +By default, the chart mounts a [Persistent Volume](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) at the `/data` path. The volume is created using dynamic volume provisioning. If a Persistent Volume Claim already exists, specify it during installation. + +### Existing PersistentVolumeClaim + +1. Create the PersistentVolume +2. Create the PersistentVolumeClaim +3. Install the chart + +```console +helm install my-release --set master.persistence.existingClaim=PVC_NAME oci://REGISTRY_NAME/REPOSITORY_NAME/redis +``` + +> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. + +## Backup and restore + +To backup and restore Redis deployments on Kubernetes, you will need to create a snapshot of the data in the source cluster, and later restore it in a new cluster with the new parameters. Follow the instructions below: + +### Step 1: Backup the deployment + +- Connect to one of the nodes and start the Redis CLI tool. Then, run the commands below: + + ```text + $ kubectl exec -it my-release-master-0 bash + $ redis-cli + 127.0.0.1:6379> auth your_current_redis_password + OK + 127.0.0.1:6379> save + OK + ``` + +- Copy the dump file from the Redis node: + + ```console + kubectl cp my-release-master-0:/data/dump.rdb dump.rdb -c redis + ``` + +### Step 2: Restore the data on the destination cluster + +To restore the data in a new cluster, you will need to create a PVC and then upload the *dump.rdb* file to the new volume. + +Follow the following steps: + +- In the [*values.yaml*](https://github.com/bitnami/charts/blob/main/bitnami/redis/values.yaml) file set the *appendonly* parameter to *no*. You can skip this step if it is already configured as *no* + + ```yaml + commonConfiguration: |- + # Enable AOF https://redis.io/topics/persistence#append-only-file + appendonly no + # Disable RDB persistence, AOF persistence already enabled. + save "" + ``` + + > *Note that the `Enable AOF` comment belongs to the original config file and what you're actually doing is disabling it. This change will only be neccessary for the temporal cluster you're creating to upload the dump.* + +- Start the new cluster to create the PVCs. Use the command below as an example: + + ```console + helm install new-redis -f values.yaml . --set cluster.enabled=true --set cluster.slaveCount=3 + ``` + +- Now that the PVC were created, stop it and copy the *dump.rdp* file on the persisted data by using a helping pod. + + ```text + $ helm delete new-redis + + $ kubectl run --generator=run-pod/v1 -i --rm --tty volpod --overrides=' + { + "apiVersion": "v1", + "kind": "Pod", + "metadata": { + "name": "redisvolpod" + }, + "spec": { + "containers": [{ + "command": [ + "tail", + "-f", + "/dev/null" + ], + "image": "bitnami/minideb", + "name": "mycontainer", + "volumeMounts": [{ + "mountPath": "/mnt", + "name": "redisdata" + }] + }], + "restartPolicy": "Never", + "volumes": [{ + "name": "redisdata", + "persistentVolumeClaim": { + "claimName": "redis-data-new-redis-master-0" + } + }] + } + }' --image="bitnami/minideb" + + $ kubectl cp dump.rdb redisvolpod:/mnt/dump.rdb + $ kubectl delete pod volpod + ``` + +- Restart the cluster: + + > **INFO:** The *appendonly* parameter can be safely restored to your desired value. + + ```console + helm install new-redis -f values.yaml . --set cluster.enabled=true --set cluster.slaveCount=3 + ``` + +## NetworkPolicy + +To enable network policy for Redis®, install [a networking plugin that implements the Kubernetes NetworkPolicy spec](https://kubernetes.io/docs/tasks/administer-cluster/declare-network-policy#before-you-begin), and set `networkPolicy.enabled` to `true`. + +With NetworkPolicy enabled, only pods with the generated client label will be able to connect to Redis. This label will be displayed in the output after a successful install. + +With `networkPolicy.ingressNSMatchLabels` pods from other namespaces can connect to Redis. Set `networkPolicy.ingressNSPodMatchLabels` to match pod labels in matched namespace. For example, for a namespace labeled `redis=external` and pods in that namespace labeled `redis-client=true` the fields should be set: + +```yaml +networkPolicy: + enabled: true + ingressNSMatchLabels: + redis: external + ingressNSPodMatchLabels: + redis-client: true +``` + +### Setting Pod's affinity + +This chart allows you to set your custom affinity using the `XXX.affinity` parameter(s). Find more information about Pod's affinity in the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity). + +As an alternative, you can use of the preset configurations for pod affinity, pod anti-affinity, and node affinity available at the [bitnami/common](https://github.com/bitnami/charts/tree/main/bitnami/common#affinities) chart. To do so, set the `XXX.podAffinityPreset`, `XXX.podAntiAffinityPreset`, or `XXX.nodeAffinityPreset` parameters. + +## Troubleshooting + +Find more information about how to deal with common errors related to Bitnami's Helm charts in [this troubleshooting guide](https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues). + +## Upgrading + +A major chart version change (like v1.2.3 -> v2.0.0) indicates that there is an incompatible breaking change needing manual actions. + +### RDB compatibility + +It's common to have RDB format changes across Redis® releases where we see backward compatibility but no forward compatibility. For example, v7.0 can load an RDB created by v6.2 , but the opposite is not true. +When that's the case, the rolling update can cause replicas to temporarily stop synchronizing while they are running a lower version than master. +For example, on a rolling update `master-0` and `replica-2` are updated first from version v6.2 to v7.0; `replica-0` and `replica-1` won't be able to start a full sync with `master-0` because they are still running v6.2 and can't support the RDB format from version 7.0 that master is now using. +This issue can be mitigated by splitting the upgrade into two stages: one for all replicas and another for any master. + +- Stage 1 (replicas only, as there's no master with an ordinal higher than 99): +`helm upgrade oci://REGISTRY_NAME/REPOSITORY_NAME/redis --set master.updateStrategy.rollingUpdate.partition=99` +- Stage 2 (anything else that is not up to date, in this case only master): +`helm upgrade oci://REGISTRY_NAME/REPOSITORY_NAME/redis` + +### To 18.0.0 + +This major version updates the Redis® docker image version used from `7.0` to `7.2`, the new stable version. There are no major changes in the chart, but we recommend checking the [Redis® 7.2 release notes](https://raw.githubusercontent.com/redis/redis/7.2/00-RELEASENOTES) before upgrading. + +NOTE: Due to an error in our release process, versions higher or equal than 17.15.4 already use 7.2 by default. + +### To 17.0.0 + +This major version updates the Redis® docker image version used from `6.2` to `7.0`, the new stable version. There are no major changes in the chart, but we recommend checking the [Redis® 7.0 release notes](https://raw.githubusercontent.com/redis/redis/7.0/00-RELEASENOTES) before upgrading. + +### To 16.0.0 + +This major release renames several values in this chart and adds missing features, in order to be inline with the rest of assets in the Bitnami charts repository. + +Affected values: + +- `master.service.port` renamed as `master.service.ports.redis`. +- `master.service.nodePort` renamed as `master.service.nodePorts.redis`. +- `replica.service.port` renamed as `replica.service.ports.redis`. +- `replica.service.nodePort` renamed as `replica.service.nodePorts.redis`. +- `sentinel.service.port` renamed as `sentinel.service.ports.redis`. +- `sentinel.service.sentinelPort` renamed as `sentinel.service.ports.sentinel`. +- `master.containerPort` renamed as `master.containerPorts.redis`. +- `replica.containerPort` renamed as `replica.containerPorts.redis`. +- `sentinel.containerPort` renamed as `sentinel.containerPorts.sentinel`. +- `master.spreadConstraints` renamed as `master.topologySpreadConstraints` +- `replica.spreadConstraints` renamed as `replica.topologySpreadConstraints` + +### To 15.0.0 + +The parameter to enable the usage of StaticIDs was removed. The behavior is to [always use StaticIDs](https://github.com/bitnami/charts/pull/7278). + +### To 14.8.0 + +The Redis® sentinel exporter was removed in this version because the upstream project was deprecated. The regular Redis® exporter is included in the sentinel scenario as usual. + +### To 14.0.0 + +- Several parameters were renamed or disappeared in favor of new ones on this major version: + - The term *slave* has been replaced by the term *replica*. Therefore, parameters prefixed with `slave` are now prefixed with `replicas`. + - Credentials parameter are reorganized under the `auth` parameter. + - `cluster.enabled` parameter is deprecated in favor of `architecture` parameter that accepts two values: `standalone` and `replication`. + - `securityContext.*` is deprecated in favor of `XXX.podSecurityContext` and `XXX.containerSecurityContext`. + - `sentinel.metrics.*` parameters are deprecated in favor of `metrics.sentinel.*` ones. +- New parameters to add custom command, environment variables, sidecars, init containers, etc. were added. +- Chart labels were adapted to follow the [Helm charts standard labels](https://helm.sh/docs/chart_best_practices/labels/#standard-labels). +- values.yaml metadata was adapted to follow the format supported by [Readme Generator for Helm](https://github.com/bitnami/readme-generator-for-helm). + +Consequences: + +Backwards compatibility is not guaranteed. To upgrade to `14.0.0`, install a new release of the Redis® chart, and migrate the data from your previous release. You have 2 alternatives to do so: + +- Create a backup of the database, and restore it on the new release as explained in the [Backup and restore](#backup-and-restore) section. +- Reuse the PVC used to hold the master data on your previous release. To do so, use the `master.persistence.existingClaim` parameter. The following example assumes that the release name is `redis`: + +```console +helm install redis oci://REGISTRY_NAME/REPOSITORY_NAME/redis --set auth.password=[PASSWORD] --set master.persistence.existingClaim=[EXISTING_PVC] +``` + +> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. + +| Note: you need to substitute the placeholder *[EXISTING_PVC]* with the name of the PVC used on your previous release, and *[PASSWORD]* with the password used in your previous release. + +### To 13.0.0 + +This major version updates the Redis® docker image version used from `6.0` to `6.2`, the new stable version. There are no major changes in the chart and there shouldn't be any breaking changes in it as `6.2` is basically a stricter superset of `6.0`. For more information, please refer to [Redis® 6.2 release notes](https://raw.githubusercontent.com/redis/redis/6.2/00-RELEASENOTES). + +### To 12.3.0 + +This version also introduces `bitnami/common`, a [library chart](https://helm.sh/docs/topics/library_charts/#helm) as a dependency. More documentation about this new utility could be found [here](https://github.com/bitnami/charts/tree/main/bitnami/common#bitnami-common-library-chart). Please, make sure that you have updated the chart dependencies before executing any upgrade. + +### To 12.0.0 + +[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. + +#### What changes were introduced in this major version? + +- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. +- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts + +#### Considerations when upgrading to this version + +- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues +- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore +- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 + +#### Useful links + +- +- +- + +### To 11.0.0 + +When using sentinel, a new statefulset called `-node` was introduced. This will break upgrading from a previous version where the statefulsets are called master and slave. Hence the PVC will not match the new naming and won't be reused. If you want to keep your data, you will need to perform a backup and then a restore the data in this new version. + +When deployed with sentinel enabled, only a group of nodes is deployed and the master/slave role is handled in the group. To avoid breaking the compatibility, the settings for this nodes are given through the `slave.xxxx` parameters in `values.yaml` + +### To 10.0.0 + +For releases with `usePassword: true`, the value `sentinel.usePassword` controls whether the password authentication also applies to the sentinel port. This defaults to `true` for a secure configuration, however it is possible to disable to account for the following cases: + +- Using a version of redis-sentinel prior to `5.0.1` where the authentication feature was introduced. +- Where redis clients need to be updated to support sentinel authentication. + +If using a master/slave topology, or with `usePassword: false`, no action is required. + +### To 9.0.0 + +The metrics exporter has been changed from a separate deployment to a sidecar container, due to the latest changes in the Redis® exporter code. Check the [official page](https://github.com/oliver006/redis_exporter/) for more information. The metrics container image was changed from oliver006/redis_exporter to bitnami/redis-exporter (Bitnami's maintained package of oliver006/redis_exporter). + +### To 8.0.18 + +For releases with `metrics.enabled: true` the default tag for the exporter image is now `v1.x.x`. This introduces many changes including metrics names. You'll want to use [this dashboard](https://github.com/oliver006/redis_exporter/blob/master/contrib/grafana_prometheus_redis_dashboard.json) now. Please see the [redis_exporter github page](https://github.com/oliver006/redis_exporter#upgrading-from-0x-to-1x) for more details. + +### To 7.0.0 + +This version causes a change in the Redis® Master StatefulSet definition, so the command helm upgrade would not work out of the box. As an alternative, one of the following could be done: + +- Recommended: Create a clone of the Redis® Master PVC (for example, using projects like [this one](https://github.com/edseymour/pvc-transfer)). Then launch a fresh release reusing this cloned PVC. + +```console +helm install my-release oci://REGISTRY_NAME/REPOSITORY_NAME/redis --set persistence.existingClaim= +``` + +> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. + +- Alternative (not recommended, do at your own risk): `helm delete --purge` does not remove the PVC assigned to the Redis® Master StatefulSet. As a consequence, the following commands can be done to upgrade the release + +```console +helm delete --purge +helm install oci://REGISTRY_NAME/REPOSITORY_NAME/redis +``` + +> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. + +Previous versions of the chart were not using persistence in the slaves, so this upgrade would add it to them. Another important change is that no values are inherited from master to slaves. For example, in 6.0.0 `slaves.readinessProbe.periodSeconds`, if empty, would be set to `master.readinessProbe.periodSeconds`. This approach lacked transparency and was difficult to maintain. From now on, all the slave parameters must be configured just as it is done with the masters. + +Some values have changed as well: + +- `master.port` and `slave.port` have been changed to `redisPort` (same value for both master and slaves) +- `master.securityContext` and `slave.securityContext` have been changed to `securityContext`(same values for both master and slaves) + +By default, the upgrade will not change the cluster topology. In case you want to use Redis® Sentinel, you must explicitly set `sentinel.enabled` to `true`. + +### To 6.0.0 + +Previous versions of the chart were using an init-container to change the permissions of the volumes. This was done in case the `securityContext` directive in the template was not enough for that (for example, with cephFS). In this new version of the chart, this container is disabled by default (which should not affect most of the deployments). If your installation still requires that init container, execute `helm upgrade` with the `--set volumePermissions.enabled=true`. + +### To 5.0.0 + +The default image in this release may be switched out for any image containing the `redis-server` +and `redis-cli` binaries. If `redis-server` is not the default image ENTRYPOINT, `master.command` +must be specified. + +#### Breaking changes + +- `master.args` and `slave.args` are removed. Use `master.command` or `slave.command` instead in order to override the image entrypoint, or `master.extraFlags` to pass additional flags to `redis-server`. +- `disableCommands` is now interpreted as an array of strings instead of a string of comma separated values. +- `master.persistence.path` now defaults to `/data`. + +### To 4.0.0 + +This version removes the `chart` label from the `spec.selector.matchLabels` +which is immutable since `StatefulSet apps/v1beta2`. It has been inadvertently +added, causing any subsequent upgrade to fail. See . + +It also fixes where a deployment `extensions/v1beta1` can not be upgraded if `spec.selector` is not explicitly set. + +Finally, it fixes by removing mutable labels in `spec.VolumeClaimTemplate.metadata.labels` so that it is upgradable. + +In order to upgrade, delete the Redis® StatefulSet before upgrading: + +```console +kubectl delete statefulsets.apps --cascade=false my-release-redis-master +``` + +And edit the Redis® slave (and metrics if enabled) deployment: + +```console +kubectl patch deployments my-release-redis-slave --type=json -p='[{"op": "remove", "path": "/spec/selector/matchLabels/chart"}]' +kubectl patch deployments my-release-redis-metrics --type=json -p='[{"op": "remove", "path": "/spec/selector/matchLabels/chart"}]' +``` + +## License + +Copyright © 2024 Broadcom. The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. + +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 + + + +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. diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/.helmignore b/thunder_deployment/infra/beta9/charts/redis/charts/common/.helmignore new file mode 100644 index 000000000..50af03172 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/.helmignore @@ -0,0 +1,22 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/Chart.yaml b/thunder_deployment/infra/beta9/charts/redis/charts/common/Chart.yaml new file mode 100644 index 000000000..9a6aa881f --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/Chart.yaml @@ -0,0 +1,23 @@ +annotations: + category: Infrastructure + licenses: Apache-2.0 +apiVersion: v2 +appVersion: 2.14.1 +description: A Library Helm Chart for grouping common logic between bitnami charts. + This chart is not deployable by itself. +home: https://bitnami.com +icon: https://bitnami.com/downloads/logos/bitnami-mark.png +keywords: +- common +- helper +- template +- function +- bitnami +maintainers: +- name: VMware, Inc. + url: https://github.com/bitnami/charts +name: common +sources: +- https://github.com/bitnami/charts +type: library +version: 2.14.1 diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/README.md b/thunder_deployment/infra/beta9/charts/redis/charts/common/README.md new file mode 100644 index 000000000..a76fa46a2 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/README.md @@ -0,0 +1,235 @@ +# Bitnami Common Library Chart + +A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between Bitnami charts. + +## TL;DR + +```yaml +dependencies: + - name: common + version: 2.x.x + repository: oci://registry-1.docker.io/bitnamicharts +``` + +```console +helm dependency update +``` + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "common.names.fullname" . }} +data: + myvalue: "Hello World" +``` + +Looking to use our applications in production? Try [VMware Tanzu Application Catalog](https://bitnami.com/enterprise), the enterprise edition of Bitnami Application Catalog. + +## Introduction + +This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. + +Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. + +## Prerequisites + +- Kubernetes 1.23+ +- Helm 3.8.0+ + +## Parameters + +## Special input schemas + +### ImageRoot + +```yaml +registry: + type: string + description: Docker registry where the image is located + example: docker.io + +repository: + type: string + description: Repository and image name + example: bitnami/nginx + +tag: + type: string + description: image tag + example: 1.16.1-debian-10-r63 + +pullPolicy: + type: string + description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + +pullSecrets: + type: array + items: + type: string + description: Optionally specify an array of imagePullSecrets (evaluated as templates). + +debug: + type: boolean + description: Set to true if you would like to see extra information on logs + example: false + +## An instance would be: +# registry: docker.io +# repository: bitnami/nginx +# tag: 1.16.1-debian-10-r63 +# pullPolicy: IfNotPresent +# debug: false +``` + +### Persistence + +```yaml +enabled: + type: boolean + description: Whether enable persistence. + example: true + +storageClass: + type: string + description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. + example: "-" + +accessMode: + type: string + description: Access mode for the Persistent Volume Storage. + example: ReadWriteOnce + +size: + type: string + description: Size the Persistent Volume Storage. + example: 8Gi + +path: + type: string + description: Path to be persisted. + example: /bitnami + +## An instance would be: +# enabled: true +# storageClass: "-" +# accessMode: ReadWriteOnce +# size: 8Gi +# path: /bitnami +``` + +### ExistingSecret + +```yaml +name: + type: string + description: Name of the existing secret. + example: mySecret +keyMapping: + description: Mapping between the expected key name and the name of the key in the existing secret. + type: object + +## An instance would be: +# name: mySecret +# keyMapping: +# password: myPasswordKey +``` + +#### Example of use + +When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. + +```yaml +# templates/secret.yaml +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }} + labels: + app: {{ include "common.names.fullname" . }} +type: Opaque +data: + password: {{ .Values.password | b64enc | quote }} + +# templates/dpl.yaml +--- +... + env: + - name: PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} + key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} +... + +# values.yaml +--- +name: mySecret +keyMapping: + password: myPasswordKey +``` + +### ValidateValue + +#### NOTES.txt + +```console +{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} + +{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} +``` + +If we force those values to be empty we will see some alerts + +```console +helm install test mychart --set path.to.value00="",path.to.value01="" + 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: + + export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) + + 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: + + export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) +``` + +## Upgrading + +### To 1.0.0 + +[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. + +#### What changes were introduced in this major version? + +- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. +- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. +- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts + +#### Considerations when upgrading to this version + +- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues +- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore +- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 + +#### Useful links + +- +- +- + +## License + +Copyright © 2023 VMware, Inc. + +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 + + + +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. diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_affinities.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_affinities.tpl new file mode 100644 index 000000000..e85b1df45 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_affinities.tpl @@ -0,0 +1,139 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} + +{{/* +Return a soft nodeAffinity definition +{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.soft" -}} +preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} + weight: 1 +{{- end -}} + +{{/* +Return a hard nodeAffinity definition +{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.hard" -}} +requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} +{{- end -}} + +{{/* +Return a nodeAffinity definition +{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.nodes.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.nodes.hard" . -}} + {{- end -}} +{{- end -}} + +{{/* +Return a topologyKey definition +{{ include "common.affinities.topologyKey" (dict "topologyKey" "BAR") -}} +*/}} +{{- define "common.affinities.topologyKey" -}} +{{ .topologyKey | default "kubernetes.io/hostname" -}} +{{- end -}} + +{{/* +Return a soft podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.soft" (dict "component" "FOO" "customLabels" .Values.podLabels "extraMatchLabels" .Values.extraMatchLabels "topologyKey" "BAR" "extraPodAffinityTerms" .Values.extraPodAffinityTerms "context" $) -}} +*/}} +{{- define "common.affinities.pods.soft" -}} +{{- $component := default "" .component -}} +{{- $customLabels := default (dict) .customLabels -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +{{- $extraPodAffinityTerms := default (list) .extraPodAffinityTerms -}} +preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" ( dict "customLabels" $customLabels "context" .context )) | nindent 10 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} + weight: 1 + {{- range $extraPodAffinityTerms }} + - podAffinityTerm: + labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" ( dict "customLabels" $customLabels "context" $.context )) | nindent 10 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := .extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} + weight: {{ .weight | default 1 -}} + {{- end -}} +{{- end -}} + +{{/* +Return a hard podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.hard" (dict "component" "FOO" "customLabels" .Values.podLabels "extraMatchLabels" .Values.extraMatchLabels "topologyKey" "BAR" "extraPodAffinityTerms" .Values.extraPodAffinityTerms "context" $) -}} +*/}} +{{- define "common.affinities.pods.hard" -}} +{{- $component := default "" .component -}} +{{- $customLabels := default (dict) .customLabels -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +{{- $extraPodAffinityTerms := default (list) .extraPodAffinityTerms -}} +requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" ( dict "customLabels" $customLabels "context" .context )) | nindent 8 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} + {{- range $extraPodAffinityTerms }} + - labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" ( dict "customLabels" $customLabels "context" $.context )) | nindent 8 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := .extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} + {{- end -}} +{{- end -}} + +{{/* +Return a podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.pods" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.pods.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.pods.hard" . -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_capabilities.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_capabilities.tpl new file mode 100644 index 000000000..115674af8 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_capabilities.tpl @@ -0,0 +1,229 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} + +{{/* +Return the target Kubernetes version +*/}} +{{- define "common.capabilities.kubeVersion" -}} +{{- if .Values.global }} + {{- if .Values.global.kubeVersion }} + {{- .Values.global.kubeVersion -}} + {{- else }} + {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} + {{- end -}} +{{- else }} +{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for poddisruptionbudget. +*/}} +{{- define "common.capabilities.policy.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "policy/v1beta1" -}} +{{- else -}} +{{- print "policy/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for networkpolicy. +*/}} +{{- define "common.capabilities.networkPolicy.apiVersion" -}} +{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for cronjob. +*/}} +{{- define "common.capabilities.cronjob.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "batch/v1beta1" -}} +{{- else -}} +{{- print "batch/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for daemonset. +*/}} +{{- define "common.capabilities.daemonset.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for deployment. +*/}} +{{- define "common.capabilities.deployment.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for statefulset. +*/}} +{{- define "common.capabilities.statefulset.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apps/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for ingress. +*/}} +{{- define "common.capabilities.ingress.apiVersion" -}} +{{- if .Values.ingress -}} +{{- if .Values.ingress.apiVersion -}} +{{- .Values.ingress.apiVersion -}} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end }} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for RBAC resources. +*/}} +{{- define "common.capabilities.rbac.apiVersion" -}} +{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "rbac.authorization.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "rbac.authorization.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for CRDs. +*/}} +{{- define "common.capabilities.crd.apiVersion" -}} +{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiextensions.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiextensions.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for APIService. +*/}} +{{- define "common.capabilities.apiService.apiVersion" -}} +{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiregistration.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiregistration.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for Horizontal Pod Autoscaler. +*/}} +{{- define "common.capabilities.hpa.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} +{{- if .beta2 -}} +{{- print "autoscaling/v2beta2" -}} +{{- else -}} +{{- print "autoscaling/v2beta1" -}} +{{- end -}} +{{- else -}} +{{- print "autoscaling/v2" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for Vertical Pod Autoscaler. +*/}} +{{- define "common.capabilities.vpa.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} +{{- if .beta2 -}} +{{- print "autoscaling/v2beta2" -}} +{{- else -}} +{{- print "autoscaling/v2beta1" -}} +{{- end -}} +{{- else -}} +{{- print "autoscaling/v2" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if PodSecurityPolicy is supported +*/}} +{{- define "common.capabilities.psp.supported" -}} +{{- if semverCompare "<1.25-0" (include "common.capabilities.kubeVersion" .) -}} + {{- true -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if AdmissionConfiguration is supported +*/}} +{{- define "common.capabilities.admissionConfiguration.supported" -}} +{{- if semverCompare ">=1.23-0" (include "common.capabilities.kubeVersion" .) -}} + {{- true -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for AdmissionConfiguration. +*/}} +{{- define "common.capabilities.admissionConfiguration.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiserver.config.k8s.io/v1alpha1" -}} +{{- else if semverCompare "<1.25-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiserver.config.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiserver.config.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for PodSecurityConfiguration. +*/}} +{{- define "common.capabilities.podSecurityConfiguration.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "pod-security.admission.config.k8s.io/v1alpha1" -}} +{{- else if semverCompare "<1.25-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "pod-security.admission.config.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "pod-security.admission.config.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the used Helm version is 3.3+. +A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. +This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. +**To be removed when the catalog's minimun Helm version is 3.3** +*/}} +{{- define "common.capabilities.supportsHelmVersion" -}} +{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_errors.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_errors.tpl new file mode 100644 index 000000000..07ded6f64 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_errors.tpl @@ -0,0 +1,28 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Through error when upgrading using empty passwords values that must not be empty. + +Usage: +{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} +{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} +{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} + +Required password params: + - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. + - context - Context - Required. Parent context. +*/}} +{{- define "common.errors.upgrade.passwords.empty" -}} + {{- $validationErrors := join "" .validationErrors -}} + {{- if and $validationErrors .context.Release.IsUpgrade -}} + {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} + {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} + {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} + {{- $errorString = print $errorString "\n%s" -}} + {{- printf $errorString $validationErrors | fail -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_images.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_images.tpl new file mode 100644 index 000000000..1bcb779df --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_images.tpl @@ -0,0 +1,117 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper image name +{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" .Values.global ) }} +*/}} +{{- define "common.images.image" -}} +{{- $registryName := .imageRoot.registry -}} +{{- $repositoryName := .imageRoot.repository -}} +{{- $separator := ":" -}} +{{- $termination := .imageRoot.tag | toString -}} +{{- if .global }} + {{- if .global.imageRegistry }} + {{- $registryName = .global.imageRegistry -}} + {{- end -}} +{{- end -}} +{{- if .imageRoot.digest }} + {{- $separator = "@" -}} + {{- $termination = .imageRoot.digest | toString -}} +{{- end -}} +{{- if $registryName }} + {{- printf "%s/%s%s%s" $registryName $repositoryName $separator $termination -}} +{{- else -}} + {{- printf "%s%s%s" $repositoryName $separator $termination -}} +{{- end -}} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) +{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} +*/}} +{{- define "common.images.pullSecrets" -}} + {{- $pullSecrets := list }} + + {{- if .global }} + {{- range .global.imagePullSecrets -}} + {{- if kindIs "map" . -}} + {{- $pullSecrets = append $pullSecrets .name -}} + {{- else -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end }} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- if kindIs "map" . -}} + {{- $pullSecrets = append $pullSecrets .name -}} + {{- else -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets | uniq }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names evaluating values as templates +{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} +*/}} +{{- define "common.images.renderPullSecrets" -}} + {{- $pullSecrets := list }} + {{- $context := .context }} + + {{- if $context.Values.global }} + {{- range $context.Values.global.imagePullSecrets -}} + {{- if kindIs "map" . -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" .name "context" $context)) -}} + {{- else -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- if kindIs "map" . -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" .name "context" $context)) -}} + {{- else -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets | uniq }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} + +{{/* +Return the proper image version (ingores image revision/prerelease info & fallbacks to chart appVersion) +{{ include "common.images.version" ( dict "imageRoot" .Values.path.to.the.image "chart" .Chart ) }} +*/}} +{{- define "common.images.version" -}} +{{- $imageTag := .imageRoot.tag | toString -}} +{{/* regexp from https://github.com/Masterminds/semver/blob/23f51de38a0866c5ef0bfc42b3f735c73107b700/version.go#L41-L44 */}} +{{- if regexMatch `^([0-9]+)(\.[0-9]+)?(\.[0-9]+)?(-([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?(\+([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?$` $imageTag -}} + {{- $version := semver $imageTag -}} + {{- printf "%d.%d.%d" $version.Major $version.Minor $version.Patch -}} +{{- else -}} + {{- print .chart.AppVersion -}} +{{- end -}} +{{- end -}} + diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_ingress.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_ingress.tpl new file mode 100644 index 000000000..efa5b85c7 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_ingress.tpl @@ -0,0 +1,73 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} + +{{/* +Generate backend entry that is compatible with all Kubernetes API versions. + +Usage: +{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} + +Params: + - serviceName - String. Name of an existing service backend + - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.ingress.backend" -}} +{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} +{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} +serviceName: {{ .serviceName }} +servicePort: {{ .servicePort }} +{{- else -}} +service: + name: {{ .serviceName }} + port: + {{- if typeIs "string" .servicePort }} + name: {{ .servicePort }} + {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} + number: {{ .servicePort | int }} + {{- end }} +{{- end -}} +{{- end -}} + +{{/* +Print "true" if the API pathType field is supported +Usage: +{{ include "common.ingress.supportsPathType" . }} +*/}} +{{- define "common.ingress.supportsPathType" -}} +{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the ingressClassname field is supported +Usage: +{{ include "common.ingress.supportsIngressClassname" . }} +*/}} +{{- define "common.ingress.supportsIngressClassname" -}} +{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if cert-manager required annotations for TLS signed +certificates are set in the Ingress annotations +Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations +Usage: +{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} +*/}} +{{- define "common.ingress.certManagerRequest" -}} +{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") (hasKey .annotations "kubernetes.io/tls-acme") }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_labels.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_labels.tpl new file mode 100644 index 000000000..d90a6cdc0 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_labels.tpl @@ -0,0 +1,46 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} + +{{/* +Kubernetes standard labels +{{ include "common.labels.standard" (dict "customLabels" .Values.commonLabels "context" $) -}} +*/}} +{{- define "common.labels.standard" -}} +{{- if and (hasKey . "customLabels") (hasKey . "context") -}} +{{- $default := dict "app.kubernetes.io/name" (include "common.names.name" .context) "helm.sh/chart" (include "common.names.chart" .context) "app.kubernetes.io/instance" .context.Release.Name "app.kubernetes.io/managed-by" .context.Release.Service -}} +{{- with .context.Chart.AppVersion -}} +{{- $_ := set $default "app.kubernetes.io/version" . -}} +{{- end -}} +{{ template "common.tplvalues.merge" (dict "values" (list .customLabels $default) "context" .context) }} +{{- else -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +helm.sh/chart: {{ include "common.names.chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- with .Chart.AppVersion }} +app.kubernetes.io/version: {{ . | quote }} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Labels used on immutable fields such as deploy.spec.selector.matchLabels or svc.spec.selector +{{ include "common.labels.matchLabels" (dict "customLabels" .Values.podLabels "context" $) -}} + +We don't want to loop over custom labels appending them to the selector +since it's very likely that it will break deployments, services, etc. +However, it's important to overwrite the standard labels if the user +overwrote them on metadata.labels fields. +*/}} +{{- define "common.labels.matchLabels" -}} +{{- if and (hasKey . "customLabels") (hasKey . "context") -}} +{{ merge (pick (include "common.tplvalues.render" (dict "value" .customLabels "context" .context) | fromYaml) "app.kubernetes.io/name" "app.kubernetes.io/instance") (dict "app.kubernetes.io/name" (include "common.names.name" .context) "app.kubernetes.io/instance" .context.Release.Name ) | toYaml }} +{{- else -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_names.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_names.tpl new file mode 100644 index 000000000..a222924f1 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_names.tpl @@ -0,0 +1,71 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "common.names.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "common.names.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "common.names.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified dependency name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +Usage: +{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} +*/}} +{{- define "common.names.dependency.fullname" -}} +{{- if .chartValues.fullnameOverride -}} +{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .chartName .chartValues.nameOverride -}} +{{- if contains $name .context.Release.Name -}} +{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts. +*/}} +{{- define "common.names.namespace" -}} +{{- default .Release.Namespace .Values.namespaceOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a fully qualified app name adding the installation's namespace. +*/}} +{{- define "common.names.fullname.namespace" -}} +{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_secrets.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_secrets.tpl new file mode 100644 index 000000000..84dbe3803 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_secrets.tpl @@ -0,0 +1,182 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Generate secret name. + +Usage: +{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/main/bitnami/common#existingsecret + - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.secrets.name" -}} +{{- $name := (include "common.names.fullname" .context) -}} + +{{- if .defaultNameSuffix -}} +{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- with .existingSecret -}} +{{- if not (typeIs "string" .) -}} +{{- with .name -}} +{{- $name = . -}} +{{- end -}} +{{- else -}} +{{- $name = . -}} +{{- end -}} +{{- end -}} + +{{- printf "%s" $name -}} +{{- end -}} + +{{/* +Generate secret key. + +Usage: +{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/main/bitnami/common#existingsecret + - key - String - Required. Name of the key in the secret. +*/}} +{{- define "common.secrets.key" -}} +{{- $key := .key -}} + +{{- if .existingSecret -}} + {{- if not (typeIs "string" .existingSecret) -}} + {{- if .existingSecret.keyMapping -}} + {{- $key = index .existingSecret.keyMapping $.key -}} + {{- end -}} + {{- end }} +{{- end -}} + +{{- printf "%s" $key -}} +{{- end -}} + +{{/* +Generate secret password or retrieve one if already created. + +Usage: +{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - key - String - Required - Name of the key in the secret. + - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. + - length - int - Optional - Length of the generated random password. + - strong - Boolean - Optional - Whether to add symbols to the generated random password. + - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. + - context - Context - Required - Parent context. + - failOnNew - Boolean - Optional - Default to true. If set to false, skip errors adding new keys to existing secrets. + - skipB64enc - Boolean - Optional - Default to false. If set to true, no the secret will not be base64 encrypted. + - skipQuote - Boolean - Optional - Default to false. If set to true, no quotes will be added around the secret. +The order in which this function returns a secret password: + 1. Already existing 'Secret' resource + (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) + 2. Password provided via the values.yaml + (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) + 3. Randomly generated secret password + (A new random secret password with the length specified in the 'length' parameter will be generated and returned) + +*/}} +{{- define "common.secrets.passwords.manage" -}} + +{{- $password := "" }} +{{- $subchart := "" }} +{{- $chartName := default "" .chartName }} +{{- $passwordLength := default 10 .length }} +{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} +{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} +{{- $secretData := (lookup "v1" "Secret" (include "common.names.namespace" .context) .secret).data }} +{{- if $secretData }} + {{- if hasKey $secretData .key }} + {{- $password = index $secretData .key | b64dec }} + {{- else if not (eq .failOnNew false) }} + {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} + {{- else if $providedPasswordValue }} + {{- $password = $providedPasswordValue | toString }} + {{- end -}} +{{- else if $providedPasswordValue }} + {{- $password = $providedPasswordValue | toString }} +{{- else }} + + {{- if .context.Values.enabled }} + {{- $subchart = $chartName }} + {{- end -}} + + {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} + {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} + {{- $passwordValidationErrors := list $requiredPasswordError -}} + {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} + + {{- if .strong }} + {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} + {{- $password = randAscii $passwordLength }} + {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} + {{- $password = printf "%s%s" $subStr $password | toString | shuffle }} + {{- else }} + {{- $password = randAlphaNum $passwordLength }} + {{- end }} +{{- end -}} +{{- if not .skipB64enc }} +{{- $password = $password | b64enc }} +{{- end -}} +{{- if .skipQuote -}} +{{- printf "%s" $password -}} +{{- else -}} +{{- printf "%s" $password | quote -}} +{{- end -}} +{{- end -}} + +{{/* +Reuses the value from an existing secret, otherwise sets its value to a default value. + +Usage: +{{ include "common.secrets.lookup" (dict "secret" "secret-name" "key" "keyName" "defaultValue" .Values.myValue "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - key - String - Required - Name of the key in the secret. + - defaultValue - String - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. + - context - Context - Required - Parent context. + +*/}} +{{- define "common.secrets.lookup" -}} +{{- $value := "" -}} +{{- $secretData := (lookup "v1" "Secret" (include "common.names.namespace" .context) .secret).data -}} +{{- if and $secretData (hasKey $secretData .key) -}} + {{- $value = index $secretData .key -}} +{{- else if .defaultValue -}} + {{- $value = .defaultValue | toString | b64enc -}} +{{- end -}} +{{- if $value -}} +{{- printf "%s" $value -}} +{{- end -}} +{{- end -}} + +{{/* +Returns whether a previous generated secret already exists + +Usage: +{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - context - Context - Required - Parent context. +*/}} +{{- define "common.secrets.exists" -}} +{{- $secret := (lookup "v1" "Secret" (include "common.names.namespace" .context) .secret) }} +{{- if $secret }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_storage.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_storage.tpl new file mode 100644 index 000000000..16405a0f8 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_storage.tpl @@ -0,0 +1,28 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper Storage Class +{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} +*/}} +{{- define "common.storage.class" -}} + +{{- $storageClass := .persistence.storageClass -}} +{{- if .global -}} + {{- if .global.storageClass -}} + {{- $storageClass = .global.storageClass -}} + {{- end -}} +{{- end -}} + +{{- if $storageClass -}} + {{- if (eq "-" $storageClass) -}} + {{- printf "storageClassName: \"\"" -}} + {{- else }} + {{- printf "storageClassName: %s" $storageClass -}} + {{- end -}} +{{- end -}} + +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_tplvalues.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_tplvalues.tpl new file mode 100644 index 000000000..a8ed7637e --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_tplvalues.tpl @@ -0,0 +1,38 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Renders a value that contains template perhaps with scope if the scope is present. +Usage: +{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $ ) }} +{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $ "scope" $app ) }} +*/}} +{{- define "common.tplvalues.render" -}} +{{- $value := typeIs "string" .value | ternary .value (.value | toYaml) }} +{{- if contains "{{" (toJson .value) }} + {{- if .scope }} + {{- tpl (cat "{{- with $.RelativeScope -}}" $value "{{- end }}") (merge (dict "RelativeScope" .scope) .context) }} + {{- else }} + {{- tpl $value .context }} + {{- end }} +{{- else }} + {{- $value }} +{{- end }} +{{- end -}} + +{{/* +Merge a list of values that contains template after rendering them. +Merge precedence is consistent with http://masterminds.github.io/sprig/dicts.html#merge-mustmerge +Usage: +{{ include "common.tplvalues.merge" ( dict "values" (list .Values.path.to.the.Value1 .Values.path.to.the.Value2) "context" $ ) }} +*/}} +{{- define "common.tplvalues.merge" -}} +{{- $dst := dict -}} +{{- range .values -}} +{{- $dst = include "common.tplvalues.render" (dict "value" . "context" $.context "scope" $.scope) | fromYaml | merge $dst -}} +{{- end -}} +{{ $dst | toYaml }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_utils.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_utils.tpl new file mode 100644 index 000000000..bfbddf054 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_utils.tpl @@ -0,0 +1,77 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Print instructions to get a secret value. +Usage: +{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} +*/}} +{{- define "common.utils.secret.getvalue" -}} +{{- $varname := include "common.utils.fieldToEnvVar" . -}} +export {{ $varname }}=$(kubectl get secret --namespace {{ include "common.names.namespace" .context | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) +{{- end -}} + +{{/* +Build env var name given a field +Usage: +{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} +*/}} +{{- define "common.utils.fieldToEnvVar" -}} + {{- $fieldNameSplit := splitList "-" .field -}} + {{- $upperCaseFieldNameSplit := list -}} + + {{- range $fieldNameSplit -}} + {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} + {{- end -}} + + {{ join "_" $upperCaseFieldNameSplit }} +{{- end -}} + +{{/* +Gets a value from .Values given +Usage: +{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} +*/}} +{{- define "common.utils.getValueFromKey" -}} +{{- $splitKey := splitList "." .key -}} +{{- $value := "" -}} +{{- $latestObj := $.context.Values -}} +{{- range $splitKey -}} + {{- if not $latestObj -}} + {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} + {{- end -}} + {{- $value = ( index $latestObj . ) -}} + {{- $latestObj = $value -}} +{{- end -}} +{{- printf "%v" (default "" $value) -}} +{{- end -}} + +{{/* +Returns first .Values key with a defined value or first of the list if all non-defined +Usage: +{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} +*/}} +{{- define "common.utils.getKeyFromList" -}} +{{- $key := first .keys -}} +{{- $reverseKeys := reverse .keys }} +{{- range $reverseKeys }} + {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} + {{- if $value -}} + {{- $key = . }} + {{- end -}} +{{- end -}} +{{- printf "%s" $key -}} +{{- end -}} + +{{/* +Checksum a template at "path" containing a *single* resource (ConfigMap,Secret) for use in pod annotations, excluding the metadata (see #18376). +Usage: +{{ include "common.utils.checksumTemplate" (dict "path" "/configmap.yaml" "context" $) }} +*/}} +{{- define "common.utils.checksumTemplate" -}} +{{- $obj := include (print .context.Template.BasePath .path) .context | fromYaml -}} +{{ omit $obj "apiVersion" "kind" "metadata" | toYaml | sha256sum }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_warnings.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_warnings.tpl new file mode 100644 index 000000000..66dffc1fe --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_warnings.tpl @@ -0,0 +1,19 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Warning about using rolling tag. +Usage: +{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} +*/}} +{{- define "common.warnings.rollingTag" -}} + +{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} +WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. ++info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ +{{- end }} + +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_cassandra.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_cassandra.tpl new file mode 100644 index 000000000..eda9aada5 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_cassandra.tpl @@ -0,0 +1,77 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Cassandra required passwords are not empty. + +Usage: +{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.cassandra.passwords" -}} + {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} + {{- $enabled := include "common.cassandra.values.enabled" . -}} + {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} + {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.dbUser.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled cassandra. + +Usage: +{{ include "common.cassandra.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.cassandra.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.cassandra.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key dbUser + +Usage: +{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.key.dbUser" -}} + {{- if .subchart -}} + cassandra.dbUser + {{- else -}} + dbUser + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mariadb.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mariadb.tpl new file mode 100644 index 000000000..17d83a2fd --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mariadb.tpl @@ -0,0 +1,108 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MariaDB required passwords are not empty. + +Usage: +{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mariadb.passwords" -}} + {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mariadb.values.enabled" . -}} + {{- $architecture := include "common.mariadb.values.architecture" . -}} + {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mariadb. + +Usage: +{{ include "common.mariadb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mariadb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mariadb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.key.auth" -}} + {{- if .subchart -}} + mariadb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mongodb.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mongodb.tpl new file mode 100644 index 000000000..bbb445b86 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mongodb.tpl @@ -0,0 +1,113 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MongoDB® required passwords are not empty. + +Usage: +{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mongodb.passwords" -}} + {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mongodb.values.enabled" . -}} + {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} + {{- $architecture := include "common.mongodb.values.architecture" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} + {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} + + {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} + {{- if and $valueUsername $valueDatabase -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replicaset") -}} + {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mongodb. + +Usage: +{{ include "common.mongodb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mongodb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mongodb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.key.auth" -}} + {{- if .subchart -}} + mongodb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mysql.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mysql.tpl new file mode 100644 index 000000000..ca3953f86 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mysql.tpl @@ -0,0 +1,108 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MySQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mysql.passwords" -}} + {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mysql.values.enabled" . -}} + {{- $architecture := include "common.mysql.values.architecture" . -}} + {{- $authPrefix := include "common.mysql.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mysql. + +Usage: +{{ include "common.mysql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mysql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mysql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.key.auth" -}} + {{- if .subchart -}} + mysql.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_postgresql.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_postgresql.tpl new file mode 100644 index 000000000..8c9aa570e --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_postgresql.tpl @@ -0,0 +1,134 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate PostgreSQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.postgresql.passwords" -}} + {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} + {{- $enabled := include "common.postgresql.values.enabled" . -}} + {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} + {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} + + {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} + {{- if (eq $enabledReplication "true") -}} + {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to decide whether evaluate global values. + +Usage: +{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} +Params: + - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" +*/}} +{{- define "common.postgresql.values.use.global" -}} + {{- if .context.Values.global -}} + {{- if .context.Values.global.postgresql -}} + {{- index .context.Values.global.postgresql .key | quote -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.existingSecret" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} + + {{- if .subchart -}} + {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} + {{- else -}} + {{- default (.context.Values.existingSecret | quote) $globalValue -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled postgresql. + +Usage: +{{ include "common.postgresql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key postgressPassword. + +Usage: +{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.postgressPassword" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} + + {{- if not $globalValue -}} + {{- if .subchart -}} + postgresql.postgresqlPassword + {{- else -}} + postgresqlPassword + {{- end -}} + {{- else -}} + global.postgresql.postgresqlPassword + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled.replication. + +Usage: +{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.enabled.replication" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.replication.enabled -}} + {{- else -}} + {{- printf "%v" .context.Values.replication.enabled -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key replication.password. + +Usage: +{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.replicationPassword" -}} + {{- if .subchart -}} + postgresql.replication.password + {{- else -}} + replication.password + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_redis.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_redis.tpl new file mode 100644 index 000000000..fc0d208dd --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_redis.tpl @@ -0,0 +1,81 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Redis® required passwords are not empty. + +Usage: +{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.redis.passwords" -}} + {{- $enabled := include "common.redis.values.enabled" . -}} + {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} + {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} + + {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} + {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} + + {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} + {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} + {{- if eq $useAuth "true" -}} + {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled redis. + +Usage: +{{ include "common.redis.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.redis.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.redis.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right prefix path for the values + +Usage: +{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.redis.values.keys.prefix" -}} + {{- if .subchart -}}redis.{{- else -}}{{- end -}} +{{- end -}} + +{{/* +Checks whether the redis chart's includes the standarizations (version >= 14) + +Usage: +{{ include "common.redis.values.standarized.version" (dict "context" $) }} +*/}} +{{- define "common.redis.values.standarized.version" -}} + + {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} + {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} + + {{- if $standarizedAuthValues -}} + {{- true -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_validations.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_validations.tpl new file mode 100644 index 000000000..31ceda871 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_validations.tpl @@ -0,0 +1,51 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate values must not be empty. + +Usage: +{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} +{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" +*/}} +{{- define "common.validations.values.multiple.empty" -}} + {{- range .required -}} + {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} + {{- end -}} +{{- end -}} + +{{/* +Validate a value must not be empty. + +Usage: +{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" + - subchart - String - Optional - Name of the subchart that the validated password is part of. +*/}} +{{- define "common.validations.values.single.empty" -}} + {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} + {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} + + {{- if not $value -}} + {{- $varname := "my-value" -}} + {{- $getCurrentValue := "" -}} + {{- if and .secret .field -}} + {{- $varname = include "common.utils.fieldToEnvVar" . -}} + {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} + {{- end -}} + {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} + {{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/values.yaml b/thunder_deployment/infra/beta9/charts/redis/charts/common/values.yaml new file mode 100644 index 000000000..9abe0e154 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/charts/common/values.yaml @@ -0,0 +1,8 @@ +# Copyright VMware, Inc. +# SPDX-License-Identifier: APACHE-2.0 + +## bitnami/common +## It is required by CI/CD tools and processes. +## @skip exampleValue +## +exampleValue: common-chart diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/NOTES.txt b/thunder_deployment/infra/beta9/charts/redis/templates/NOTES.txt new file mode 100644 index 000000000..cc191dee6 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/NOTES.txt @@ -0,0 +1,191 @@ +CHART NAME: {{ .Chart.Name }} +CHART VERSION: {{ .Chart.Version }} +APP VERSION: {{ .Chart.AppVersion }} + +** Please be patient while the chart is being deployed ** + +{{- if .Values.diagnosticMode.enabled }} +The chart has been deployed in diagnostic mode. All probes have been disabled and the command has been overwritten with: + + command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 4 }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 4 }} + +Get the list of pods by executing: + + kubectl get pods --namespace {{ include "common.names.namespace" . }} -l app.kubernetes.io/instance={{ .Release.Name }} + +Access the pod you want to debug by executing + + kubectl exec --namespace {{ include "common.names.namespace" . }} -ti -- bash + +In order to replicate the container startup scripts execute this command: + +For Redis: + + /opt/bitnami/scripts/redis/entrypoint.sh /opt/bitnami/scripts/redis/run.sh + +{{- if .Values.sentinel.enabled }} + +For Redis Sentinel: + + /opt/bitnami/scripts/redis-sentinel/entrypoint.sh /opt/bitnami/scripts/redis-sentinel/run.sh + +{{- end }} +{{- else }} + +{{- if contains .Values.master.service.type "LoadBalancer" }} +{{- if not .Values.auth.enabled }} +{{ if and (not .Values.networkPolicy.enabled) (.Values.networkPolicy.allowExternal) }} + +------------------------------------------------------------------------------- + WARNING + + By specifying "master.service.type=LoadBalancer" and "auth.enabled=false" you have + most likely exposed the Redis® service externally without any authentication + mechanism. + + For security reasons, we strongly suggest that you switch to "ClusterIP" or + "NodePort". As alternative, you can also switch to "auth.enabled=true" + providing a valid password on "password" parameter. + +------------------------------------------------------------------------------- +{{- end }} +{{- end }} +{{- end }} + +{{- if eq .Values.architecture "replication" }} +{{- if .Values.sentinel.enabled }} + +Redis® can be accessed via port {{ .Values.sentinel.service.ports.redis }} on the following DNS name from within your cluster: + + {{ template "common.names.fullname" . }}.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }} for read only operations + +For read/write operations, first access the Redis® Sentinel cluster, which is available in port {{ .Values.sentinel.service.ports.sentinel }} using the same domain name above. + +{{- else }} + +Redis® can be accessed on the following DNS names from within your cluster: + + {{ printf "%s-master.%s.svc.%s" (include "common.names.fullname" .) (include "common.names.namespace" . ) .Values.clusterDomain }} for read/write operations (port {{ .Values.master.service.ports.redis }}) + {{ printf "%s-replicas.%s.svc.%s" (include "common.names.fullname" .) (include "common.names.namespace" . ) .Values.clusterDomain }} for read-only operations (port {{ .Values.replica.service.ports.redis }}) + +{{- end }} +{{- else }} + +Redis® can be accessed via port {{ .Values.master.service.ports.redis }} on the following DNS name from within your cluster: + + {{ template "common.names.fullname" . }}-master.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }} + +{{- end }} + +{{ if .Values.auth.enabled }} + +To get your password run: + + export REDIS_PASSWORD=$(kubectl get secret --namespace {{ include "common.names.namespace" . }} {{ template "redis.secretName" . }} -o jsonpath="{.data.redis-password}" | base64 -d) + +{{- end }} + +To connect to your Redis® server: + +1. Run a Redis® pod that you can use as a client: + + kubectl run --namespace {{ include "common.names.namespace" . }} redis-client --restart='Never' {{ if .Values.auth.enabled }} --env REDIS_PASSWORD=$REDIS_PASSWORD {{ end }} --image {{ template "redis.image" . }} --command -- sleep infinity + +{{- if .Values.tls.enabled }} + + Copy your TLS certificates to the pod: + + kubectl cp --namespace {{ include "common.names.namespace" . }} /path/to/client.cert redis-client:/tmp/client.cert + kubectl cp --namespace {{ include "common.names.namespace" . }} /path/to/client.key redis-client:/tmp/client.key + kubectl cp --namespace {{ include "common.names.namespace" . }} /path/to/CA.cert redis-client:/tmp/CA.cert + +{{- end }} + + Use the following command to attach to the pod: + + kubectl exec --tty -i redis-client \ + {{- if and (.Values.networkPolicy.enabled) (not .Values.networkPolicy.allowExternal) }}--labels="{{ template "common.names.fullname" . }}-client=true" \{{- end }} + --namespace {{ include "common.names.namespace" . }} -- bash + +2. Connect using the Redis® CLI: + +{{- if eq .Values.architecture "replication" }} + {{- if .Values.sentinel.enabled }} + {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h {{ template "common.names.fullname" . }} -p {{ .Values.sentinel.service.ports.redis }}{{ if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} # Read only operations + {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h {{ template "common.names.fullname" . }} -p {{ .Values.sentinel.service.ports.sentinel }}{{ if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} # Sentinel access + {{- else }} + {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h {{ printf "%s-master" (include "common.names.fullname" .) }}{{ if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} + {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h {{ printf "%s-replicas" (include "common.names.fullname" .) }}{{ if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} + {{- end }} +{{- else }} + {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h {{ template "common.names.fullname" . }}-master{{ if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} +{{- end }} + +{{- if and (.Values.networkPolicy.enabled) (not .Values.networkPolicy.allowExternal) }} + +Note: Since NetworkPolicy is enabled, only pods with label {{ template "common.names.fullname" . }}-client=true" will be able to connect to redis. + +{{- else }} + +To connect to your database from outside the cluster execute the following commands: + +{{- if and (eq .Values.architecture "replication") .Values.sentinel.enabled }} +{{- if contains "NodePort" .Values.sentinel.service.type }} + + export NODE_IP=$(kubectl get nodes --namespace {{ include "common.names.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}") + export NODE_PORT=$(kubectl get --namespace {{ include "common.names.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "common.names.fullname" . }}) + {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h $NODE_IP -p $NODE_PORT {{- if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} + +{{- else if contains "LoadBalancer" .Values.sentinel.service.type }} + + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + Watch the status with: 'kubectl get svc --namespace {{ include "common.names.namespace" . }} -w {{ template "common.names.fullname" . }}' + + export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.names.namespace" . }} {{ template "common.names.fullname" . }} --template "{{ "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}" }}") + {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h $SERVICE_IP -p {{ .Values.sentinel.service.ports.redis }} {{- if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} + +{{- else if contains "ClusterIP" .Values.sentinel.service.type }} + + kubectl port-forward --namespace {{ include "common.names.namespace" . }} svc/{{ template "common.names.fullname" . }} {{ .Values.sentinel.service.ports.redis }}:{{ .Values.sentinel.service.ports.redis }} & + {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h 127.0.0.1 -p {{ .Values.sentinel.service.ports.redis }} {{- if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} + +{{- end }} +{{- else }} +{{- if contains "NodePort" .Values.master.service.type }} + + export NODE_IP=$(kubectl get nodes --namespace {{ include "common.names.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}") + export NODE_PORT=$(kubectl get --namespace {{ include "common.names.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ printf "%s-master" (include "common.names.fullname" .) }}) + {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h $NODE_IP -p $NODE_PORT {{- if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} + +{{- else if contains "LoadBalancer" .Values.master.service.type }} + + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + Watch the status with: 'kubectl get svc --namespace {{ include "common.names.namespace" . }} -w {{ template "common.names.fullname" . }}' + + export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.names.namespace" . }} {{ printf "%s-master" (include "common.names.fullname" .) }} --template "{{ "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}" }}") + {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h $SERVICE_IP -p {{ .Values.master.service.ports.redis }} {{- if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} + +{{- else if contains "ClusterIP" .Values.master.service.type }} + + kubectl port-forward --namespace {{ include "common.names.namespace" . }} svc/{{ printf "%s-master" (include "common.names.fullname" .) }} {{ .Values.master.service.ports.redis }}:{{ .Values.master.service.ports.redis }} & + {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h 127.0.0.1 -p {{ .Values.master.service.ports.redis }} {{- if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} + +{{- end }} +{{- end }} + +{{- end }} +{{- end }} +{{- include "redis.checkRollingTags" . }} +{{- include "common.warnings.rollingTag" .Values.volumePermissions.image }} +{{- include "common.warnings.rollingTag" .Values.sysctl.image }} +{{- include "redis.validateValues" . }} + +{{- if and (eq .Values.architecture "replication") .Values.sentinel.enabled (eq .Values.sentinel.service.type "NodePort") (not .Release.IsUpgrade ) }} +{{- if $.Values.sentinel.service.nodePorts.sentinel }} +No need to upgrade, ports and nodeports have been set from values +{{- else }} +#!#!#!#!#!#!#!# IMPORTANT #!#!#!#!#!#!#!# +YOU NEED TO PERFORM AN UPGRADE FOR THE SERVICES AND WORKLOAD TO BE CREATED +{{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/_helpers.tpl b/thunder_deployment/infra/beta9/charts/redis/templates/_helpers.tpl new file mode 100644 index 000000000..9eb017f19 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/_helpers.tpl @@ -0,0 +1,328 @@ +{{/* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} + +{{/* +Return the proper Redis image name +*/}} +{{- define "redis.image" -}} +{{ include "common.images.image" (dict "imageRoot" .Values.image "global" .Values.global) }} +{{- end -}} + +{{/* +Return the proper Redis Sentinel image name +*/}} +{{- define "redis.sentinel.image" -}} +{{ include "common.images.image" (dict "imageRoot" .Values.sentinel.image "global" .Values.global) }} +{{- end -}} + +{{/* +Return the proper image name (for the metrics image) +*/}} +{{- define "redis.metrics.image" -}} +{{ include "common.images.image" (dict "imageRoot" .Values.metrics.image "global" .Values.global) }} +{{- end -}} + +{{/* +Return the proper image name (for the init container volume-permissions image) +*/}} +{{- define "redis.volumePermissions.image" -}} +{{ include "common.images.image" (dict "imageRoot" .Values.volumePermissions.image "global" .Values.global) }} +{{- end -}} + +{{/* +Return sysctl image +*/}} +{{- define "redis.sysctl.image" -}} +{{ include "common.images.image" (dict "imageRoot" .Values.sysctl.image "global" .Values.global) }} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names +*/}} +{{- define "redis.imagePullSecrets" -}} +{{- include "common.images.renderPullSecrets" (dict "images" (list .Values.image .Values.sentinel.image .Values.metrics.image .Values.volumePermissions.image .Values.sysctl.image) "context" $) -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for networkpolicy. +*/}} +{{- define "networkPolicy.apiVersion" -}} +{{- if semverCompare ">=1.4-0, <1.7-0" .Capabilities.KubeVersion.GitVersion -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiGroup for PodSecurityPolicy. +*/}} +{{- define "podSecurityPolicy.apiGroup" -}} +{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +{{- print "policy" -}} +{{- else -}} +{{- print "extensions" -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if a TLS secret object should be created +*/}} +{{- define "redis.createTlsSecret" -}} +{{- if and .Values.tls.enabled .Values.tls.autoGenerated (and (not .Values.tls.existingSecret) (not .Values.tls.certificatesSecret)) }} + {{- true -}} +{{- end -}} +{{- end -}} + +{{/* +Return the secret containing Redis TLS certificates +*/}} +{{- define "redis.tlsSecretName" -}} +{{- $secretName := coalesce .Values.tls.existingSecret .Values.tls.certificatesSecret -}} +{{- if $secretName -}} + {{- printf "%s" (tpl $secretName $) -}} +{{- else -}} + {{- printf "%s-crt" (include "common.names.fullname" .) -}} +{{- end -}} +{{- end -}} + +{{/* +Return the path to the cert file. +*/}} +{{- define "redis.tlsCert" -}} +{{- if (include "redis.createTlsSecret" . ) -}} + {{- printf "/opt/bitnami/redis/certs/%s" "tls.crt" -}} +{{- else -}} + {{- required "Certificate filename is required when TLS in enabled" .Values.tls.certFilename | printf "/opt/bitnami/redis/certs/%s" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the path to the cert key file. +*/}} +{{- define "redis.tlsCertKey" -}} +{{- if (include "redis.createTlsSecret" . ) -}} + {{- printf "/opt/bitnami/redis/certs/%s" "tls.key" -}} +{{- else -}} + {{- required "Certificate Key filename is required when TLS in enabled" .Values.tls.certKeyFilename | printf "/opt/bitnami/redis/certs/%s" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the path to the CA cert file. +*/}} +{{- define "redis.tlsCACert" -}} +{{- if (include "redis.createTlsSecret" . ) -}} + {{- printf "/opt/bitnami/redis/certs/%s" "ca.crt" -}} +{{- else -}} + {{- required "Certificate CA filename is required when TLS in enabled" .Values.tls.certCAFilename | printf "/opt/bitnami/redis/certs/%s" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the path to the DH params file. +*/}} +{{- define "redis.tlsDHParams" -}} +{{- if .Values.tls.dhParamsFilename -}} +{{- printf "/opt/bitnami/redis/certs/%s" .Values.tls.dhParamsFilename -}} +{{- end -}} +{{- end -}} + +{{/* +Create the name of the shared service account to use +*/}} +{{- define "redis.serviceAccountName" -}} +{{- if .Values.serviceAccount.create -}} + {{ default (include "common.names.fullname" .) .Values.serviceAccount.name }} +{{- else -}} + {{ default "default" .Values.serviceAccount.name }} +{{- end -}} +{{- end -}} + +{{/* +Create the name of the master service account to use +*/}} +{{- define "redis.masterServiceAccountName" -}} +{{- if .Values.master.serviceAccount.create -}} + {{ default (printf "%s-master" (include "common.names.fullname" .)) .Values.master.serviceAccount.name }} +{{- else -}} + {{- if .Values.serviceAccount.create -}} + {{ template "redis.serviceAccountName" . }} + {{- else -}} + {{ default "default" .Values.master.serviceAccount.name }} + {{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create the name of the replicas service account to use +*/}} +{{- define "redis.replicaServiceAccountName" -}} +{{- if .Values.replica.serviceAccount.create -}} + {{ default (printf "%s-replica" (include "common.names.fullname" .)) .Values.replica.serviceAccount.name }} +{{- else -}} + {{- if .Values.serviceAccount.create -}} + {{ template "redis.serviceAccountName" . }} + {{- else -}} + {{ default "default" .Values.replica.serviceAccount.name }} + {{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Return the configuration configmap name +*/}} +{{- define "redis.configmapName" -}} +{{- if .Values.existingConfigmap -}} + {{- printf "%s" (tpl .Values.existingConfigmap $) -}} +{{- else -}} + {{- printf "%s-configuration" (include "common.names.fullname" .) -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if a configmap object should be created +*/}} +{{- define "redis.createConfigmap" -}} +{{- if empty .Values.existingConfigmap }} + {{- true -}} +{{- end -}} +{{- end -}} + +{{/* +Get the password secret. +*/}} +{{- define "redis.secretName" -}} +{{- if .Values.auth.existingSecret -}} +{{- printf "%s" (tpl .Values.auth.existingSecret $) -}} +{{- else -}} +{{- printf "%s" (include "common.names.fullname" .) -}} +{{- end -}} +{{- end -}} + +{{/* +Get the password key to be retrieved from Redis® secret. +*/}} +{{- define "redis.secretPasswordKey" -}} +{{- if and .Values.auth.existingSecret .Values.auth.existingSecretPasswordKey -}} +{{- printf "%s" (tpl .Values.auth.existingSecretPasswordKey $) -}} +{{- else -}} +{{- printf "redis-password" -}} +{{- end -}} +{{- end -}} + + +{{/* +Returns the available value for certain key in an existing secret (if it exists), +otherwise it generates a random value. +*/}} +{{- define "getValueFromSecret" }} + {{- $len := (default 16 .Length) | int -}} + {{- $obj := (lookup "v1" "Secret" .Namespace .Name).data -}} + {{- if $obj }} + {{- index $obj .Key | b64dec -}} + {{- else -}} + {{- randAlphaNum $len -}} + {{- end -}} +{{- end }} + +{{/* +Return Redis® password +*/}} +{{- define "redis.password" -}} +{{- if or .Values.auth.enabled .Values.global.redis.password }} + {{- if not (empty .Values.global.redis.password) }} + {{- .Values.global.redis.password -}} + {{- else if not (empty .Values.auth.password) -}} + {{- .Values.auth.password -}} + {{- else -}} + {{- include "getValueFromSecret" (dict "Namespace" (include "common.names.namespace" .) "Name" (include "redis.secretName" .) "Length" 10 "Key" (include "redis.secretPasswordKey" .)) -}} + {{- end -}} +{{- end -}} +{{- end }} + +{{/* Check if there are rolling tags in the images */}} +{{- define "redis.checkRollingTags" -}} +{{- include "common.warnings.rollingTag" .Values.image }} +{{- include "common.warnings.rollingTag" .Values.sentinel.image }} +{{- include "common.warnings.rollingTag" .Values.metrics.image }} +{{- end -}} + +{{/* +Compile all warnings into a single message, and call fail. +*/}} +{{- define "redis.validateValues" -}} +{{- $messages := list -}} +{{- $messages := append $messages (include "redis.validateValues.topologySpreadConstraints" .) -}} +{{- $messages := append $messages (include "redis.validateValues.architecture" .) -}} +{{- $messages := append $messages (include "redis.validateValues.podSecurityPolicy.create" .) -}} +{{- $messages := append $messages (include "redis.validateValues.tls" .) -}} +{{- $messages := without $messages "" -}} +{{- $message := join "\n" $messages -}} + +{{- if $message -}} +{{- printf "\nVALUES VALIDATION:\n%s" $message | fail -}} +{{- end -}} +{{- end -}} + +{{/* Validate values of Redis® - spreadConstrainsts K8s version */}} +{{- define "redis.validateValues.topologySpreadConstraints" -}} +{{- if and (semverCompare "<1.16-0" .Capabilities.KubeVersion.GitVersion) .Values.replica.topologySpreadConstraints -}} +redis: topologySpreadConstraints + Pod Topology Spread Constraints are only available on K8s >= 1.16 + Find more information at https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ +{{- end -}} +{{- end -}} + +{{/* Validate values of Redis® - must provide a valid architecture */}} +{{- define "redis.validateValues.architecture" -}} +{{- if and (ne .Values.architecture "standalone") (ne .Values.architecture "replication") -}} +redis: architecture + Invalid architecture selected. Valid values are "standalone" and + "replication". Please set a valid architecture (--set architecture="xxxx") +{{- end -}} +{{- if and .Values.sentinel.enabled (not (eq .Values.architecture "replication")) }} +redis: architecture + Using redis sentinel on standalone mode is not supported. + To deploy redis sentinel, please select the "replication" mode + (--set "architecture=replication,sentinel.enabled=true") +{{- end -}} +{{- end -}} + +{{/* Validate values of Redis® - PodSecurityPolicy create */}} +{{- define "redis.validateValues.podSecurityPolicy.create" -}} +{{- if and .Values.podSecurityPolicy.create (not .Values.podSecurityPolicy.enabled) }} +redis: podSecurityPolicy.create + In order to create PodSecurityPolicy, you also need to enable + podSecurityPolicy.enabled field +{{- end -}} +{{- end -}} + +{{/* Validate values of Redis® - TLS enabled */}} +{{- define "redis.validateValues.tls" -}} +{{- if and .Values.tls.enabled (not .Values.tls.autoGenerated) (not .Values.tls.existingSecret) (not .Values.tls.certificatesSecret) }} +redis: tls.enabled + In order to enable TLS, you also need to provide + an existing secret containing the TLS certificates or + enable auto-generated certificates. +{{- end -}} +{{- end -}} + +{{/* Define the suffix utilized for external-dns */}} +{{- define "redis.externalDNS.suffix" -}} +{{ printf "%s.%s" (include "common.names.fullname" .) .Values.useExternalDNS.suffix }} +{{- end -}} + +{{/* Compile all annotations utilized for external-dns */}} +{{- define "redis.externalDNS.annotations" -}} +{{- if and .Values.useExternalDNS.enabled .Values.useExternalDNS.annotationKey }} +{{ .Values.useExternalDNS.annotationKey }}hostname: {{ include "redis.externalDNS.suffix" . }} +{{- range $key, $val := .Values.useExternalDNS.additionalAnnotations }} +{{ $.Values.useExternalDNS.annotationKey }}{{ $key }}: {{ $val | quote }} +{{- end }} +{{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/configmap.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/configmap.yaml new file mode 100644 index 000000000..6c370a2aa --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/configmap.yaml @@ -0,0 +1,61 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if (include "redis.createConfigmap" .) }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ printf "%s-configuration" (include "common.names.fullname" .) }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +data: + redis.conf: |- + # User-supplied common configuration: + {{- if .Values.commonConfiguration }} + {{- include "common.tplvalues.render" ( dict "value" .Values.commonConfiguration "context" $ ) | nindent 4 }} + {{- end }} + # End of common configuration + master.conf: |- + dir {{ .Values.master.persistence.path }} + # User-supplied master configuration: + {{- if .Values.master.configuration }} + {{- include "common.tplvalues.render" ( dict "value" .Values.master.configuration "context" $ ) | nindent 4 }} + {{- end }} + {{- if .Values.master.disableCommands }} + {{- range .Values.master.disableCommands }} + rename-command {{ . }} "" + {{- end }} + {{- end }} + # End of master configuration + replica.conf: |- + dir {{ .Values.replica.persistence.path }} + # User-supplied replica configuration: + {{- if .Values.replica.configuration }} + {{- include "common.tplvalues.render" ( dict "value" .Values.replica.configuration "context" $ ) | nindent 4 }} + {{- end }} + {{- if .Values.replica.disableCommands }} + {{- range .Values.replica.disableCommands }} + rename-command {{ . }} "" + {{- end }} + {{- end }} + # End of replica configuration + {{- if .Values.sentinel.enabled }} + sentinel.conf: |- + dir "/tmp" + port {{ .Values.sentinel.containerPorts.sentinel }} + sentinel monitor {{ .Values.sentinel.masterSet }} {{ template "common.names.fullname" . }}-node-0.{{ template "common.names.fullname" . }}-headless.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }} {{ .Values.sentinel.service.ports.redis }} {{ .Values.sentinel.quorum }} + sentinel down-after-milliseconds {{ .Values.sentinel.masterSet }} {{ .Values.sentinel.downAfterMilliseconds }} + sentinel failover-timeout {{ .Values.sentinel.masterSet }} {{ .Values.sentinel.failoverTimeout }} + sentinel parallel-syncs {{ .Values.sentinel.masterSet }} {{ .Values.sentinel.parallelSyncs }} + # User-supplied sentinel configuration: + {{- if .Values.sentinel.configuration }} + {{- include "common.tplvalues.render" ( dict "value" .Values.sentinel.configuration "context" $ ) | nindent 4 }} + {{- end }} + # End of sentinel configuration + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/extra-list.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/extra-list.yaml new file mode 100644 index 000000000..2d35a580e --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/extra-list.yaml @@ -0,0 +1,9 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- range .Values.extraDeploy }} +--- +{{ include "common.tplvalues.render" (dict "value" . "context" $) }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/headless-svc.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/headless-svc.yaml new file mode 100644 index 000000000..e69329f82 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/headless-svc.yaml @@ -0,0 +1,33 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +apiVersion: v1 +kind: Service +metadata: + name: {{ printf "%s-headless" (include "common.names.fullname" .) }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + annotations: + {{- if or .Values.sentinel.service.headless.annotations .Values.commonAnnotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.sentinel.service.headless.annotations .Values.commonAnnotations ) "context" . ) }} + {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} + {{- include "redis.externalDNS.annotations" . | nindent 4 }} +spec: + type: ClusterIP + clusterIP: None + {{- if .Values.sentinel.enabled }} + publishNotReadyAddresses: true + {{- end }} + ports: + - name: tcp-redis + port: {{ if .Values.sentinel.enabled }}{{ .Values.sentinel.service.ports.redis }}{{ else }}{{ .Values.master.service.ports.redis }}{{ end }} + targetPort: redis + {{- if .Values.sentinel.enabled }} + - name: tcp-sentinel + port: {{ .Values.sentinel.service.ports.sentinel }} + targetPort: redis-sentinel + {{- end }} + selector: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/health-configmap.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/health-configmap.yaml new file mode 100644 index 000000000..5d15b0639 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/health-configmap.yaml @@ -0,0 +1,194 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ printf "%s-health" (include "common.names.fullname" .) }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +data: + ping_readiness_local.sh: |- + #!/bin/bash + + [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")" + [[ -n "$REDIS_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_PASSWORD" + response=$( + timeout -s 15 $1 \ + redis-cli \ + -h localhost \ +{{- if .Values.tls.enabled }} + -p $REDIS_TLS_PORT \ + --tls \ + --cacert {{ template "redis.tlsCACert" . }} \ + {{- if .Values.tls.authClients }} + --cert {{ template "redis.tlsCert" . }} \ + --key {{ template "redis.tlsCertKey" . }} \ + {{- end }} +{{- else }} + -p $REDIS_PORT \ +{{- end }} + ping + ) + if [ "$?" -eq "124" ]; then + echo "Timed out" + exit 1 + fi + if [ "$response" != "PONG" ]; then + echo "$response" + exit 1 + fi + ping_liveness_local.sh: |- + #!/bin/bash + + [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")" + [[ -n "$REDIS_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_PASSWORD" + response=$( + timeout -s 15 $1 \ + redis-cli \ + -h localhost \ +{{- if .Values.tls.enabled }} + -p $REDIS_TLS_PORT \ + --tls \ + --cacert {{ template "redis.tlsCACert" . }} \ + {{- if .Values.tls.authClients }} + --cert {{ template "redis.tlsCert" . }} \ + --key {{ template "redis.tlsCertKey" . }} \ + {{- end }} +{{- else }} + -p $REDIS_PORT \ +{{- end }} + ping + ) + if [ "$?" -eq "124" ]; then + echo "Timed out" + exit 1 + fi + responseFirstWord=$(echo $response | head -n1 | awk '{print $1;}') + if [ "$response" != "PONG" ] && [ "$responseFirstWord" != "LOADING" ] && [ "$responseFirstWord" != "MASTERDOWN" ]; then + echo "$response" + exit 1 + fi +{{- if .Values.sentinel.enabled }} + ping_sentinel.sh: |- + #!/bin/bash + +{{- if .Values.auth.sentinel }} + [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")" + [[ -n "$REDIS_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_PASSWORD" +{{- end }} + response=$( + timeout -s 15 $1 \ + redis-cli \ + -h localhost \ +{{- if .Values.tls.enabled }} + -p $REDIS_SENTINEL_TLS_PORT_NUMBER \ + --tls \ + --cacert "$REDIS_SENTINEL_TLS_CA_FILE" \ + {{- if .Values.tls.authClients }} + --cert "$REDIS_SENTINEL_TLS_CERT_FILE" \ + --key "$REDIS_SENTINEL_TLS_KEY_FILE" \ + {{- end }} +{{- else }} + -p $REDIS_SENTINEL_PORT \ +{{- end }} + ping + ) + if [ "$?" -eq "124" ]; then + echo "Timed out" + exit 1 + fi + if [ "$response" != "PONG" ]; then + echo "$response" + exit 1 + fi + parse_sentinels.awk: |- + /ip/ {FOUND_IP=1} + /port/ {FOUND_PORT=1} + /runid/ {FOUND_RUNID=1} + !/ip|port|runid/ { + if (FOUND_IP==1) { + IP=$1; FOUND_IP=0; + } + else if (FOUND_PORT==1) { + PORT=$1; + FOUND_PORT=0; + } else if (FOUND_RUNID==1) { + printf "\nsentinel known-sentinel {{ .Values.sentinel.masterSet }} %s %s %s", IP, PORT, $0; FOUND_RUNID=0; + } + } +{{- end }} + ping_readiness_master.sh: |- + #!/bin/bash + + [[ -f $REDIS_MASTER_PASSWORD_FILE ]] && export REDIS_MASTER_PASSWORD="$(< "${REDIS_MASTER_PASSWORD_FILE}")" + [[ -n "$REDIS_MASTER_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_MASTER_PASSWORD" + response=$( + timeout -s 15 $1 \ + redis-cli \ + -h $REDIS_MASTER_HOST \ + -p $REDIS_MASTER_PORT_NUMBER \ +{{- if .Values.tls.enabled }} + --tls \ + --cacert {{ template "redis.tlsCACert" . }} \ + {{- if .Values.tls.authClients }} + --cert {{ template "redis.tlsCert" . }} \ + --key {{ template "redis.tlsCertKey" . }} \ + {{- end }} +{{- end }} + ping + ) + if [ "$?" -eq "124" ]; then + echo "Timed out" + exit 1 + fi + if [ "$response" != "PONG" ]; then + echo "$response" + exit 1 + fi + ping_liveness_master.sh: |- + #!/bin/bash + + [[ -f $REDIS_MASTER_PASSWORD_FILE ]] && export REDIS_MASTER_PASSWORD="$(< "${REDIS_MASTER_PASSWORD_FILE}")" + [[ -n "$REDIS_MASTER_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_MASTER_PASSWORD" + response=$( + timeout -s 15 $1 \ + redis-cli \ + -h $REDIS_MASTER_HOST \ + -p $REDIS_MASTER_PORT_NUMBER \ +{{- if .Values.tls.enabled }} + --tls \ + --cacert {{ template "redis.tlsCACert" . }} \ + {{- if .Values.tls.authClients }} + --cert {{ template "redis.tlsCert" . }} \ + --key {{ template "redis.tlsCertKey" . }} \ + {{- end }} +{{- end }} + ping + ) + if [ "$?" -eq "124" ]; then + echo "Timed out" + exit 1 + fi + responseFirstWord=$(echo $response | head -n1 | awk '{print $1;}') + if [ "$response" != "PONG" ] && [ "$responseFirstWord" != "LOADING" ]; then + echo "$response" + exit 1 + fi + ping_readiness_local_and_master.sh: |- + script_dir="$(dirname "$0")" + exit_status=0 + "$script_dir/ping_readiness_local.sh" $1 || exit_status=$? + "$script_dir/ping_readiness_master.sh" $1 || exit_status=$? + exit $exit_status + ping_liveness_local_and_master.sh: |- + script_dir="$(dirname "$0")" + exit_status=0 + "$script_dir/ping_liveness_local.sh" $1 || exit_status=$? + "$script_dir/ping_liveness_master.sh" $1 || exit_status=$? + exit $exit_status diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/master/application.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/master/application.yaml new file mode 100644 index 000000000..84569b930 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/master/application.yaml @@ -0,0 +1,532 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if gt (int64 .Values.master.count) 0 -}} +{{- if or (not (eq .Values.architecture "replication")) (not .Values.sentinel.enabled) }} +apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }} +kind: {{ .Values.master.kind }} +metadata: + name: {{ printf "%s-master" (include "common.names.fullname" .) }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: master + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + {{- if not (eq .Values.master.kind "DaemonSet") }} + replicas: {{ .Values.master.count }} + {{- end }} + {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.master.podLabels .Values.commonLabels ) "context" . ) }} + selector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }} + app.kubernetes.io/component: master + {{- if (eq .Values.master.kind "StatefulSet") }} + serviceName: {{ printf "%s-headless" (include "common.names.fullname" .) }} + {{- end }} + {{- if .Values.master.updateStrategy }} + {{- if (eq .Values.master.kind "Deployment") }} + strategy: {{- toYaml .Values.master.updateStrategy | nindent 4 }} + {{- else }} + updateStrategy: {{- toYaml .Values.master.updateStrategy | nindent 4 }} + {{- end }} + {{- if and .Values.master.minReadySeconds (semverCompare ">= 1.23-0" (include "common.capabilities.kubeVersion" .)) }} + minReadySeconds: {{ .Values.master.minReadySeconds }} + {{- end }} + {{- end }} + template: + metadata: + labels: {{- include "common.labels.standard" ( dict "customLabels" $podLabels "context" $ ) | nindent 8 }} + app.kubernetes.io/component: master + {{- if and .Values.metrics.enabled .Values.metrics.podLabels }} + {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.podLabels "context" $ ) | nindent 8 }} + {{- end }} + annotations: + {{- if (include "redis.createConfigmap" .) }} + checksum/configmap: {{ pick ( include (print $.Template.BasePath "/configmap.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} + {{- end }} + checksum/health: {{ pick ( include (print $.Template.BasePath "/health-configmap.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} + checksum/scripts: {{ pick ( include (print $.Template.BasePath "/scripts-configmap.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} + checksum/secret: {{ pick ( include (print $.Template.BasePath "/secret.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} + {{- if .Values.master.podAnnotations }} + {{- include "common.tplvalues.render" ( dict "value" .Values.master.podAnnotations "context" $ ) | nindent 8 }} + {{- end }} + {{- if and .Values.metrics.enabled .Values.metrics.podAnnotations }} + {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.podAnnotations "context" $ ) | nindent 8 }} + {{- end }} + spec: + {{- include "redis.imagePullSecrets" . | nindent 6 }} + {{- if .Values.master.hostAliases }} + hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.master.hostAliases "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.master.podSecurityContext.enabled }} + securityContext: {{- omit .Values.master.podSecurityContext "enabled" | toYaml | nindent 8 }} + {{- end }} + serviceAccountName: {{ template "redis.masterServiceAccountName" . }} + automountServiceAccountToken: {{ .Values.master.automountServiceAccountToken }} + {{- if .Values.master.priorityClassName }} + priorityClassName: {{ .Values.master.priorityClassName | quote }} + {{- end }} + {{- if .Values.master.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.master.affinity "context" $) | nindent 8 }} + {{- else }} + affinity: + podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.master.podAffinityPreset "component" "master" "customLabels" $podLabels "context" $) | nindent 10 }} + podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.master.podAntiAffinityPreset "component" "master" "customLabels" $podLabels "context" $) | nindent 10 }} + nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.master.nodeAffinityPreset.type "key" .Values.master.nodeAffinityPreset.key "values" .Values.master.nodeAffinityPreset.values) | nindent 10 }} + {{- end }} + {{- if .Values.master.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.master.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.master.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.master.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.master.topologySpreadConstraints }} + topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.master.topologySpreadConstraints "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.master.shareProcessNamespace }} + shareProcessNamespace: {{ .Values.master.shareProcessNamespace }} + {{- end }} + {{- if .Values.master.schedulerName }} + schedulerName: {{ .Values.master.schedulerName | quote }} + {{- end }} + {{- if .Values.master.dnsPolicy }} + dnsPolicy: {{ .Values.master.dnsPolicy }} + {{- end }} + {{- if .Values.master.dnsConfig }} + dnsConfig: {{- include "common.tplvalues.render" (dict "value" .Values.master.dnsConfig "context" $) | nindent 8 }} + {{- end }} + enableServiceLinks: {{ .Values.master.enableServiceLinks }} + terminationGracePeriodSeconds: {{ .Values.master.terminationGracePeriodSeconds }} + containers: + - name: redis + image: {{ template "redis.image" . }} + imagePullPolicy: {{ .Values.image.pullPolicy | quote }} + {{- if .Values.master.lifecycleHooks }} + lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.master.lifecycleHooks "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.master.containerSecurityContext.enabled }} + securityContext: {{- omit .Values.master.containerSecurityContext "enabled" | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} + {{- else if .Values.master.command }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.master.command "context" $) | nindent 12 }} + {{- else }} + command: + - /bin/bash + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} + {{- else if .Values.master.args }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.master.args "context" $) | nindent 12 }} + {{- else }} + args: + - -c + - /opt/bitnami/scripts/start-scripts/start-master.sh + {{- end }} + env: + - name: BITNAMI_DEBUG + value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }} + - name: REDIS_REPLICATION_MODE + value: master + - name: ALLOW_EMPTY_PASSWORD + value: {{ ternary "no" "yes" .Values.auth.enabled | quote }} + {{- if .Values.auth.enabled }} + {{- if .Values.auth.usePasswordFiles }} + - name: REDIS_PASSWORD_FILE + value: "/opt/bitnami/redis/secrets/redis-password" + {{- else }} + - name: REDIS_PASSWORD + valueFrom: + secretKeyRef: + name: {{ template "redis.secretName" . }} + key: {{ template "redis.secretPasswordKey" . }} + {{- end }} + {{- end }} + - name: REDIS_TLS_ENABLED + value: {{ ternary "yes" "no" .Values.tls.enabled | quote }} + {{- if .Values.tls.enabled }} + - name: REDIS_TLS_PORT + value: {{ .Values.master.containerPorts.redis | quote }} + - name: REDIS_TLS_AUTH_CLIENTS + value: {{ ternary "yes" "no" .Values.tls.authClients | quote }} + - name: REDIS_TLS_CERT_FILE + value: {{ template "redis.tlsCert" . }} + - name: REDIS_TLS_KEY_FILE + value: {{ template "redis.tlsCertKey" . }} + - name: REDIS_TLS_CA_FILE + value: {{ template "redis.tlsCACert" . }} + {{- if .Values.tls.dhParamsFilename }} + - name: REDIS_TLS_DH_PARAMS_FILE + value: {{ template "redis.tlsDHParams" . }} + {{- end }} + {{- else }} + - name: REDIS_PORT + value: {{ .Values.master.containerPorts.redis | quote }} + {{- end }} + {{- if .Values.master.extraEnvVars }} + {{- include "common.tplvalues.render" (dict "value" .Values.master.extraEnvVars "context" $) | nindent 12 }} + {{- end }} + {{- if or .Values.master.extraEnvVarsCM .Values.master.extraEnvVarsSecret }} + envFrom: + {{- if .Values.master.extraEnvVarsCM }} + - configMapRef: + name: {{ .Values.master.extraEnvVarsCM }} + {{- end }} + {{- if .Values.master.extraEnvVarsSecret }} + - secretRef: + name: {{ .Values.master.extraEnvVarsSecret }} + {{- end }} + {{- end }} + ports: + - name: redis + containerPort: {{ .Values.master.containerPorts.redis }} + {{- if not .Values.diagnosticMode.enabled }} + {{- if .Values.master.customStartupProbe }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.master.customStartupProbe "context" $) | nindent 12 }} + {{- else if .Values.master.startupProbe.enabled }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.master.startupProbe "enabled") "context" $) | nindent 12 }} + tcpSocket: + port: redis + {{- end }} + {{- if .Values.master.customLivenessProbe }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.master.customLivenessProbe "context" $) | nindent 12 }} + {{- else if .Values.master.livenessProbe.enabled }} + livenessProbe: + initialDelaySeconds: {{ .Values.master.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.master.livenessProbe.periodSeconds }} + # One second longer than command timeout should prevent generation of zombie processes. + timeoutSeconds: {{ add1 .Values.master.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.master.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.master.livenessProbe.failureThreshold }} + exec: + command: + - sh + - -c + - /health/ping_liveness_local.sh {{ .Values.master.livenessProbe.timeoutSeconds }} + {{- end }} + {{- if .Values.master.customReadinessProbe }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.master.customReadinessProbe "context" $) | nindent 12 }} + {{- else if .Values.master.readinessProbe.enabled }} + readinessProbe: + initialDelaySeconds: {{ .Values.master.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.master.readinessProbe.periodSeconds }} + timeoutSeconds: {{ add1 .Values.master.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.master.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.master.readinessProbe.failureThreshold }} + exec: + command: + - sh + - -c + - /health/ping_readiness_local.sh {{ .Values.master.readinessProbe.timeoutSeconds }} + {{- end }} + {{- end }} + {{- if .Values.master.resources }} + resources: {{- toYaml .Values.master.resources | nindent 12 }} + {{- end }} + volumeMounts: + - name: start-scripts + mountPath: /opt/bitnami/scripts/start-scripts + - name: health + mountPath: /health + {{- if .Values.auth.usePasswordFiles }} + - name: redis-password + mountPath: /opt/bitnami/redis/secrets/ + {{- end }} + - name: redis-data + mountPath: {{ .Values.master.persistence.path }} + {{- if .Values.master.persistence.subPath }} + subPath: {{ .Values.master.persistence.subPath }} + {{- else if .Values.master.persistence.subPathExpr }} + subPathExpr: {{ .Values.master.persistence.subPathExpr }} + {{- end }} + - name: config + mountPath: /opt/bitnami/redis/mounted-etc + - name: redis-tmp-conf + mountPath: /opt/bitnami/redis/etc/ + - name: tmp + mountPath: /tmp + {{- if .Values.tls.enabled }} + - name: redis-certificates + mountPath: /opt/bitnami/redis/certs + readOnly: true + {{- end }} + {{- if .Values.master.extraVolumeMounts }} + {{- include "common.tplvalues.render" ( dict "value" .Values.master.extraVolumeMounts "context" $ ) | nindent 12 }} + {{- end }} + {{- if .Values.metrics.enabled }} + - name: metrics + image: {{ include "redis.metrics.image" . }} + imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }} + {{- if .Values.metrics.containerSecurityContext.enabled }} + securityContext: {{- omit .Values.metrics.containerSecurityContext "enabled" | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} + {{- else if .Values.metrics.command }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.command "context" $) | nindent 12 }} + {{- else }} + command: + - /bin/bash + - -c + - | + if [[ -f '/secrets/redis-password' ]]; then + export REDIS_PASSWORD=$(cat /secrets/redis-password) + fi + redis_exporter{{- range $key, $value := .Values.metrics.extraArgs }} --{{ $key }}={{ $value }}{{- end }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} + {{- end }} + env: + - name: REDIS_ALIAS + value: {{ template "common.names.fullname" . }} + {{- if .Values.auth.enabled }} + - name: REDIS_USER + value: default + {{- if (not .Values.auth.usePasswordFiles) }} + - name: REDIS_PASSWORD + valueFrom: + secretKeyRef: + name: {{ template "redis.secretName" . }} + key: {{ template "redis.secretPasswordKey" . }} + {{- end }} + {{- end }} + {{- if .Values.tls.enabled }} + - name: REDIS_ADDR + value: rediss://{{ .Values.metrics.redisTargetHost }}:{{ .Values.master.containerPorts.redis }} + {{- if .Values.tls.authClients }} + - name: REDIS_EXPORTER_TLS_CLIENT_KEY_FILE + value: {{ template "redis.tlsCertKey" . }} + - name: REDIS_EXPORTER_TLS_CLIENT_CERT_FILE + value: {{ template "redis.tlsCert" . }} + {{- end }} + - name: REDIS_EXPORTER_TLS_CA_CERT_FILE + value: {{ template "redis.tlsCACert" . }} + {{- end }} + {{- if .Values.metrics.extraEnvVars }} + {{- include "common.tplvalues.render" (dict "value" .Values.metrics.extraEnvVars "context" $) | nindent 12 }} + {{- end }} + ports: + - name: metrics + containerPort: 9121 + {{- if not .Values.diagnosticMode.enabled }} + {{- if .Values.metrics.customStartupProbe }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customStartupProbe "context" $) | nindent 12 }} + {{- else if .Values.metrics.startupProbe.enabled }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.startupProbe "enabled") "context" $) | nindent 12 }} + tcpSocket: + port: metrics + {{- end }} + {{- if .Values.metrics.customLivenessProbe }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customLivenessProbe "context" $) | nindent 12 }} + {{- else if .Values.metrics.livenessProbe.enabled }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.livenessProbe "enabled") "context" $) | nindent 12 }} + tcpSocket: + port: metrics + {{- end }} + {{- if .Values.metrics.customReadinessProbe }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customReadinessProbe "context" $) | nindent 12 }} + {{- else if .Values.metrics.readinessProbe.enabled }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.readinessProbe "enabled") "context" $) | nindent 12 }} + httpGet: + path: / + port: metrics + {{- end }} + {{- end }} + {{- if .Values.metrics.resources }} + resources: {{- toYaml .Values.metrics.resources | nindent 12 }} + {{- end }} + volumeMounts: + {{- if .Values.auth.usePasswordFiles }} + - name: redis-password + mountPath: /secrets/ + {{- end }} + {{- if .Values.tls.enabled }} + - name: redis-certificates + mountPath: /opt/bitnami/redis/certs + readOnly: true + {{- end }} + {{- if .Values.metrics.extraVolumeMounts }} + {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.extraVolumeMounts "context" $ ) | nindent 12 }} + {{- end }} + {{- end }} + {{- if .Values.master.sidecars }} + {{- include "common.tplvalues.render" (dict "value" .Values.master.sidecars "context" $) | nindent 8 }} + {{- end }} + {{- $needsVolumePermissions := and .Values.volumePermissions.enabled .Values.master.persistence.enabled .Values.master.podSecurityContext.enabled .Values.master.containerSecurityContext.enabled }} + {{- if or .Values.master.initContainers $needsVolumePermissions .Values.sysctl.enabled }} + initContainers: + {{- if .Values.master.initContainers }} + {{- include "common.tplvalues.render" (dict "value" .Values.master.initContainers "context" $) | nindent 8 }} + {{- end }} + {{- if $needsVolumePermissions }} + - name: volume-permissions + image: {{ include "redis.volumePermissions.image" . }} + imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }} + command: + - /bin/bash + - -ec + - | + {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} + chown -R `id -u`:`id -G | cut -d " " -f2` {{ .Values.master.persistence.path }} + {{- else }} + chown -R {{ .Values.master.containerSecurityContext.runAsUser }}:{{ .Values.master.podSecurityContext.fsGroup }} {{ .Values.master.persistence.path }} + {{- end }} + {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} + securityContext: {{- omit .Values.volumePermissions.containerSecurityContext "runAsUser" | toYaml | nindent 12 }} + {{- else }} + securityContext: {{- .Values.volumePermissions.containerSecurityContext | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.volumePermissions.resources }} + resources: {{- toYaml .Values.volumePermissions.resources | nindent 12 }} + {{- end }} + volumeMounts: + - name: redis-data + mountPath: {{ .Values.master.persistence.path }} + {{- if .Values.master.persistence.subPath }} + subPath: {{ .Values.master.persistence.subPath }} + {{- else if .Values.master.persistence.subPathExpr }} + subPathExpr: {{ .Values.master.persistence.subPathExpr }} + {{- end }} + {{- end }} + {{- if .Values.sysctl.enabled }} + - name: init-sysctl + image: {{ include "redis.sysctl.image" . }} + imagePullPolicy: {{ default "" .Values.sysctl.image.pullPolicy | quote }} + securityContext: + privileged: true + runAsUser: 0 + {{- if .Values.sysctl.command }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.sysctl.command "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.sysctl.resources }} + resources: {{- toYaml .Values.sysctl.resources | nindent 12 }} + {{- end }} + {{- if .Values.sysctl.mountHostSys }} + volumeMounts: + - name: host-sys + mountPath: /host-sys + {{- end }} + {{- end }} + {{- end }} + volumes: + - name: start-scripts + configMap: + name: {{ printf "%s-scripts" (include "common.names.fullname" .) }} + defaultMode: 0755 + - name: health + configMap: + name: {{ printf "%s-health" (include "common.names.fullname" .) }} + defaultMode: 0755 + {{- if .Values.auth.usePasswordFiles }} + - name: redis-password + secret: + secretName: {{ template "redis.secretName" . }} + items: + - key: {{ template "redis.secretPasswordKey" . }} + path: redis-password + {{- end }} + - name: config + configMap: + name: {{ include "redis.configmapName" . }} + {{- if .Values.sysctl.mountHostSys }} + - name: host-sys + hostPath: + path: /sys + {{- end }} + - name: redis-tmp-conf + {{- if or .Values.master.persistence.medium .Values.master.persistence.sizeLimit }} + emptyDir: + {{- if .Values.master.persistence.medium }} + medium: {{ .Values.master.persistence.medium | quote }} + {{- end }} + {{- if .Values.master.persistence.sizeLimit }} + sizeLimit: {{ .Values.master.persistence.sizeLimit | quote }} + {{- end }} + {{- else }} + emptyDir: {} + {{- end }} + - name: tmp + {{- if or .Values.master.persistence.medium .Values.master.persistence.sizeLimit }} + emptyDir: + {{- if .Values.master.persistence.medium }} + medium: {{ .Values.master.persistence.medium | quote }} + {{- end }} + {{- if .Values.master.persistence.sizeLimit }} + sizeLimit: {{ .Values.master.persistence.sizeLimit | quote }} + {{- end }} + {{- else }} + emptyDir: {} + {{- end }} + {{- if .Values.tls.enabled }} + - name: redis-certificates + secret: + secretName: {{ include "redis.tlsSecretName" . }} + defaultMode: 256 + {{- end }} + {{- if .Values.master.extraVolumes }} + {{- include "common.tplvalues.render" ( dict "value" .Values.master.extraVolumes "context" $ ) | nindent 8 }} + {{- end }} + {{- if .Values.metrics.extraVolumes }} + {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.extraVolumes "context" $ ) | nindent 8 }} + {{- end }} + {{- if or (not .Values.master.persistence.enabled) (eq .Values.master.kind "DaemonSet") }} + - name: redis-data + {{- if or .Values.master.persistence.medium .Values.master.persistence.sizeLimit }} + emptyDir: + {{- if .Values.master.persistence.medium }} + medium: {{ .Values.master.persistence.medium | quote }} + {{- end }} + {{- if .Values.master.persistence.sizeLimit }} + sizeLimit: {{ .Values.master.persistence.sizeLimit | quote }} + {{- end }} + {{- else }} + emptyDir: {} + {{- end }} + {{- else if .Values.master.persistence.existingClaim }} + - name: redis-data + persistentVolumeClaim: + claimName: {{ printf "%s" (tpl .Values.master.persistence.existingClaim .) }} + {{- else if (eq .Values.master.kind "Deployment") }} + - name: redis-data + persistentVolumeClaim: + claimName: {{ printf "redis-data-%s-master" (include "common.names.fullname" .) }} + {{- else }} + {{- if .Values.master.persistentVolumeClaimRetentionPolicy.enabled }} + persistentVolumeClaimRetentionPolicy: + whenDeleted: {{ .Values.master.persistentVolumeClaimRetentionPolicy.whenDeleted }} + whenScaled: {{ .Values.master.persistentVolumeClaimRetentionPolicy.whenScaled }} + {{- end }} + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: redis-data + {{- $claimLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.master.persistence.labels .Values.commonLabels ) "context" . ) }} + labels: {{- include "common.labels.matchLabels" ( dict "customLabels" $claimLabels "context" $ ) | nindent 10 }} + app.kubernetes.io/component: master + {{- if .Values.master.persistence.annotations }} + annotations: {{- toYaml .Values.master.persistence.annotations | nindent 10 }} + {{- end }} + spec: + accessModes: + {{- range .Values.master.persistence.accessModes }} + - {{ . | quote }} + {{- end }} + resources: + requests: + storage: {{ .Values.master.persistence.size | quote }} + {{- if .Values.master.persistence.selector }} + selector: {{- include "common.tplvalues.render" (dict "value" .Values.master.persistence.selector "context" $) | nindent 10 }} + {{- end }} + {{- if .Values.master.persistence.dataSource }} + dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.master.persistence.dataSource "context" $) | nindent 10 }} + {{- end }} + {{- include "common.storage.class" (dict "persistence" .Values.master.persistence "global" .Values.global) | nindent 8 }} + {{- end }} +{{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/master/psp.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/master/psp.yaml new file mode 100644 index 000000000..5a47afbf7 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/master/psp.yaml @@ -0,0 +1,47 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and (include "common.capabilities.psp.supported" .) .Values.podSecurityPolicy.create }} +apiVersion: policy/v1beta1 +kind: PodSecurityPolicy +metadata: + name: {{ printf "%s-master" (include "common.names.fullname" .) }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + allowPrivilegeEscalation: false + fsGroup: + rule: 'MustRunAs' + ranges: + - min: {{ .Values.master.podSecurityContext.fsGroup }} + max: {{ .Values.master.podSecurityContext.fsGroup }} + hostIPC: false + hostNetwork: false + hostPID: false + privileged: false + readOnlyRootFilesystem: false + requiredDropCapabilities: + - ALL + runAsUser: + rule: 'MustRunAs' + ranges: + - min: {{ .Values.master.containerSecurityContext.runAsUser }} + max: {{ .Values.master.containerSecurityContext.runAsUser }} + seLinux: + rule: 'RunAsAny' + supplementalGroups: + rule: 'MustRunAs' + ranges: + - min: {{ .Values.master.containerSecurityContext.runAsUser }} + max: {{ .Values.master.containerSecurityContext.runAsUser }} + volumes: + - 'configMap' + - 'secret' + - 'emptyDir' + - 'persistentVolumeClaim' +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/master/pvc.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/master/pvc.yaml new file mode 100644 index 000000000..019f60d14 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/master/pvc.yaml @@ -0,0 +1,33 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and (eq .Values.architecture "standalone") (eq .Values.master.kind "Deployment") (.Values.master.persistence.enabled) (not .Values.master.persistence.existingClaim) }} +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: {{ printf "redis-data-%s-master" (include "common.names.fullname" .) }} + namespace: {{ include "common.names.namespace" . | quote }} + {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.master.persistence.labels .Values.commonLabels ) "context" . ) }} + labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: master + {{- if .Values.master.persistence.annotations }} + annotations: {{- toYaml .Values.master.persistence.annotations | nindent 4 }} + {{- end }} +spec: + accessModes: + {{- range .Values.master.persistence.accessModes }} + - {{ . | quote }} + {{- end }} + resources: + requests: + storage: {{ .Values.master.persistence.size | quote }} + {{- if .Values.master.persistence.selector }} + selector: {{- include "common.tplvalues.render" (dict "value" .Values.master.persistence.selector "context" $) | nindent 4 }} + {{- end }} + {{- if .Values.master.persistence.dataSource }} + dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.master.persistence.dataSource "context" $) | nindent 4 }} + {{- end }} + {{- include "common.storage.class" (dict "persistence" .Values.master.persistence "global" .Values.global) | nindent 2 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/master/service.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/master/service.yaml new file mode 100644 index 000000000..ba744dbce --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/master/service.yaml @@ -0,0 +1,62 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and (not .Values.sentinel.enabled) (gt (int64 .Values.master.count) 0) }} +apiVersion: v1 +kind: Service +metadata: + name: {{ printf "%s-master" (include "common.names.fullname" .) }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: master + {{- if or .Values.master.service.annotations .Values.commonAnnotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.master.service.annotations .Values.commonAnnotations ) "context" . ) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.master.service.type }} + {{- if or (eq .Values.master.service.type "LoadBalancer") (eq .Values.master.service.type "NodePort") }} + externalTrafficPolicy: {{ .Values.master.service.externalTrafficPolicy | quote }} + {{- end }} + {{- if (semverCompare ">=1.22-0" (include "common.capabilities.kubeVersion" .)) }} + internalTrafficPolicy: {{ .Values.master.service.internalTrafficPolicy }} + {{- end }} + {{- if and (eq .Values.master.service.type "LoadBalancer") (not (empty .Values.master.service.loadBalancerIP)) }} + loadBalancerIP: {{ .Values.master.service.loadBalancerIP }} + {{- end }} + {{- if and (eq .Values.master.service.type "LoadBalancer") .Values.master.service.loadBalancerClass }} + loadBalancerClass: {{ .Values.master.service.loadBalancerClass }} + {{- end }} + {{- if and (eq .Values.master.service.type "LoadBalancer") (not (empty .Values.master.service.loadBalancerSourceRanges)) }} + loadBalancerSourceRanges: {{ toYaml .Values.master.service.loadBalancerSourceRanges | nindent 4 }} + {{- end }} + {{- if and .Values.master.service.clusterIP (eq .Values.master.service.type "ClusterIP") }} + clusterIP: {{ .Values.master.service.clusterIP }} + {{- end }} + {{- if .Values.master.service.sessionAffinity }} + sessionAffinity: {{ .Values.master.service.sessionAffinity }} + {{- end }} + {{- if .Values.master.service.sessionAffinityConfig }} + sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.master.service.sessionAffinityConfig "context" $) | nindent 4 }} + {{- end }} + {{- if .Values.master.service.externalIPs }} + externalIPs: {{- include "common.tplvalues.render" (dict "value" .Values.master.service.externalIPs "context" $) | nindent 4 }} + {{- end }} + ports: + - name: tcp-redis + port: {{ .Values.master.service.ports.redis }} + targetPort: redis + {{- if and (or (eq .Values.master.service.type "NodePort") (eq .Values.master.service.type "LoadBalancer")) .Values.master.service.nodePorts.redis}} + nodePort: {{ .Values.master.service.nodePorts.redis}} + {{- else if eq .Values.master.service.type "ClusterIP" }} + nodePort: null + {{- end }} + {{- if .Values.master.service.extraPorts }} + {{- include "common.tplvalues.render" (dict "value" .Values.master.service.extraPorts "context" $) | nindent 4 }} + {{- end }} + {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.master.podLabels .Values.commonLabels ) "context" . ) }} + selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: master +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/master/serviceaccount.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/master/serviceaccount.yaml new file mode 100644 index 000000000..d442051de --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/master/serviceaccount.yaml @@ -0,0 +1,18 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.master.serviceAccount.create (or (not (eq .Values.architecture "replication")) (not .Values.sentinel.enabled)) }} +apiVersion: v1 +kind: ServiceAccount +automountServiceAccountToken: {{ .Values.master.serviceAccount.automountServiceAccountToken }} +metadata: + name: {{ template "redis.masterServiceAccountName" . }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if or .Values.master.serviceAccount.annotations .Values.commonAnnotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.master.serviceAccount.annotations .Values.commonAnnotations ) "context" . ) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/metrics-svc.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/metrics-svc.yaml new file mode 100644 index 000000000..5e24b6d35 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/metrics-svc.yaml @@ -0,0 +1,44 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if .Values.metrics.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ printf "%s-metrics" (include "common.names.fullname" .) }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: metrics + {{- if or .Values.metrics.service.annotations .Values.commonAnnotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.metrics.service.annotations .Values.commonAnnotations ) "context" . ) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.metrics.service.type }} + {{- if and .Values.metrics.service.clusterIP (eq .Values.metrics.service.type "ClusterIP") }} + clusterIP: {{ .Values.metrics.service.clusterIP }} + {{- end }} + {{- if eq .Values.metrics.service.type "LoadBalancer" }} + externalTrafficPolicy: {{ .Values.metrics.service.externalTrafficPolicy }} + {{- end }} + {{- if and (eq .Values.metrics.service.type "LoadBalancer") .Values.metrics.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.metrics.service.loadBalancerIP }} + {{- end }} + {{- if and (eq .Values.metrics.service.type "LoadBalancer") .Values.metrics.service.loadBalancerClass }} + loadBalancerClass: {{ .Values.metrics.service.loadBalancerClass }} + {{- end }} + {{- if and (eq .Values.metrics.service.type "LoadBalancer") .Values.metrics.service.loadBalancerSourceRanges }} + loadBalancerSourceRanges: {{- toYaml .Values.metrics.service.loadBalancerSourceRanges | nindent 4 }} + {{- end }} + ports: + - name: http-metrics + port: {{ .Values.metrics.service.port }} + protocol: TCP + targetPort: metrics + {{- if .Values.metrics.service.extraPorts }} + {{- include "common.tplvalues.render" (dict "value" .Values.metrics.service.extraPorts "context" $) | nindent 4 }} + {{- end }} + selector: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/networkpolicy.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/networkpolicy.yaml new file mode 100644 index 000000000..84f5ada5d --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/networkpolicy.yaml @@ -0,0 +1,105 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if .Values.networkPolicy.enabled }} +kind: NetworkPolicy +apiVersion: {{ template "networkPolicy.apiVersion" . }} +metadata: + name: {{ template "common.names.fullname" . }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + podSelector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 6 }} + policyTypes: + - Ingress + {{- if or (eq .Values.architecture "replication") .Values.networkPolicy.extraEgress }} + - Egress + egress: + {{- if eq .Values.architecture "replication" }} + # Allow dns resolution + - ports: + - port: 53 + protocol: UDP + # Allow outbound connections to other cluster pods + - ports: + - port: {{ .Values.master.containerPorts.redis }} + {{- if .Values.sentinel.enabled }} + - port: {{ .Values.sentinel.containerPorts.sentinel }} + {{- end }} + to: + - podSelector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 14 }} + {{- end }} + {{- if .Values.networkPolicy.extraEgress }} + {{- include "common.tplvalues.render" ( dict "value" .Values.networkPolicy.extraEgress "context" $ ) | nindent 4 }} + {{- end }} + {{- end }} + ingress: + # Allow inbound connections + - ports: + - port: {{ .Values.master.containerPorts.redis }} + {{- if .Values.sentinel.enabled }} + - port: {{ .Values.sentinel.containerPorts.sentinel }} + {{- end }} + {{- if not .Values.networkPolicy.allowExternal }} + from: + - podSelector: + matchLabels: + {{ template "common.names.fullname" . }}-client: "true" + - podSelector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 14 }} + {{- if or .Values.networkPolicy.ingressNSMatchLabels .Values.networkPolicy.ingressNSPodMatchLabels }} + - namespaceSelector: + matchLabels: + {{- if .Values.networkPolicy.ingressNSMatchLabels }} + {{- range $key, $value := .Values.networkPolicy.ingressNSMatchLabels }} + {{ $key | quote }}: {{ $value | quote }} + {{- end }} + {{ else }} + {} + {{- end }} + {{- if .Values.networkPolicy.ingressNSPodMatchLabels }} + podSelector: + matchLabels: + {{- range $key, $value := .Values.networkPolicy.ingressNSPodMatchLabels }} + {{ $key | quote }}: {{ $value | quote }} + {{- end }} + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.metrics.enabled }} + # Allow prometheus scrapes for metrics + - ports: + - port: 9121 + {{- if not .Values.networkPolicy.metrics.allowExternal }} + from: + {{- if or .Values.networkPolicy.metrics.ingressNSMatchLabels .Values.networkPolicy.metrics.ingressNSPodMatchLabels }} + - namespaceSelector: + matchLabels: + {{- if .Values.networkPolicy.metrics.ingressNSMatchLabels }} + {{- range $key, $value := .Values.networkPolicy.metrics.ingressNSMatchLabels }} + {{ $key | quote }}: {{ $value | quote }} + {{- end }} + {{ else }} + {} + {{- end }} + {{- if .Values.networkPolicy.metrics.ingressNSPodMatchLabels }} + podSelector: + matchLabels: + {{- range $key, $value := .Values.networkPolicy.metrics.ingressNSPodMatchLabels }} + {{ $key | quote }}: {{ $value | quote }} + {{- end }} + {{- end }} + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.networkPolicy.extraIngress }} + {{- include "common.tplvalues.render" ( dict "value" .Values.networkPolicy.extraIngress "context" $ ) | nindent 4 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/pdb.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/pdb.yaml new file mode 100644 index 000000000..d2ca15d9d --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/pdb.yaml @@ -0,0 +1,25 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if .Values.pdb.create }} +apiVersion: {{ include "common.capabilities.policy.apiVersion" . }} +kind: PodDisruptionBudget +metadata: + name: {{ template "common.names.fullname" . }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + {{- if .Values.pdb.minAvailable }} + minAvailable: {{ .Values.pdb.minAvailable }} + {{- end }} + {{- if .Values.pdb.maxUnavailable }} + maxUnavailable: {{ .Values.pdb.maxUnavailable }} + {{- end }} + selector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 6 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/podmonitor.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/podmonitor.yaml new file mode 100644 index 000000000..c808aefeb --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/podmonitor.yaml @@ -0,0 +1,69 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.metrics.enabled .Values.metrics.podMonitor.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + name: {{ template "common.names.fullname" . }} + namespace: {{ default (include "common.names.namespace" .) .Values.metrics.podMonitor.namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.metrics.podMonitor.additionalLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.metrics.podMonitor.additionalLabels "context" $) | nindent 4 }} + {{- end }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + podMetricsEndpoints: + - port: http-metrics + {{- if .Values.metrics.podMonitor.interval }} + interval: {{ .Values.metrics.podMonitor.interval }} + {{- end }} + {{- if .Values.metrics.podMonitor.scrapeTimeout }} + scrapeTimeout: {{ .Values.metrics.podMonitor.scrapeTimeout }} + {{- end }} + {{- if .Values.metrics.podMonitor.honorLabels }} + honorLabels: {{ .Values.metrics.podMonitor.honorLabels }} + {{- end }} + {{- if .Values.metrics.podMonitor.relabellings }} + relabelings: {{- toYaml .Values.metrics.podMonitor.relabellings | nindent 6 }} + {{- end }} + {{- if .Values.metrics.podMonitor.metricRelabelings }} + metricRelabelings: {{- toYaml .Values.metrics.podMonitor.metricRelabelings | nindent 6 }} + {{- end }} + {{- range .Values.metrics.podMonitor.additionalEndpoints }} + - port: {{ .port }} + {{- if .interval }} + interval: {{ .interval }} + {{- end }} + {{- if .path }} + path: {{ .path }} + {{- end }} + {{- if .params }} + params: + {{- range $key, $value := .params }} + {{ $key }}: + {{- range $value }} + - {{ . | quote }} + {{- end }} + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.metrics.serviceMonitor.podTargetLabels }} + podTargetLabels: {{- toYaml .Values.metrics.podMonitor.podTargetLabels | nindent 4 }} + {{- end }} + {{- with .Values.metrics.podMonitor.sampleLimit -}} + sampleLimit: {{ . }} + {{- end }} + {{- with .Values.metrics.podMonitor.targetLimit -}} + targetLimit: {{ . }} + {{- end }} + namespaceSelector: + matchNames: + - {{ include "common.names.namespace" . | quote }} + selector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 6 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/prometheusrule.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/prometheusrule.yaml new file mode 100644 index 000000000..3406918b3 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/prometheusrule.yaml @@ -0,0 +1,23 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.metrics.enabled .Values.metrics.prometheusRule.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: PrometheusRule +metadata: + name: {{ template "common.names.fullname" . }} + namespace: {{ default (include "common.names.namespace" .) .Values.metrics.prometheusRule.namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.metrics.prometheusRule.additionalLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.metrics.prometheusRule.additionalLabels "context" $) | nindent 4 }} + {{- end }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + groups: + - name: {{ include "common.names.fullname" . }} + rules: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.prometheusRule.rules "context" $ ) | nindent 8 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/replicas/application.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/replicas/application.yaml new file mode 100644 index 000000000..aeb193ae1 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/replicas/application.yaml @@ -0,0 +1,533 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and (eq .Values.architecture "replication") (not .Values.sentinel.enabled) }} +apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }} +kind: {{ .Values.replica.kind }} +metadata: + name: {{ printf "%s-replicas" (include "common.names.fullname" .) }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: replica + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + {{- if and (not (eq .Values.replica.kind "DaemonSet")) (not .Values.replica.autoscaling.enabled) }} + replicas: {{ .Values.replica.replicaCount }} + {{- end }} + {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.replica.podLabels .Values.commonLabels ) "context" . ) }} + selector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }} + app.kubernetes.io/component: replica + {{- if (eq .Values.replica.kind "StatefulSet") }} + serviceName: {{ printf "%s-headless" (include "common.names.fullname" .) }} + {{- end }} + {{- if .Values.replica.updateStrategy }} + updateStrategy: {{- toYaml .Values.replica.updateStrategy | nindent 4 }} + {{- end }} + {{- if and .Values.replica.minReadySeconds (semverCompare ">= 1.23-0" (include "common.capabilities.kubeVersion" .)) }} + minReadySeconds: {{ .Values.replica.minReadySeconds }} + {{- end }} + {{- if .Values.replica.podManagementPolicy }} + podManagementPolicy: {{ .Values.replica.podManagementPolicy | quote }} + {{- end }} + template: + metadata: + labels: {{- include "common.labels.standard" ( dict "customLabels" $podLabels "context" $ ) | nindent 8 }} + app.kubernetes.io/component: replica + {{- if and .Values.metrics.enabled .Values.metrics.podLabels }} + {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.podLabels "context" $ ) | nindent 8 }} + {{- end }} + annotations: + {{- if (include "redis.createConfigmap" .) }} + checksum/configmap: {{ pick ( include (print $.Template.BasePath "/configmap.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} + {{- end }} + checksum/health: {{ pick ( include (print $.Template.BasePath "/health-configmap.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} + checksum/scripts: {{ pick ( include (print $.Template.BasePath "/scripts-configmap.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} + checksum/secret: {{ pick ( include (print $.Template.BasePath "/secret.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} + {{- if .Values.replica.podAnnotations }} + {{- include "common.tplvalues.render" ( dict "value" .Values.replica.podAnnotations "context" $ ) | nindent 8 }} + {{- end }} + {{- if and .Values.metrics.enabled .Values.metrics.podAnnotations }} + {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.podAnnotations "context" $ ) | nindent 8 }} + {{- end }} + spec: + {{- include "redis.imagePullSecrets" . | nindent 6 }} + {{- if .Values.replica.hostAliases }} + hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.replica.hostAliases "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.replica.podSecurityContext.enabled }} + securityContext: {{- omit .Values.replica.podSecurityContext "enabled" | toYaml | nindent 8 }} + {{- end }} + serviceAccountName: {{ template "redis.replicaServiceAccountName" . }} + automountServiceAccountToken: {{ .Values.replica.automountServiceAccountToken }} + {{- if .Values.replica.priorityClassName }} + priorityClassName: {{ .Values.replica.priorityClassName | quote }} + {{- end }} + {{- if .Values.replica.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.replica.affinity "context" $) | nindent 8 }} + {{- else }} + affinity: + podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.replica.podAffinityPreset "component" "replica" "customLabels" $podLabels "context" $) | nindent 10 }} + podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.replica.podAntiAffinityPreset "component" "replica" "customLabels" $podLabels "context" $) | nindent 10 }} + nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.replica.nodeAffinityPreset.type "key" .Values.replica.nodeAffinityPreset.key "values" .Values.replica.nodeAffinityPreset.values) | nindent 10 }} + {{- end }} + {{- if .Values.replica.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.replica.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.replica.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.replica.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.replica.topologySpreadConstraints }} + topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.replica.topologySpreadConstraints "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.replica.shareProcessNamespace }} + shareProcessNamespace: {{ .Values.replica.shareProcessNamespace }} + {{- end }} + {{- if .Values.replica.schedulerName }} + schedulerName: {{ .Values.replica.schedulerName | quote }} + {{- end }} + {{- if .Values.replica.dnsPolicy }} + dnsPolicy: {{ .Values.replica.dnsPolicy }} + {{- end }} + {{- if .Values.replica.dnsConfig }} + dnsConfig: {{- include "common.tplvalues.render" (dict "value" .Values.replica.dnsConfig "context" $) | nindent 8 }} + {{- end }} + enableServiceLinks: {{ .Values.replica.enableServiceLinks }} + terminationGracePeriodSeconds: {{ .Values.replica.terminationGracePeriodSeconds }} + containers: + - name: redis + image: {{ template "redis.image" . }} + imagePullPolicy: {{ .Values.image.pullPolicy | quote }} + {{- if not .Values.diagnosticMode.enabled }} + {{- if .Values.replica.lifecycleHooks }} + lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.replica.lifecycleHooks "context" $) | nindent 12 }} + {{- end }} + {{- end }} + {{- if .Values.replica.containerSecurityContext.enabled }} + securityContext: {{- omit .Values.replica.containerSecurityContext "enabled" | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} + {{- else if .Values.replica.command }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.replica.command "context" $) | nindent 12 }} + {{- else }} + command: + - /bin/bash + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} + {{- else if .Values.replica.args }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.replica.args "context" $) | nindent 12 }} + {{- else }} + args: + - -c + - /opt/bitnami/scripts/start-scripts/start-replica.sh + {{- end }} + env: + - name: BITNAMI_DEBUG + value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }} + - name: REDIS_REPLICATION_MODE + value: replica + - name: REDIS_MASTER_HOST + {{- if .Values.replica.externalMaster.enabled }} + value: {{ .Values.replica.externalMaster.host | quote }} + {{- else if and (eq (int64 .Values.master.count) 1) (eq .Values.master.kind "StatefulSet") }} + value: {{ template "common.names.fullname" . }}-master-0.{{ template "common.names.fullname" . }}-headless.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }} + {{- else }} + value: {{ template "common.names.fullname" . }}-master.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }} + {{- end }} + - name: REDIS_MASTER_PORT_NUMBER + {{- if .Values.replica.externalMaster.enabled }} + value: {{ .Values.replica.externalMaster.port | quote }} + {{- else }} + value: {{ .Values.master.containerPorts.redis | quote }} + {{- end }} + - name: ALLOW_EMPTY_PASSWORD + value: {{ ternary "no" "yes" .Values.auth.enabled | quote }} + {{- if .Values.auth.enabled }} + {{- if .Values.auth.usePasswordFiles }} + - name: REDIS_PASSWORD_FILE + value: "/opt/bitnami/redis/secrets/redis-password" + - name: REDIS_MASTER_PASSWORD_FILE + value: "/opt/bitnami/redis/secrets/redis-password" + {{- else }} + - name: REDIS_PASSWORD + valueFrom: + secretKeyRef: + name: {{ template "redis.secretName" . }} + key: {{ template "redis.secretPasswordKey" . }} + - name: REDIS_MASTER_PASSWORD + valueFrom: + secretKeyRef: + name: {{ template "redis.secretName" . }} + key: {{ template "redis.secretPasswordKey" . }} + {{- end }} + {{- end }} + - name: REDIS_TLS_ENABLED + value: {{ ternary "yes" "no" .Values.tls.enabled | quote }} + {{- if .Values.tls.enabled }} + - name: REDIS_TLS_PORT + value: {{ .Values.replica.containerPorts.redis | quote }} + - name: REDIS_TLS_AUTH_CLIENTS + value: {{ ternary "yes" "no" .Values.tls.authClients | quote }} + - name: REDIS_TLS_CERT_FILE + value: {{ template "redis.tlsCert" . }} + - name: REDIS_TLS_KEY_FILE + value: {{ template "redis.tlsCertKey" . }} + - name: REDIS_TLS_CA_FILE + value: {{ template "redis.tlsCACert" . }} + {{- if .Values.tls.dhParamsFilename }} + - name: REDIS_TLS_DH_PARAMS_FILE + value: {{ template "redis.tlsDHParams" . }} + {{- end }} + {{- else }} + - name: REDIS_PORT + value: {{ .Values.replica.containerPorts.redis | quote }} + {{- end }} + {{- if .Values.replica.extraEnvVars }} + {{- include "common.tplvalues.render" (dict "value" .Values.replica.extraEnvVars "context" $) | nindent 12 }} + {{- end }} + {{- if or .Values.replica.extraEnvVarsCM .Values.replica.extraEnvVarsSecret }} + envFrom: + {{- if .Values.replica.extraEnvVarsCM }} + - configMapRef: + name: {{ .Values.replica.extraEnvVarsCM }} + {{- end }} + {{- if .Values.replica.extraEnvVarsSecret }} + - secretRef: + name: {{ .Values.replica.extraEnvVarsSecret }} + {{- end }} + {{- end }} + ports: + - name: redis + containerPort: {{ .Values.replica.containerPorts.redis }} + {{- if not .Values.diagnosticMode.enabled }} + {{- if .Values.replica.customStartupProbe }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.replica.customStartupProbe "context" $) | nindent 12 }} + {{- else if .Values.replica.startupProbe.enabled }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.replica.startupProbe "enabled") "context" $) | nindent 12 }} + tcpSocket: + port: redis + {{- end }} + {{- if .Values.replica.customLivenessProbe }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.replica.customLivenessProbe "context" $) | nindent 12 }} + {{- else if .Values.replica.livenessProbe.enabled }} + livenessProbe: + initialDelaySeconds: {{ .Values.replica.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.replica.livenessProbe.periodSeconds }} + timeoutSeconds: {{ add1 .Values.replica.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.replica.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.replica.livenessProbe.failureThreshold }} + exec: + command: + - sh + - -c + - /health/ping_liveness_local_and_master.sh {{ .Values.replica.livenessProbe.timeoutSeconds }} + {{- end }} + {{- if .Values.replica.customReadinessProbe }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.replica.customReadinessProbe "context" $) | nindent 12 }} + {{- else if .Values.replica.readinessProbe.enabled }} + readinessProbe: + initialDelaySeconds: {{ .Values.replica.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.replica.readinessProbe.periodSeconds }} + timeoutSeconds: {{ add1 .Values.replica.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.replica.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.replica.readinessProbe.failureThreshold }} + exec: + command: + - sh + - -c + - /health/ping_readiness_local_and_master.sh {{ .Values.replica.readinessProbe.timeoutSeconds }} + {{- end }} + {{- end }} + {{- if .Values.replica.resources }} + resources: {{- toYaml .Values.replica.resources | nindent 12 }} + {{- end }} + volumeMounts: + - name: start-scripts + mountPath: /opt/bitnami/scripts/start-scripts + - name: health + mountPath: /health + {{- if .Values.auth.usePasswordFiles }} + - name: redis-password + mountPath: /opt/bitnami/redis/secrets/ + {{- end }} + - name: redis-data + mountPath: /data + {{- if .Values.replica.persistence.subPath }} + subPath: {{ .Values.replica.persistence.subPath }} + {{- else if .Values.replica.persistence.subPathExpr }} + subPathExpr: {{ .Values.replica.persistence.subPathExpr }} + {{- end }} + - name: config + mountPath: /opt/bitnami/redis/mounted-etc + - name: redis-tmp-conf + mountPath: /opt/bitnami/redis/etc + {{- if .Values.tls.enabled }} + - name: redis-certificates + mountPath: /opt/bitnami/redis/certs + readOnly: true + {{- end }} + {{- if .Values.replica.extraVolumeMounts }} + {{- include "common.tplvalues.render" ( dict "value" .Values.replica.extraVolumeMounts "context" $ ) | nindent 12 }} + {{- end }} + {{- if .Values.metrics.enabled }} + - name: metrics + image: {{ include "redis.metrics.image" . }} + imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }} + {{- if .Values.metrics.containerSecurityContext.enabled }} + securityContext: {{- omit .Values.metrics.containerSecurityContext "enabled" | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} + {{- else if .Values.metrics.command }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.command "context" $) | nindent 12 }} + {{- else }} + command: + - /bin/bash + - -c + - | + if [[ -f '/secrets/redis-password' ]]; then + export REDIS_PASSWORD=$(cat /secrets/redis-password) + fi + redis_exporter{{- range $key, $value := .Values.metrics.extraArgs }} --{{ $key }}={{ $value }}{{- end }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} + {{- end }} + env: + - name: REDIS_ALIAS + value: {{ template "common.names.fullname" . }} + {{- if .Values.auth.enabled }} + - name: REDIS_USER + value: default + {{- if (not .Values.auth.usePasswordFiles) }} + - name: REDIS_PASSWORD + valueFrom: + secretKeyRef: + name: {{ template "redis.secretName" . }} + key: {{ template "redis.secretPasswordKey" . }} + {{- end }} + {{- end }} + {{- if .Values.tls.enabled }} + - name: REDIS_ADDR + value: rediss://{{ .Values.metrics.redisTargetHost }}:{{ .Values.replica.containerPorts.redis }} + {{- if .Values.tls.authClients }} + - name: REDIS_EXPORTER_TLS_CLIENT_KEY_FILE + value: {{ template "redis.tlsCertKey" . }} + - name: REDIS_EXPORTER_TLS_CLIENT_CERT_FILE + value: {{ template "redis.tlsCert" . }} + {{- end }} + - name: REDIS_EXPORTER_TLS_CA_CERT_FILE + value: {{ template "redis.tlsCACert" . }} + {{- end }} + {{- if .Values.metrics.extraEnvVars }} + {{- include "common.tplvalues.render" (dict "value" .Values.metrics.extraEnvVars "context" $) | nindent 12 }} + {{- end }} + ports: + - name: metrics + containerPort: 9121 + {{- if not .Values.diagnosticMode.enabled }} + {{- if .Values.metrics.customStartupProbe }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customStartupProbe "context" $) | nindent 12 }} + {{- else if .Values.metrics.startupProbe.enabled }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.startupProbe "enabled") "context" $) | nindent 12 }} + tcpSocket: + port: metrics + {{- end }} + {{- if .Values.metrics.customLivenessProbe }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customLivenessProbe "context" $) | nindent 12 }} + {{- else if .Values.metrics.livenessProbe.enabled }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.livenessProbe "enabled") "context" $) | nindent 12 }} + tcpSocket: + port: metrics + {{- end }} + {{- if .Values.metrics.customReadinessProbe }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customReadinessProbe "context" $) | nindent 12 }} + {{- else if .Values.metrics.readinessProbe.enabled }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.readinessProbe "enabled") "context" $) | nindent 12 }} + httpGet: + path: / + port: metrics + {{- end }} + {{- end }} + {{- if .Values.metrics.resources }} + resources: {{- toYaml .Values.metrics.resources | nindent 12 }} + {{- end }} + volumeMounts: + {{- if .Values.auth.usePasswordFiles }} + - name: redis-password + mountPath: /secrets/ + {{- end }} + {{- if .Values.tls.enabled }} + - name: redis-certificates + mountPath: /opt/bitnami/redis/certs + readOnly: true + {{- end }} + {{- if .Values.metrics.extraVolumeMounts }} + {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.extraVolumeMounts "context" $ ) | nindent 12 }} + {{- end }} + {{- end }} + {{- if .Values.replica.sidecars }} + {{- include "common.tplvalues.render" (dict "value" .Values.replica.sidecars "context" $) | nindent 8 }} + {{- end }} + {{- $needsVolumePermissions := and .Values.volumePermissions.enabled .Values.replica.persistence.enabled .Values.replica.podSecurityContext.enabled .Values.replica.containerSecurityContext.enabled }} + {{- if or .Values.replica.initContainers $needsVolumePermissions .Values.sysctl.enabled }} + initContainers: + {{- if .Values.replica.initContainers }} + {{- include "common.tplvalues.render" (dict "value" .Values.replica.initContainers "context" $) | nindent 8 }} + {{- end }} + {{- if $needsVolumePermissions }} + - name: volume-permissions + image: {{ include "redis.volumePermissions.image" . }} + imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }} + command: + - /bin/bash + - -ec + - | + {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} + chown -R `id -u`:`id -G | cut -d " " -f2` {{ .Values.replica.persistence.path }} + {{- else }} + chown -R {{ .Values.replica.containerSecurityContext.runAsUser }}:{{ .Values.replica.podSecurityContext.fsGroup }} {{ .Values.replica.persistence.path }} + {{- end }} + {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} + securityContext: {{- omit .Values.volumePermissions.containerSecurityContext "runAsUser" | toYaml | nindent 12 }} + {{- else }} + securityContext: {{- .Values.volumePermissions.containerSecurityContext | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.volumePermissions.resources }} + resources: {{- toYaml .Values.volumePermissions.resources | nindent 12 }} + {{- end }} + volumeMounts: + - name: redis-data + mountPath: {{ .Values.replica.persistence.path }} + {{- if .Values.replica.persistence.subPath }} + subPath: {{ .Values.replica.persistence.subPath }} + {{- else if .Values.replica.persistence.subPathExpr }} + subPathExpr: {{ .Values.replica.persistence.subPathExpr }} + {{- end }} + {{- end }} + {{- if .Values.sysctl.enabled }} + - name: init-sysctl + image: {{ include "redis.sysctl.image" . }} + imagePullPolicy: {{ default "" .Values.sysctl.image.pullPolicy | quote }} + securityContext: + privileged: true + runAsUser: 0 + {{- if .Values.sysctl.command }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.sysctl.command "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.sysctl.resources }} + resources: {{- toYaml .Values.sysctl.resources | nindent 12 }} + {{- end }} + {{- if .Values.sysctl.mountHostSys }} + volumeMounts: + - name: host-sys + mountPath: /host-sys + {{- end }} + {{- end }} + {{- end }} + volumes: + - name: start-scripts + configMap: + name: {{ printf "%s-scripts" (include "common.names.fullname" .) }} + defaultMode: 0755 + - name: health + configMap: + name: {{ printf "%s-health" (include "common.names.fullname" .) }} + defaultMode: 0755 + {{- if .Values.auth.usePasswordFiles }} + - name: redis-password + secret: + secretName: {{ template "redis.secretName" . }} + items: + - key: {{ template "redis.secretPasswordKey" . }} + path: redis-password + {{- end }} + - name: config + configMap: + name: {{ include "redis.configmapName" . }} + {{- if .Values.sysctl.mountHostSys }} + - name: host-sys + hostPath: + path: /sys + {{- end }} + - name: redis-tmp-conf + {{- if or .Values.replica.persistence.medium .Values.replica.persistence.sizeLimit }} + emptyDir: + {{- if .Values.replica.persistence.medium }} + medium: {{ .Values.replica.persistence.medium | quote }} + {{- end }} + {{- if .Values.replica.persistence.sizeLimit }} + sizeLimit: {{ .Values.replica.persistence.sizeLimit | quote }} + {{- end }} + {{- else }} + emptyDir: {} + {{- end }} + {{- if .Values.tls.enabled }} + - name: redis-certificates + secret: + secretName: {{ include "redis.tlsSecretName" . }} + defaultMode: 256 + {{- end }} + {{- if .Values.replica.extraVolumes }} + {{- include "common.tplvalues.render" ( dict "value" .Values.replica.extraVolumes "context" $ ) | nindent 8 }} + {{- end }} + {{- if .Values.metrics.extraVolumes }} + {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.extraVolumes "context" $ ) | nindent 8 }} + {{- end }} + {{- if or (not .Values.replica.persistence.enabled) (not (eq .Values.replica.kind "StatefulSet")) }} + - name: redis-data + {{- if or .Values.replica.persistence.medium .Values.replica.persistence.sizeLimit }} + emptyDir: + {{- if .Values.replica.persistence.medium }} + medium: {{ .Values.replica.persistence.medium | quote }} + {{- end }} + {{- if .Values.replica.persistence.sizeLimit }} + sizeLimit: {{ .Values.replica.persistence.sizeLimit | quote }} + {{- end }} + {{- else }} + emptyDir: {} + {{- end }} + {{- else if .Values.replica.persistence.existingClaim }} + - name: redis-data + persistentVolumeClaim: + claimName: {{ printf "%s" (tpl .Values.replica.persistence.existingClaim .) }} + {{- else }} + {{- if .Values.replica.persistentVolumeClaimRetentionPolicy.enabled }} + persistentVolumeClaimRetentionPolicy: + whenDeleted: {{ .Values.replica.persistentVolumeClaimRetentionPolicy.whenDeleted }} + whenScaled: {{ .Values.replica.persistentVolumeClaimRetentionPolicy.whenScaled }} + {{- end }} + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: redis-data + {{- $claimLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.master.persistence.labels .Values.commonLabels ) "context" . ) }} + labels: {{- include "common.labels.matchLabels" ( dict "customLabels" $claimLabels "context" $ ) | nindent 10 }} + app.kubernetes.io/component: replica + {{- if .Values.replica.persistence.annotations }} + annotations: {{- toYaml .Values.replica.persistence.annotations | nindent 10 }} + {{- end }} + spec: + accessModes: + {{- range .Values.replica.persistence.accessModes }} + - {{ . | quote }} + {{- end }} + resources: + requests: + storage: {{ .Values.replica.persistence.size | quote }} + {{- if .Values.replica.persistence.selector }} + selector: {{- include "common.tplvalues.render" (dict "value" .Values.replica.persistence.selector "context" $) | nindent 10 }} + {{- end }} + {{- if .Values.replica.persistence.dataSource }} + dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.replica.persistence.dataSource "context" $) | nindent 10 }} + {{- end }} + {{- include "common.storage.class" (dict "persistence" .Values.replica.persistence "global" .Values.global) | nindent 8 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/replicas/hpa.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/replicas/hpa.yaml new file mode 100644 index 000000000..da69290a7 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/replicas/hpa.yaml @@ -0,0 +1,49 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.replica.autoscaling.enabled (not .Values.sentinel.enabled) }} +apiVersion: {{ include "common.capabilities.hpa.apiVersion" ( dict "context" $ ) }} +kind: HorizontalPodAutoscaler +metadata: + name: {{ printf "%s-replicas" (include "common.names.fullname" .) }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: replica + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + scaleTargetRef: + apiVersion: {{ include "common.capabilities.deployment.apiVersion" . }} + kind: StatefulSet + name: {{ printf "%s-replicas" (include "common.names.fullname" .) }} + minReplicas: {{ .Values.replica.autoscaling.minReplicas }} + maxReplicas: {{ .Values.replica.autoscaling.maxReplicas }} + metrics: + {{- if .Values.replica.autoscaling.targetCPU }} + - type: Resource + resource: + name: cpu + {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} + targetAverageUtilization: {{ .Values.replica.autoscaling.targetCPU }} + {{- else }} + target: + type: Utilization + averageUtilization: {{ .Values.replica.autoscaling.targetCPU }} + {{- end }} + {{- end }} + {{- if .Values.replica.autoscaling.targetMemory }} + - type: Resource + resource: + name: memory + {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} + targetAverageUtilization: {{ .Values.replica.autoscaling.targetMemory }} + {{- else }} + target: + type: Utilization + averageUtilization: {{ .Values.replica.autoscaling.targetMemory }} + {{- end }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/replicas/service.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/replicas/service.yaml new file mode 100644 index 000000000..b54b85a17 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/replicas/service.yaml @@ -0,0 +1,59 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and (eq .Values.architecture "replication") (not .Values.sentinel.enabled) }} +apiVersion: v1 +kind: Service +metadata: + name: {{ printf "%s-replicas" (include "common.names.fullname" .) }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: replica + {{- if or .Values.replica.service.annotations .Values.commonAnnotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.replica.service.annotations .Values.commonAnnotations ) "context" . ) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.replica.service.type }} + {{- if or (eq .Values.replica.service.type "LoadBalancer") (eq .Values.replica.service.type "NodePort") }} + externalTrafficPolicy: {{ .Values.replica.service.externalTrafficPolicy | quote }} + {{- end }} + {{- if (semverCompare ">=1.22-0" (include "common.capabilities.kubeVersion" .)) }} + internalTrafficPolicy: {{ .Values.replica.service.internalTrafficPolicy }} + {{- end }} + {{- if and (eq .Values.replica.service.type "LoadBalancer") (not (empty .Values.replica.service.loadBalancerIP)) }} + loadBalancerIP: {{ .Values.replica.service.loadBalancerIP }} + {{- end }} + {{- if and (eq .Values.replica.service.type "LoadBalancer") .Values.replica.service.loadBalancerClass }} + loadBalancerClass: {{ .Values.replica.service.loadBalancerClass }} + {{- end }} + {{- if and (eq .Values.replica.service.type "LoadBalancer") (not (empty .Values.replica.service.loadBalancerSourceRanges)) }} + loadBalancerSourceRanges: {{ toYaml .Values.replica.service.loadBalancerSourceRanges | nindent 4 }} + {{- end }} + {{- if and .Values.replica.service.clusterIP (eq .Values.replica.service.type "ClusterIP") }} + clusterIP: {{ .Values.replica.service.clusterIP }} + {{- end }} + {{- if .Values.replica.service.sessionAffinity }} + sessionAffinity: {{ .Values.replica.service.sessionAffinity }} + {{- end }} + {{- if .Values.replica.service.sessionAffinityConfig }} + sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.replica.service.sessionAffinityConfig "context" $) | nindent 4 }} + {{- end }} + ports: + - name: tcp-redis + port: {{ .Values.replica.service.ports.redis }} + targetPort: redis + {{- if and (or (eq .Values.replica.service.type "NodePort") (eq .Values.replica.service.type "LoadBalancer")) .Values.replica.service.nodePorts.redis}} + nodePort: {{ .Values.replica.service.nodePorts.redis}} + {{- else if eq .Values.replica.service.type "ClusterIP" }} + nodePort: null + {{- end }} + {{- if .Values.replica.service.extraPorts }} + {{- include "common.tplvalues.render" (dict "value" .Values.replica.service.extraPorts "context" $) | nindent 4 }} + {{- end }} + {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.replica.podLabels .Values.commonLabels ) "context" . ) }} + selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: replica +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/replicas/serviceaccount.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/replicas/serviceaccount.yaml new file mode 100644 index 000000000..d7f47f43d --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/replicas/serviceaccount.yaml @@ -0,0 +1,18 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.replica.serviceAccount.create (eq .Values.architecture "replication") (not .Values.sentinel.enabled) }} +apiVersion: v1 +kind: ServiceAccount +automountServiceAccountToken: {{ .Values.replica.serviceAccount.automountServiceAccountToken }} +metadata: + name: {{ template "redis.replicaServiceAccountName" . }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if or .Values.replica.serviceAccount.annotations .Values.commonAnnotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.replica.serviceAccount.annotations .Values.commonAnnotations ) "context" . ) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/role.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/role.yaml new file mode 100644 index 000000000..5bab3b7cc --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/role.yaml @@ -0,0 +1,29 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if .Values.rbac.create }} +apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }} +kind: Role +metadata: + name: {{ template "common.names.fullname" . }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +rules: + {{- if and (include "common.capabilities.psp.supported" .) .Values.podSecurityPolicy.enabled }} + - apiGroups: + - '{{ template "podSecurityPolicy.apiGroup" . }}' + resources: + - 'podsecuritypolicies' + verbs: + - 'use' + resourceNames: [{{ printf "%s-master" (include "common.names.fullname" .) }}] + {{- end }} + {{- if .Values.rbac.rules }} + {{- include "common.tplvalues.render" ( dict "value" .Values.rbac.rules "context" $ ) | nindent 2 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/rolebinding.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/rolebinding.yaml new file mode 100644 index 000000000..81c68f329 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/rolebinding.yaml @@ -0,0 +1,23 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if .Values.rbac.create }} +apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }} +kind: RoleBinding +metadata: + name: {{ template "common.names.fullname" . }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: {{ template "common.names.fullname" . }} +subjects: + - kind: ServiceAccount + name: {{ template "redis.serviceAccountName" . }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/scripts-configmap.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/scripts-configmap.yaml new file mode 100644 index 000000000..f785faf34 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/scripts-configmap.yaml @@ -0,0 +1,757 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ printf "%s-scripts" (include "common.names.fullname" .) }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +data: +{{- if and (eq .Values.architecture "replication") .Values.sentinel.enabled }} + start-node.sh: | + #!/bin/bash + + . /opt/bitnami/scripts/libos.sh + . /opt/bitnami/scripts/liblog.sh + . /opt/bitnami/scripts/libvalidations.sh + + get_port() { + hostname="$1" + type="$2" + + port_var=$(echo "${hostname^^}_SERVICE_PORT_$type" | sed "s/-/_/g") + port=${!port_var} + + if [ -z "$port" ]; then + case $type in + "SENTINEL") + echo {{ .Values.sentinel.containerPorts.sentinel }} + ;; + "REDIS") + echo {{ .Values.master.containerPorts.redis }} + ;; + esac + else + echo $port + fi + } + + get_full_hostname() { + hostname="$1" + + {{- if .Values.useExternalDNS.enabled }} + full_hostname="${hostname}.{{- include "redis.externalDNS.suffix" . }}" + {{- else if eq .Values.sentinel.service.type "NodePort" }} + full_hostname="${hostname}.{{- include "common.names.namespace" . }}" + {{- else }} + full_hostname="${hostname}.${HEADLESS_SERVICE}" + {{- end }} + + {{- if .Values.useHostnames }} + echo "${full_hostname}" + {{- else }} + retry_count=0 + until getent hosts "${full_hostname}" | awk '{ print $1; exit }' | grep .; do + if [[ $retry_count -lt {{ .Values.nameResolutionThreshold }} ]]; then + sleep {{ .Values.nameResolutionTimeout }} + else + error "IP address for ${full_hostname} not found" + exit 1 + fi + ((retry_count++)) + done + {{- end }} + } + + REDISPORT=$(get_port "$HOSTNAME" "REDIS") + + HEADLESS_SERVICE="{{ template "common.names.fullname" . }}-headless.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }}" + + if [ -n "$REDIS_EXTERNAL_MASTER_HOST" ]; then + REDIS_SERVICE="$REDIS_EXTERNAL_MASTER_HOST" + else + REDIS_SERVICE="{{ template "common.names.fullname" . }}.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }}" + fi + + SENTINEL_SERVICE_PORT=$(get_port "{{ include "common.names.fullname" . }}" "SENTINEL") + validate_quorum() { + if is_boolean_yes "$REDIS_TLS_ENABLED"; then + quorum_info_command="{{- if and .Values.auth.enabled .Values.auth.sentinel }}REDISCLI_AUTH="\$REDIS_PASSWORD" {{ end }}redis-cli -h $REDIS_SERVICE -p $SENTINEL_SERVICE_PORT --tls --cert ${REDIS_TLS_CERT_FILE} --key ${REDIS_TLS_KEY_FILE} --cacert ${REDIS_TLS_CA_FILE} sentinel master {{ .Values.sentinel.masterSet }}" + else + quorum_info_command="{{- if and .Values.auth.enabled .Values.auth.sentinel }}REDISCLI_AUTH="\$REDIS_PASSWORD" {{ end }}redis-cli -h $REDIS_SERVICE -p $SENTINEL_SERVICE_PORT sentinel master {{ .Values.sentinel.masterSet }}" + fi + info "about to run the command: $quorum_info_command" + eval $quorum_info_command | grep -Fq "s_down" + } + + trigger_manual_failover() { + if is_boolean_yes "$REDIS_TLS_ENABLED"; then + failover_command="{{- if and .Values.auth.enabled .Values.auth.sentinel }}REDISCLI_AUTH="\$REDIS_PASSWORD" {{ end }}redis-cli -h $REDIS_SERVICE -p $SENTINEL_SERVICE_PORT --tls --cert ${REDIS_TLS_CERT_FILE} --key ${REDIS_TLS_KEY_FILE} --cacert ${REDIS_TLS_CA_FILE} sentinel failover {{ .Values.sentinel.masterSet }}" + else + failover_command="{{- if and .Values.auth.enabled .Values.auth.sentinel }}REDISCLI_AUTH="\$REDIS_PASSWORD" {{ end }}redis-cli -h $REDIS_SERVICE -p $SENTINEL_SERVICE_PORT sentinel failover {{ .Values.sentinel.masterSet }}" + fi + + info "about to run the command: $failover_command" + eval $failover_command + } + + get_sentinel_master_info() { + if is_boolean_yes "$REDIS_TLS_ENABLED"; then + sentinel_info_command="{{- if and .Values.auth.enabled .Values.auth.sentinel }}REDISCLI_AUTH="\$REDIS_PASSWORD" {{ end }}timeout {{ .Values.sentinel.getMasterTimeout }} redis-cli -h $REDIS_SERVICE -p $SENTINEL_SERVICE_PORT --tls --cert ${REDIS_TLS_CERT_FILE} --key ${REDIS_TLS_KEY_FILE} --cacert ${REDIS_TLS_CA_FILE} sentinel get-master-addr-by-name {{ .Values.sentinel.masterSet }}" + else + sentinel_info_command="{{- if and .Values.auth.enabled .Values.auth.sentinel }}REDISCLI_AUTH="\$REDIS_PASSWORD" {{ end }}timeout {{ .Values.sentinel.getMasterTimeout }} redis-cli -h $REDIS_SERVICE -p $SENTINEL_SERVICE_PORT sentinel get-master-addr-by-name {{ .Values.sentinel.masterSet }}" + fi + + info "about to run the command: $sentinel_info_command" + retry_while "eval $sentinel_info_command" 2 5 + } + + {{- if and .Values.replica.containerSecurityContext.runAsUser (eq (.Values.replica.containerSecurityContext.runAsUser | int) 0) }} + useradd redis + chown -R redis {{ .Values.replica.persistence.path }} + {{- end }} + + [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")" + [[ -f $REDIS_MASTER_PASSWORD_FILE ]] && export REDIS_MASTER_PASSWORD="$(< "${REDIS_MASTER_PASSWORD_FILE}")" + + # check if there is a master + master_in_persisted_conf="$(get_full_hostname "$HOSTNAME")" + master_port_in_persisted_conf="$REDIS_MASTER_PORT_NUMBER" + master_in_sentinel="$(get_sentinel_master_info)" + redisRetVal=$? + + {{- if .Values.sentinel.persistence.enabled }} + if [[ -f /opt/bitnami/redis-sentinel/etc/sentinel.conf ]]; then + master_in_persisted_conf="$(awk '/monitor/ {print $4}' /opt/bitnami/redis-sentinel/etc/sentinel.conf)" + master_port_in_persisted_conf="$(awk '/monitor/ {print $5}' /opt/bitnami/redis-sentinel/etc/sentinel.conf)" + info "Found previous master ${master_in_persisted_conf}:${master_port_in_persisted_conf} in /opt/bitnami/redis-sentinel/etc/sentinel.conf" + debug "$(cat /opt/bitnami/redis-sentinel/etc/sentinel.conf | grep monitor)" + touch /opt/bitnami/redis-sentinel/etc/.node_read + fi + {{- end }} + + if [[ $redisRetVal -ne 0 ]]; then + if [[ "$master_in_persisted_conf" == "$(get_full_hostname "$HOSTNAME")" ]]; then + # Case 1: No active sentinel and in previous sentinel.conf we were the master --> MASTER + info "Configuring the node as master" + export REDIS_REPLICATION_MODE="master" + else + # Case 2: No active sentinel and in previous sentinel.conf we were not master --> REPLICA + info "Configuring the node as replica" + export REDIS_REPLICATION_MODE="replica" + REDIS_MASTER_HOST=${master_in_persisted_conf} + REDIS_MASTER_PORT_NUMBER=${master_port_in_persisted_conf} + fi + else + # Fetches current master's host and port + REDIS_SENTINEL_INFO=($(get_sentinel_master_info)) + info "Current master: REDIS_SENTINEL_INFO=(${REDIS_SENTINEL_INFO[0]},${REDIS_SENTINEL_INFO[1]})" + REDIS_MASTER_HOST=${REDIS_SENTINEL_INFO[0]} + REDIS_MASTER_PORT_NUMBER=${REDIS_SENTINEL_INFO[1]} + + if [[ "$REDIS_MASTER_HOST" == "$(get_full_hostname "$HOSTNAME")" ]]; then + # Case 3: Active sentinel and master it is this node --> MASTER + info "Configuring the node as master" + export REDIS_REPLICATION_MODE="master" + else + # Case 4: Active sentinel and master is not this node --> REPLICA + info "Configuring the node as replica" + export REDIS_REPLICATION_MODE="replica" + + {{- if and .Values.sentinel.automateClusterRecovery (le (int .Values.sentinel.downAfterMilliseconds) 2000) }} + retry_count=1 + while validate_quorum + do + info "sleeping, waiting for Redis master to come up" + sleep 1s + if ! ((retry_count % 11)); then + info "Trying to manually failover" + failover_result=$(trigger_manual_failover) + + debug "Failover result: $failover_result" + fi + + ((retry_count+=1)) + done + info "Redis master is up now" + {{- end }} + fi + fi + + if [[ -n "$REDIS_EXTERNAL_MASTER_HOST" ]]; then + REDIS_MASTER_HOST="$REDIS_EXTERNAL_MASTER_HOST" + REDIS_MASTER_PORT_NUMBER="${REDIS_EXTERNAL_MASTER_PORT}" + fi + + if [[ -f /opt/bitnami/redis/mounted-etc/replica.conf ]];then + cp /opt/bitnami/redis/mounted-etc/replica.conf /opt/bitnami/redis/etc/replica.conf + fi + + if [[ -f /opt/bitnami/redis/mounted-etc/redis.conf ]];then + cp /opt/bitnami/redis/mounted-etc/redis.conf /opt/bitnami/redis/etc/redis.conf + fi + + echo "" >> /opt/bitnami/redis/etc/replica.conf + echo "replica-announce-port $REDISPORT" >> /opt/bitnami/redis/etc/replica.conf + echo "replica-announce-ip $(get_full_hostname "$HOSTNAME")" >> /opt/bitnami/redis/etc/replica.conf + + {{- if .Values.tls.enabled }} + ARGS=("--port" "0") + ARGS+=("--tls-port" "${REDIS_TLS_PORT}") + ARGS+=("--tls-cert-file" "${REDIS_TLS_CERT_FILE}") + ARGS+=("--tls-key-file" "${REDIS_TLS_KEY_FILE}") + ARGS+=("--tls-ca-cert-file" "${REDIS_TLS_CA_FILE}") + ARGS+=("--tls-auth-clients" "${REDIS_TLS_AUTH_CLIENTS}") + ARGS+=("--tls-replication" "yes") + {{- if .Values.tls.dhParamsFilename }} + ARGS+=("--tls-dh-params-file" "${REDIS_TLS_DH_PARAMS_FILE}") + {{- end }} + {{- else }} + ARGS=("--port" "${REDIS_PORT}") + {{- end }} + + if [[ "$REDIS_REPLICATION_MODE" = "slave" ]] || [[ "$REDIS_REPLICATION_MODE" = "replica" ]]; then + ARGS+=("--replicaof" "${REDIS_MASTER_HOST}" "${REDIS_MASTER_PORT_NUMBER}") + fi + + {{- if .Values.auth.enabled }} + ARGS+=("--requirepass" "${REDIS_PASSWORD}") + ARGS+=("--masterauth" "${REDIS_MASTER_PASSWORD}") + {{- else }} + ARGS+=("--protected-mode" "no") + {{- end }} + ARGS+=("--include" "/opt/bitnami/redis/etc/replica.conf") + ARGS+=("--include" "/opt/bitnami/redis/etc/redis.conf") + {{- if .Values.replica.extraFlags }} + {{- range .Values.replica.extraFlags }} + ARGS+=({{ . | quote }}) + {{- end }} + {{- end }} + + {{- if .Values.replica.preExecCmds }} + {{- .Values.replica.preExecCmds | nindent 4 }} + {{- end }} + + {{- if .Values.replica.command }} + exec {{ .Values.replica.command }} "${ARGS[@]}" + {{- else }} + exec redis-server "${ARGS[@]}" + {{- end }} + + start-sentinel.sh: | + #!/bin/bash + + . /opt/bitnami/scripts/libos.sh + . /opt/bitnami/scripts/libvalidations.sh + . /opt/bitnami/scripts/libfile.sh + + HEADLESS_SERVICE="{{ template "common.names.fullname" . }}-headless.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }}" + REDIS_SERVICE="{{ template "common.names.fullname" . }}.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }}" + + get_port() { + hostname="$1" + type="$2" + + port_var=$(echo "${hostname^^}_SERVICE_PORT_$type" | sed "s/-/_/g") + port=${!port_var} + + if [ -z "$port" ]; then + case $type in + "SENTINEL") + echo {{ .Values.sentinel.containerPorts.sentinel }} + ;; + "REDIS") + echo {{ .Values.master.containerPorts.redis }} + ;; + esac + else + echo $port + fi + } + + get_full_hostname() { + hostname="$1" + + {{- if .Values.useExternalDNS.enabled }} + full_hostname="${hostname}.{{- include "redis.externalDNS.suffix" . }}" + {{- else if eq .Values.sentinel.service.type "NodePort" }} + full_hostname="${hostname}.{{- include "common.names.namespace" . }}" + {{- else }} + full_hostname="${hostname}.${HEADLESS_SERVICE}" + {{- end }} + + {{- if .Values.useHostnames }} + echo "${full_hostname}" + {{- else }} + retry_count=0 + until getent hosts "${full_hostname}" | awk '{ print $1; exit }' | grep .; do + if [[ $retry_count -lt {{ .Values.nameResolutionThreshold }} ]]; then + sleep {{ .Values.nameResolutionTimeout }} + else + error "IP address for ${full_hostname} not found" + exit 1 + fi + ((retry_count++)) + done + {{- end }} + } + + SERVPORT=$(get_port "$HOSTNAME" "SENTINEL") + REDISPORT=$(get_port "$HOSTNAME" "REDIS") + SENTINEL_SERVICE_PORT=$(get_port "{{ include "common.names.fullname" . }}" "SENTINEL") + + sentinel_conf_set() { + local -r key="${1:?missing key}" + local value="${2:-}" + + # Sanitize inputs + value="${value//\\/\\\\}" + value="${value//&/\\&}" + value="${value//\?/\\?}" + [[ "$value" = "" ]] && value="\"$value\"" + + replace_in_file "/opt/bitnami/redis-sentinel/etc/sentinel.conf" "^#*\s*${key} .*" "${key} ${value}" false + } + sentinel_conf_add() { + echo $'\n'"$@" >> "/opt/bitnami/redis-sentinel/etc/sentinel.conf" + } + host_id() { + echo "$1" | openssl sha1 | awk '{print $2}' + } + get_sentinel_master_info() { + if is_boolean_yes "$REDIS_SENTINEL_TLS_ENABLED"; then + sentinel_info_command="{{- if and .Values.auth.enabled .Values.auth.sentinel }}REDISCLI_AUTH="\$REDIS_PASSWORD" {{ end }}timeout {{ .Values.sentinel.getMasterTimeout }} redis-cli -h $REDIS_SERVICE -p $SENTINEL_SERVICE_PORT --tls --cert ${REDIS_SENTINEL_TLS_CERT_FILE} --key ${REDIS_SENTINEL_TLS_KEY_FILE} --cacert ${REDIS_SENTINEL_TLS_CA_FILE} sentinel get-master-addr-by-name {{ .Values.sentinel.masterSet }}" + else + sentinel_info_command="{{- if and .Values.auth.enabled .Values.auth.sentinel }}REDISCLI_AUTH="\$REDIS_PASSWORD" {{ end }}timeout {{ .Values.sentinel.getMasterTimeout }} redis-cli -h $REDIS_SERVICE -p $SENTINEL_SERVICE_PORT sentinel get-master-addr-by-name {{ .Values.sentinel.masterSet }}" + fi + info "about to run the command: $sentinel_info_command" + retry_while "eval $sentinel_info_command" 2 5 + } + + [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")" + + master_in_persisted_conf="$(get_full_hostname "$HOSTNAME")" + + {{- if .Values.sentinel.persistence.enabled }} + if [[ -f /opt/bitnami/redis-sentinel/etc/sentinel.conf ]]; then + check_lock_file() { + [[ -f /opt/bitnami/redis-sentinel/etc/.node_read ]] + } + retry_while "check_lock_file" + rm -f /opt/bitnami/redis-sentinel/etc/.node_read + master_in_persisted_conf="$(awk '/monitor/ {print $4}' /opt/bitnami/redis-sentinel/etc/sentinel.conf)" + info "Found previous master $master_in_persisted_conf in /opt/bitnami/redis-sentinel/etc/sentinel.conf" + debug "$(cat /opt/bitnami/redis-sentinel/etc/sentinel.conf | grep monitor)" + fi + {{- end }} + if ! get_sentinel_master_info && [[ "$master_in_persisted_conf" == "$(get_full_hostname "$HOSTNAME")" ]]; then + # No master found, lets create a master node + export REDIS_REPLICATION_MODE="master" + + REDIS_MASTER_HOST=$(get_full_hostname "$HOSTNAME") + REDIS_MASTER_PORT_NUMBER="$REDISPORT" + else + export REDIS_REPLICATION_MODE="replica" + + # Fetches current master's host and port + REDIS_SENTINEL_INFO=($(get_sentinel_master_info)) + info "printing REDIS_SENTINEL_INFO=(${REDIS_SENTINEL_INFO[0]},${REDIS_SENTINEL_INFO[1]})" + REDIS_MASTER_HOST=${REDIS_SENTINEL_INFO[0]} + REDIS_MASTER_PORT_NUMBER=${REDIS_SENTINEL_INFO[1]} + fi + + if [[ -n "$REDIS_EXTERNAL_MASTER_HOST" ]]; then + REDIS_MASTER_HOST="$REDIS_EXTERNAL_MASTER_HOST" + REDIS_MASTER_PORT_NUMBER="${REDIS_EXTERNAL_MASTER_PORT}" + fi + + cp /opt/bitnami/redis-sentinel/mounted-etc/sentinel.conf /opt/bitnami/redis-sentinel/etc/sentinel.conf + {{- if .Values.auth.enabled }} + printf "\nsentinel auth-pass %s %s" "{{ .Values.sentinel.masterSet }}" "$REDIS_PASSWORD" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf + {{- if and .Values.auth.enabled .Values.auth.sentinel }} + printf "\nrequirepass %s" "$REDIS_PASSWORD" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf + {{- end }} + {{- end }} + printf "\nsentinel myid %s" "$(host_id "$HOSTNAME")" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf + + if [[ -z "$REDIS_MASTER_HOST" ]] || [[ -z "$REDIS_MASTER_PORT_NUMBER" ]] + then + # Prevent incorrect configuration to be written to sentinel.conf + error "Redis master host is configured incorrectly (host: $REDIS_MASTER_HOST, port: $REDIS_MASTER_PORT_NUMBER)" + exit 1 + fi + + sentinel_conf_set "sentinel monitor" "{{ .Values.sentinel.masterSet }} "$REDIS_MASTER_HOST" "$REDIS_MASTER_PORT_NUMBER" {{ .Values.sentinel.quorum }}" + + add_known_sentinel() { + hostname="$1" + ip="$2" + + if [[ -n "$hostname" && -n "$ip" && "$hostname" != "$HOSTNAME" ]]; then + sentinel_conf_add "sentinel known-sentinel {{ .Values.sentinel.masterSet }} $(get_full_hostname "$hostname") $(get_port "$hostname" "SENTINEL") $(host_id "$hostname")" + fi + } + add_known_replica() { + hostname="$1" + ip="$2" + + if [[ -n "$ip" && "$(get_full_hostname "$hostname")" != "$REDIS_MASTER_HOST" ]]; then + sentinel_conf_add "sentinel known-replica {{ .Values.sentinel.masterSet }} $(get_full_hostname "$hostname") $(get_port "$hostname" "REDIS")" + fi + } + + # Add available hosts on the network as known replicas & sentinels + for node in $(seq 0 $(({{ .Values.replica.replicaCount }}-1))); do + hostname="{{ template "common.names.fullname" . }}-node-$node" + ip="$(getent hosts "$hostname.$HEADLESS_SERVICE" | awk '{ print $1 }')" + add_known_sentinel "$hostname" "$ip" + add_known_replica "$hostname" "$ip" + done + + echo "" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf + {{- if not (contains "sentinel announce-hostnames" .Values.sentinel.configuration) }} + echo "sentinel announce-hostnames yes" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf + {{- end }} + {{- if not (contains "sentinel resolve-hostnames" .Values.sentinel.configuration) }} + echo "sentinel resolve-hostnames yes" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf + {{- end }} + {{- if not (contains "sentinel announce-port" .Values.sentinel.configuration) }} + echo "sentinel announce-port $SERVPORT" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf + {{- end }} + {{- if not (contains "sentinel announce-ip" .Values.sentinel.configuration) }} + echo "sentinel announce-ip $(get_full_hostname "$HOSTNAME")" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf + {{- end }} + + {{- if .Values.tls.enabled }} + ARGS=("--port" "0") + ARGS+=("--tls-port" "${REDIS_SENTINEL_TLS_PORT_NUMBER}") + ARGS+=("--tls-cert-file" "${REDIS_SENTINEL_TLS_CERT_FILE}") + ARGS+=("--tls-key-file" "${REDIS_SENTINEL_TLS_KEY_FILE}") + ARGS+=("--tls-ca-cert-file" "${REDIS_SENTINEL_TLS_CA_FILE}") + ARGS+=("--tls-replication" "yes") + ARGS+=("--tls-auth-clients" "${REDIS_SENTINEL_TLS_AUTH_CLIENTS}") + {{- if .Values.tls.dhParamsFilename }} + ARGS+=("--tls-dh-params-file" "${REDIS_SENTINEL_TLS_DH_PARAMS_FILE}") + {{- end }} + {{- end }} + {{- if .Values.sentinel.preExecCmds }} + {{ .Values.sentinel.preExecCmds | nindent 4 }} + {{- end }} + exec redis-server /opt/bitnami/redis-sentinel/etc/sentinel.conf {{- if .Values.tls.enabled }} "${ARGS[@]}" {{- end }} --sentinel + prestop-sentinel.sh: | + #!/bin/bash + + . /opt/bitnami/scripts/libvalidations.sh + . /opt/bitnami/scripts/libos.sh + + HEADLESS_SERVICE="{{ template "common.names.fullname" . }}-headless.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }}" + + get_full_hostname() { + hostname="$1" + + {{- if .Values.useExternalDNS.enabled }} + full_hostname="${hostname}.{{- include "redis.externalDNS.suffix" . }}" + {{- else if eq .Values.sentinel.service.type "NodePort" }} + full_hostname="${hostname}.{{- include "common.names.namespace" . }}" + {{- else }} + full_hostname="${hostname}.${HEADLESS_SERVICE}" + {{- end }} + + {{- if .Values.useHostnames }} + echo "${full_hostname}" + {{- else }} + retry_count=0 + until getent hosts "${full_hostname}" | awk '{ print $1; exit }' | grep .; do + if [[ $retry_count -lt {{ .Values.nameResolutionThreshold }} ]]; then + sleep {{ .Values.nameResolutionTimeout }} + else + error "IP address for ${full_hostname} not found" + exit 1 + fi + ((retry_count++)) + done + {{- end }} + } + + run_sentinel_command() { + if is_boolean_yes "$REDIS_SENTINEL_TLS_ENABLED"; then + redis-cli -h "$REDIS_SERVICE" -p "$REDIS_SENTINEL_PORT" --tls --cert "$REDIS_SENTINEL_TLS_CERT_FILE" --key "$REDIS_SENTINEL_TLS_KEY_FILE" --cacert "$REDIS_SENTINEL_TLS_CA_FILE" sentinel "$@" + else + redis-cli -h "$REDIS_SERVICE" -p "$REDIS_SENTINEL_PORT" sentinel "$@" + fi + } + sentinel_failover_finished() { + REDIS_SENTINEL_INFO=($(run_sentinel_command get-master-addr-by-name "{{ .Values.sentinel.masterSet }}")) + REDIS_MASTER_HOST="${REDIS_SENTINEL_INFO[0]}" + [[ "$REDIS_MASTER_HOST" != "$(get_full_hostname $HOSTNAME)" ]] + } + + REDIS_SERVICE="{{ include "common.names.fullname" . }}.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }}" + + {{ if .Values.auth.sentinel -}} + # redis-cli automatically consumes credentials from the REDISCLI_AUTH variable + [[ -n "$REDIS_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_PASSWORD" + [[ -f "$REDIS_PASSWORD_FILE" ]] && export REDISCLI_AUTH="$(< "${REDIS_PASSWORD_FILE}")" + {{- end }} + + if ! sentinel_failover_finished; then + echo "I am the master pod and you are stopping me. Starting sentinel failover" + if retry_while "sentinel_failover_finished" "{{ sub .Values.sentinel.terminationGracePeriodSeconds 10 }}" 1; then + echo "Master has been successfuly failed over to a different pod." + exit 0 + else + echo "Master failover failed" + exit 1 + fi + else + exit 0 + fi + prestop-redis.sh: | + #!/bin/bash + + . /opt/bitnami/scripts/libvalidations.sh + . /opt/bitnami/scripts/libos.sh + + run_redis_command() { + if is_boolean_yes "$REDIS_TLS_ENABLED"; then + redis-cli -h 127.0.0.1 -p "$REDIS_TLS_PORT" --tls --cert "$REDIS_TLS_CERT_FILE" --key "$REDIS_TLS_KEY_FILE" --cacert "$REDIS_TLS_CA_FILE" "$@" + else + redis-cli -h 127.0.0.1 -p "$REDIS_PORT" "$@" + fi + } + is_master() { + REDIS_ROLE=$(run_redis_command role | head -1) + [[ "$REDIS_ROLE" == "master" ]] + } + + HEADLESS_SERVICE="{{ template "common.names.fullname" . }}-headless.{{- include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }}" + + get_full_hostname() { + hostname="$1" + + {{- if .Values.useExternalDNS.enabled }} + full_hostname="${hostname}.{{- include "redis.externalDNS.suffix" . }}" + {{- else if eq .Values.sentinel.service.type "NodePort" }} + full_hostname="${hostname}.{{- include "common.names.namespace" . }}" + {{- else }} + full_hostname="${hostname}.${HEADLESS_SERVICE}" + {{- end }} + + {{- if .Values.useHostnames }} + echo "${full_hostname}" + {{- else }} + retry_count=0 + until getent hosts "${full_hostname}" | awk '{ print $1; exit }' | grep .; do + if [[ $retry_count -lt {{ .Values.nameResolutionThreshold }} ]]; then + sleep {{ .Values.nameResolutionTimeout }} + else + error "IP address for ${full_hostname} not found" + exit 1 + fi + ((retry_count++)) + done + {{- end }} + } + + run_sentinel_command() { + if is_boolean_yes "$REDIS_SENTINEL_TLS_ENABLED"; then + {{ .Values.auth.sentinel | ternary "" "env -u REDISCLI_AUTH " -}} redis-cli -h "$REDIS_SERVICE" -p "$REDIS_SENTINEL_PORT" --tls --cert "$REDIS_SENTINEL_TLS_CERT_FILE" --key "$REDIS_SENTINEL_TLS_KEY_FILE" --cacert "$REDIS_SENTINEL_TLS_CA_FILE" sentinel "$@" + else + {{ .Values.auth.sentinel | ternary "" "env -u REDISCLI_AUTH " -}} redis-cli -h "$REDIS_SERVICE" -p "$REDIS_SENTINEL_PORT" sentinel "$@" + fi + } + sentinel_failover_finished() { + REDIS_SENTINEL_INFO=($(run_sentinel_command get-master-addr-by-name "{{ .Values.sentinel.masterSet }}")) + REDIS_MASTER_HOST="${REDIS_SENTINEL_INFO[0]}" + [[ "$REDIS_MASTER_HOST" != "$(get_full_hostname $HOSTNAME)" ]] + } + + REDIS_SERVICE="{{ include "common.names.fullname" . }}.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }}" + + # redis-cli automatically consumes credentials from the REDISCLI_AUTH variable + [[ -n "$REDIS_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_PASSWORD" + [[ -f "$REDIS_PASSWORD_FILE" ]] && export REDISCLI_AUTH="$(< "${REDIS_PASSWORD_FILE}")" + + + if is_master && ! sentinel_failover_finished; then + echo "I am the master pod and you are stopping me. Pausing client connections." + # Pausing client write connections to avoid data loss + run_redis_command CLIENT PAUSE "{{ mul (add 2 (sub .Values.sentinel.terminationGracePeriodSeconds 10)) 1000 }}" WRITE + + echo "Issuing failover" + # if I am the master, issue a command to failover once + run_sentinel_command failover "{{ .Values.sentinel.masterSet }}" + + {{- if .Values.sentinel.redisShutdownWaitFailover }} + echo "Waiting for sentinel to complete failover for up to {{ sub .Values.sentinel.terminationGracePeriodSeconds 10 }}s" + retry_while "sentinel_failover_finished" "{{ sub .Values.sentinel.terminationGracePeriodSeconds 10 }}" 1 + {{- end }} + else + exit 0 + fi + +{{- else }} + start-master.sh: | + #!/bin/bash + + [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")" + {{- if and .Values.master.containerSecurityContext.runAsUser (eq (.Values.master.containerSecurityContext.runAsUser | int) 0) }} + useradd redis + chown -R redis {{ .Values.master.persistence.path }} + {{- end }} + if [[ -f /opt/bitnami/redis/mounted-etc/master.conf ]];then + cp /opt/bitnami/redis/mounted-etc/master.conf /opt/bitnami/redis/etc/master.conf + fi + if [[ -f /opt/bitnami/redis/mounted-etc/redis.conf ]];then + cp /opt/bitnami/redis/mounted-etc/redis.conf /opt/bitnami/redis/etc/redis.conf + fi + {{- if .Values.tls.enabled }} + ARGS=("--port" "0") + ARGS+=("--tls-port" "${REDIS_TLS_PORT}") + ARGS+=("--tls-cert-file" "${REDIS_TLS_CERT_FILE}") + ARGS+=("--tls-key-file" "${REDIS_TLS_KEY_FILE}") + ARGS+=("--tls-ca-cert-file" "${REDIS_TLS_CA_FILE}") + ARGS+=("--tls-auth-clients" "${REDIS_TLS_AUTH_CLIENTS}") + {{- if .Values.tls.dhParamsFilename }} + ARGS+=("--tls-dh-params-file" "${REDIS_TLS_DH_PARAMS_FILE}") + {{- end }} + {{- else }} + ARGS=("--port" "${REDIS_PORT}") + {{- end }} + {{- if .Values.auth.enabled }} + ARGS+=("--requirepass" "${REDIS_PASSWORD}") + ARGS+=("--masterauth" "${REDIS_PASSWORD}") + {{- else }} + ARGS+=("--protected-mode" "no") + {{- end }} + ARGS+=("--include" "/opt/bitnami/redis/etc/redis.conf") + ARGS+=("--include" "/opt/bitnami/redis/etc/master.conf") + {{- if .Values.master.extraFlags }} + {{- range .Values.master.extraFlags }} + ARGS+=({{ . | quote }}) + {{- end }} + {{- end }} + {{- if .Values.master.preExecCmds }} + {{ .Values.master.preExecCmds | nindent 4 }} + {{- end }} + {{- if .Values.master.command }} + exec {{ .Values.master.command }} "${ARGS[@]}" + {{- else }} + exec redis-server "${ARGS[@]}" + {{- end }} + {{- if eq .Values.architecture "replication" }} + start-replica.sh: | + #!/bin/bash + + get_port() { + hostname="$1" + type="$2" + + port_var=$(echo "${hostname^^}_SERVICE_PORT_$type" | sed "s/-/_/g") + port=${!port_var} + + if [ -z "$port" ]; then + case $type in + "SENTINEL") + echo {{ .Values.sentinel.containerPorts.sentinel }} + ;; + "REDIS") + echo {{ .Values.master.containerPorts.redis }} + ;; + esac + else + echo $port + fi + } + + get_full_hostname() { + hostname="$1" + + {{- if .Values.useExternalDNS.enabled }} + full_hostname="${hostname}.{{- include "redis.externalDNS.suffix" . }}" + {{- else if eq .Values.sentinel.service.type "NodePort" }} + full_hostname="${hostname}.{{- include "common.names.namespace" . }}" + {{- else }} + full_hostname="${hostname}.${HEADLESS_SERVICE}" + {{- end }} + + {{- if .Values.useHostnames }} + echo "${full_hostname}" + {{- else }} + retry_count=0 + until getent hosts "${full_hostname}" | awk '{ print $1; exit }' | grep .; do + if [[ $retry_count -lt {{ .Values.nameResolutionThreshold }} ]]; then + sleep {{ .Values.nameResolutionTimeout }} + else + error "IP address for ${full_hostname} not found" + exit 1 + fi + ((retry_count++)) + done + {{- end }} + } + + REDISPORT=$(get_port "$HOSTNAME" "REDIS") + HEADLESS_SERVICE="{{ template "common.names.fullname" . }}-headless.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }}" + + [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")" + [[ -f $REDIS_MASTER_PASSWORD_FILE ]] && export REDIS_MASTER_PASSWORD="$(< "${REDIS_MASTER_PASSWORD_FILE}")" + {{- if and .Values.replica.containerSecurityContext.runAsUser (eq (.Values.replica.containerSecurityContext.runAsUser | int) 0) }} + useradd redis + chown -R redis {{ .Values.replica.persistence.path }} + {{- end }} + if [[ -f /opt/bitnami/redis/mounted-etc/replica.conf ]];then + cp /opt/bitnami/redis/mounted-etc/replica.conf /opt/bitnami/redis/etc/replica.conf + fi + if [[ -f /opt/bitnami/redis/mounted-etc/redis.conf ]];then + cp /opt/bitnami/redis/mounted-etc/redis.conf /opt/bitnami/redis/etc/redis.conf + fi + + echo "" >> /opt/bitnami/redis/etc/replica.conf + echo "replica-announce-port $REDISPORT" >> /opt/bitnami/redis/etc/replica.conf + echo "replica-announce-ip $(get_full_hostname "$HOSTNAME")" >> /opt/bitnami/redis/etc/replica.conf + + {{- if .Values.tls.enabled }} + ARGS=("--port" "0") + ARGS+=("--tls-port" "${REDIS_TLS_PORT}") + ARGS+=("--tls-cert-file" "${REDIS_TLS_CERT_FILE}") + ARGS+=("--tls-key-file" "${REDIS_TLS_KEY_FILE}") + ARGS+=("--tls-ca-cert-file" "${REDIS_TLS_CA_FILE}") + ARGS+=("--tls-auth-clients" "${REDIS_TLS_AUTH_CLIENTS}") + ARGS+=("--tls-replication" "yes") + {{- if .Values.tls.dhParamsFilename }} + ARGS+=("--tls-dh-params-file" "${REDIS_TLS_DH_PARAMS_FILE}") + {{- end }} + {{- else }} + ARGS=("--port" "${REDIS_PORT}") + {{- end }} + ARGS+=("--replicaof" "${REDIS_MASTER_HOST}" "${REDIS_MASTER_PORT_NUMBER}") + {{- if .Values.auth.enabled }} + ARGS+=("--requirepass" "${REDIS_PASSWORD}") + ARGS+=("--masterauth" "${REDIS_MASTER_PASSWORD}") + {{- else }} + ARGS+=("--protected-mode" "no") + {{- end }} + ARGS+=("--include" "/opt/bitnami/redis/etc/redis.conf") + ARGS+=("--include" "/opt/bitnami/redis/etc/replica.conf") + {{- if .Values.replica.extraFlags }} + {{- range .Values.replica.extraFlags }} + ARGS+=({{ . | quote }}) + {{- end }} + {{- end }} + {{- if .Values.replica.preExecCmds }} + {{ .Values.replica.preExecCmds | nindent 4 }} + {{- end }} + {{- if .Values.replica.command }} + exec {{ .Values.replica.command }} "${ARGS[@]}" + {{- else }} + exec redis-server "${ARGS[@]}" + {{- end }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/secret-svcbind.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/secret-svcbind.yaml new file mode 100644 index 000000000..de74913e1 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/secret-svcbind.yaml @@ -0,0 +1,37 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if .Values.serviceBindings.enabled }} +{{- $host := include "common.names.fullname" . }} +{{- if not .Values.sentinel.enabled }} +{{- $host = printf "%s-master" (include "common.names.fullname" .) }} +{{- end }} +{{- $port := print .Values.master.service.ports.redis }} +{{- if .Values.sentinel.enabled }} +{{- $port = print .Values.sentinel.service.ports.redis }} +{{- end }} +{{- $password := include "redis.password" . }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }}-svcbind + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +type: servicebinding.io/redis +data: + provider: {{ print "bitnami" | b64enc | quote }} + type: {{ print "redis" | b64enc | quote }} + host: {{ print $host | b64enc | quote }} + port: {{ print $port | b64enc | quote }} + password: {{ print $password | b64enc | quote }} + {{- if $password }} + uri: {{ printf "redis://:%s@%s:%s" $password $host $port | b64enc | quote }} + {{- else }} + uri: {{ printf "redis://%s:%s" $host $port | b64enc | quote }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/secret.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/secret.yaml new file mode 100644 index 000000000..003a2768c --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/secret.yaml @@ -0,0 +1,25 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.auth.enabled (not .Values.auth.existingSecret) -}} +apiVersion: v1 +kind: Secret +metadata: + name: {{ template "common.names.fullname" . }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if or .Values.secretAnnotations .Values.commonAnnotations }} + annotations: + {{- if .Values.secretAnnotations }} + {{- include "common.tplvalues.render" ( dict "value" .Values.secretAnnotations "context" $ ) | nindent 4 }} + {{- end }} + {{- if .Values.commonAnnotations }} + {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} + {{- end }} +type: Opaque +data: + redis-password: {{ include "redis.password" . | b64enc | quote }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/hpa.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/hpa.yaml new file mode 100644 index 000000000..f8bd35617 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/hpa.yaml @@ -0,0 +1,49 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.replica.autoscaling.enabled .Values.sentinel.enabled }} +apiVersion: {{ include "common.capabilities.hpa.apiVersion" ( dict "context" $ ) }} +kind: HorizontalPodAutoscaler +metadata: + name: {{ printf "%s-node" (include "common.names.fullname" .) }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: replica + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + scaleTargetRef: + apiVersion: {{ include "common.capabilities.deployment.apiVersion" . }} + kind: StatefulSet + name: {{ printf "%s-node" (include "common.names.fullname" .) }} + minReplicas: {{ .Values.replica.autoscaling.minReplicas }} + maxReplicas: {{ .Values.replica.autoscaling.maxReplicas }} + metrics: + {{- if .Values.replica.autoscaling.targetMemory }} + - type: Resource + resource: + name: memory + {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} + targetAverageUtilization: {{ .Values.replica.autoscaling.targetMemory }} + {{- else }} + target: + type: Utilization + averageUtilization: {{ .Values.replica.autoscaling.targetMemory }} + {{- end }} + {{- end }} + {{- if .Values.replica.autoscaling.targetCPU }} + - type: Resource + resource: + name: cpu + {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} + targetAverageUtilization: {{ .Values.replica.autoscaling.targetCPU }} + {{- else }} + target: + type: Utilization + averageUtilization: {{ .Values.replica.autoscaling.targetCPU }} + {{- end }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/node-services.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/node-services.yaml new file mode 100644 index 000000000..672de5cd2 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/node-services.yaml @@ -0,0 +1,67 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and (eq .Values.architecture "replication") .Values.sentinel.enabled (eq .Values.sentinel.service.type "NodePort") (or .Release.IsUpgrade .Values.sentinel.service.nodePorts.redis ) }} + +{{- range $i := until (int .Values.replica.replicaCount) }} + +{{ $portsmap := (lookup "v1" "ConfigMap" (include "common.names.namespace" $) (printf "%s-%s" ( include "common.names.fullname" $ ) "ports-configmap")).data }} + +{{ $sentinelport := 0}} +{{ $redisport := 0}} +{{- if $portsmap }} +{{ $sentinelport = index $portsmap (printf "%s-node-%s-%s" (include "common.names.fullname" $) (toString $i) "sentinel") }} +{{ $redisport = index $portsmap (printf "%s-node-%s-%s" (include "common.names.fullname" $) (toString $i) "redis") }} +{{- else }} +{{- end }} +apiVersion: v1 +kind: Service +metadata: + name: {{ template "common.names.fullname" $ }}-node-{{ $i }} + namespace: {{ include "common.names.namespace" $ | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" $.Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: node + {{- if or $.Values.commonAnnotations $.Values.sentinel.service.annotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list $.Values.sentinel.service.annotations $.Values.commonAnnotations ) "context" $ ) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} +spec: + type: NodePort + ports: + - name: sentinel + {{- if $.Values.sentinel.service.nodePorts.sentinel }} + nodePort: {{ (add $.Values.sentinel.service.nodePorts.sentinel $i 1) }} + port: {{ (add $.Values.sentinel.service.nodePorts.sentinel $i 1) }} + {{- else }} + nodePort: {{ $sentinelport }} + port: {{ $sentinelport }} + {{- end }} + protocol: TCP + targetPort: {{ $.Values.sentinel.containerPorts.sentinel }} + - name: redis + {{- if $.Values.sentinel.service.nodePorts.redis }} + nodePort: {{ (add $.Values.sentinel.service.nodePorts.redis $i 1) }} + port: {{ (add $.Values.sentinel.service.nodePorts.redis $i 1) }} + {{- else }} + nodePort: {{ $redisport }} + port: {{ $redisport }} + {{- end }} + protocol: TCP + targetPort: {{ $.Values.replica.containerPorts.redis }} + - name: sentinel-internal + nodePort: null + port: {{ $.Values.sentinel.containerPorts.sentinel }} + protocol: TCP + targetPort: {{ $.Values.sentinel.containerPorts.sentinel }} + - name: redis-internal + nodePort: null + port: {{ $.Values.replica.containerPorts.redis }} + protocol: TCP + targetPort: {{ $.Values.replica.containerPorts.redis }} + selector: + statefulset.kubernetes.io/pod-name: {{ template "common.names.fullname" $ }}-node-{{ $i }} +--- +{{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/ports-configmap.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/ports-configmap.yaml new file mode 100644 index 000000000..3efed7433 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/ports-configmap.yaml @@ -0,0 +1,102 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and (eq .Values.architecture "replication") .Values.sentinel.enabled (eq .Values.sentinel.service.type "NodePort") (not .Values.sentinel.service.nodePorts.redis ) }} +{{- /* create a list to keep track of ports we choose to use */}} +{{ $chosenports := (list ) }} + +{{- /* Get list of all used nodeports */}} +{{ $usedports := (list ) }} +{{- range $index, $service := (lookup "v1" "Service" "" "").items }} + {{- range.spec.ports }} + {{- if .nodePort }} + {{- $usedports = (append $usedports .nodePort) }} + {{- end }} + {{- end }} +{{- end }} + +{{- /* +comments that start with # are rendered in the output when you debug, so you can less and search for them +Vars in the comment will be rendered out, so you can check their value this way. +https://helm.sh/docs/chart_best_practices/templates/#comments-yaml-comments-vs-template-comments + +remove the template comments and leave the yaml comments to help debug +*/}} + +{{- /* Sort the list */}} +{{ $usedports = $usedports | sortAlpha }} +#usedports {{ $usedports }} + +{{- /* How many nodeports per service do we want to create, except for the main service which is always two */}} +{{ $numberofPortsPerNodeService := 2 }} + +{{- /* for every nodeport we want, loop though the used ports to get an unused port */}} +{{- range $j := until (int (add (mul (int .Values.replica.replicaCount) $numberofPortsPerNodeService) 2)) }} + {{- /* #j={{ $j }} */}} + {{- $nodeport := (add $j 30000) }} + {{- $nodeportfound := false }} + {{- range $i := $usedports }} + {{- /* #i={{ $i }} + #nodeport={{ $nodeport }} + #usedports={{ $usedports }} */}} + {{- if and (has (toString $nodeport) $usedports) (eq $nodeportfound false) }} + {{- /* nodeport conflicts with in use */}} + {{- $nodeport = (add $nodeport 1) }} + {{- else if and ( has $nodeport $chosenports) (eq $nodeportfound false) }} + {{- /* nodeport already chosen, try another */}} + {{- $nodeport = (add $nodeport 1) }} + {{- else if (eq $nodeportfound false) }} + {{- /* nodeport free to use: not already claimed and not in use */}} + {{- /* select nodeport, and place into usedports */}} + {{- $chosenports = (append $chosenports $nodeport) }} + {{- $nodeportfound = true }} + {{- else }} + {{- /* nodeport has already been chosen and locked in, just work through the rest of the list to get to the next nodeport selection */}} + {{- end }} + {{- end }} + {{- if (eq $nodeportfound false) }} + {{- $chosenports = (append $chosenports $nodeport) }} + {{- end }} + +{{- end }} + +{{- /* print the usedports and chosenports for debugging */}} +#usedports {{ $usedports }} +#chosenports {{ $chosenports }}}} + +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ template "common.names.fullname" . }}-ports-configmap + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: + {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +data: +{{ $portsmap := (lookup "v1" "ConfigMap" (include "common.names.namespace" .) (printf "%s-%s" ( include "common.names.fullname" . ) "ports-configmap")).data }} +{{- if $portsmap }} +{{- /* configmap already exists, do not install again */ -}} + {{- range $name, $value := $portsmap }} + "{{ $name }}": "{{ $value }}" + {{- end }} +{{- else }} +{{- /* configmap being set for first time */ -}} + {{- range $index, $port := $chosenports }} + {{- $nodenumber := (floor (div $index 2)) }} + {{- if (eq $index 0) }} + "{{ template "common.names.fullname" $ }}-sentinel": "{{ $port }}" + {{- else if (eq $index 1) }} + "{{ template "common.names.fullname" $ }}-redis": "{{ $port }}" + {{- else if (eq (mod $index 2) 0) }} + "{{ template "common.names.fullname" $ }}-node-{{ (sub $nodenumber 1) }}-sentinel": "{{ $port }}" + {{- else if (eq (mod $index 2) 1) }} + "{{ template "common.names.fullname" $ }}-node-{{ (sub $nodenumber 1) }}-redis": "{{ $port }}" + {{- end }} + {{- end }} +{{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/service.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/service.yaml new file mode 100644 index 000000000..f80e6442a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/service.yaml @@ -0,0 +1,104 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if or .Release.IsUpgrade (ne .Values.sentinel.service.type "NodePort") .Values.sentinel.service.nodePorts.redis -}} +{{- if and (eq .Values.architecture "replication") .Values.sentinel.enabled }} +{{ $portsmap := (lookup "v1" "ConfigMap" (include "common.names.namespace" .) (printf "%s-%s" ( include "common.names.fullname" . ) "ports-configmap")).data }} + +{{ $sentinelport := 0}} +{{ $redisport := 0}} +{{- if $portsmap }} +{{ $sentinelport = index $portsmap (printf "%s-%s" (include "common.names.fullname" $) "sentinel") }} +{{ $redisport = index $portsmap (printf "%s-%s" (include "common.names.fullname" $) "redis") }} +{{- else }} +{{- end }} + +apiVersion: v1 +kind: Service +metadata: + name: {{ template "common.names.fullname" . }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: node + {{- if or .Values.sentinel.service.annotations .Values.commonAnnotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.sentinel.service.annotations .Values.commonAnnotations ) "context" . ) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.sentinel.service.type }} + {{- if or (eq .Values.sentinel.service.type "LoadBalancer") (eq .Values.sentinel.service.type "NodePort") }} + externalTrafficPolicy: {{ .Values.sentinel.service.externalTrafficPolicy | quote }} + {{- end }} + {{- if and (eq .Values.sentinel.service.type "LoadBalancer") (not (empty .Values.sentinel.service.loadBalancerIP)) }} + loadBalancerIP: {{ .Values.sentinel.service.loadBalancerIP }} + {{- end }} + {{- if and (eq .Values.sentinel.service.type "LoadBalancer") .Values.sentinel.service.loadBalancerClass }} + loadBalancerClass: {{ .Values.sentinel.service.loadBalancerClass }} + {{- end }} + {{- if and (eq .Values.sentinel.service.type "LoadBalancer") (not (empty .Values.sentinel.service.loadBalancerSourceRanges)) }} + loadBalancerSourceRanges: {{ toYaml .Values.sentinel.service.loadBalancerSourceRanges | nindent 4 }} + {{- end }} + {{- if and .Values.sentinel.service.clusterIP (eq .Values.sentinel.service.type "ClusterIP") }} + clusterIP: {{ .Values.sentinel.service.clusterIP }} + {{- end }} + {{- if .Values.sentinel.service.sessionAffinity }} + sessionAffinity: {{ .Values.sentinel.service.sessionAffinity }} + {{- end }} + {{- if .Values.sentinel.service.sessionAffinityConfig }} + sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.sentinel.service.sessionAffinityConfig "context" $) | nindent 4 }} + {{- end }} + ports: + - name: tcp-redis + {{- if and (or (eq .Values.sentinel.service.type "NodePort") (eq .Values.sentinel.service.type "LoadBalancer")) .Values.sentinel.service.nodePorts.redis }} + port: {{ .Values.sentinel.service.nodePorts.redis }} + {{- else if eq .Values.sentinel.service.type "NodePort" }} + port: {{ $redisport }} + {{- else}} + port: {{ .Values.sentinel.service.ports.redis }} + {{- end }} + targetPort: {{ .Values.replica.containerPorts.redis }} + {{- if and (or (eq .Values.sentinel.service.type "NodePort") (eq .Values.sentinel.service.type "LoadBalancer")) .Values.sentinel.service.nodePorts.redis }} + nodePort: {{ .Values.sentinel.service.nodePorts.redis }} + {{- else if eq .Values.sentinel.service.type "ClusterIP" }} + nodePort: null + {{- else if eq .Values.sentinel.service.type "NodePort" }} + nodePort: {{ $redisport }} + {{- end }} + - name: tcp-sentinel + {{- if and (or (eq .Values.sentinel.service.type "NodePort") (eq .Values.sentinel.service.type "LoadBalancer")) .Values.sentinel.service.nodePorts.sentinel }} + port: {{ .Values.sentinel.service.nodePorts.sentinel }} + {{- else if eq .Values.sentinel.service.type "NodePort" }} + port: {{ $sentinelport }} + {{- else }} + port: {{ .Values.sentinel.service.ports.sentinel }} + {{- end }} + targetPort: {{ .Values.sentinel.containerPorts.sentinel }} + {{- if and (or (eq .Values.sentinel.service.type "NodePort") (eq .Values.sentinel.service.type "LoadBalancer")) .Values.sentinel.service.nodePorts.sentinel }} + nodePort: {{ .Values.sentinel.service.nodePorts.sentinel }} + {{- else if eq .Values.sentinel.service.type "ClusterIP" }} + nodePort: null + {{- else if eq .Values.sentinel.service.type "NodePort" }} + nodePort: {{ $sentinelport }} + {{- end }} + {{- if eq .Values.sentinel.service.type "NodePort" }} + - name: sentinel-internal + nodePort: null + port: {{ .Values.sentinel.containerPorts.sentinel }} + protocol: TCP + targetPort: {{ .Values.sentinel.containerPorts.sentinel }} + - name: redis-internal + nodePort: null + port: {{ .Values.replica.containerPorts.redis }} + protocol: TCP + targetPort: {{ .Values.replica.containerPorts.redis }} + {{- end }} + {{- if .Values.sentinel.service.extraPorts }} + {{- include "common.tplvalues.render" (dict "value" .Values.sentinel.service.extraPorts "context" $) | nindent 4 }} + {{- end }} + {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.replica.podLabels .Values.commonLabels ) "context" . ) }} + selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: node +{{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/statefulset.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/statefulset.yaml new file mode 100644 index 000000000..73950ac35 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/statefulset.yaml @@ -0,0 +1,785 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if or .Release.IsUpgrade (ne .Values.sentinel.service.type "NodePort") .Values.sentinel.service.nodePorts.redis -}} +{{- if and (eq .Values.architecture "replication") .Values.sentinel.enabled }} +apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }} +kind: StatefulSet +metadata: + name: {{ printf "%s-node" (include "common.names.fullname" .) }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: node + {{- if or .Values.commonAnnotations .Values.sentinel.annotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.sentinel.annotations .Values.commonAnnotations ) "context" . ) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replica.replicaCount }} + {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.replica.podLabels .Values.commonLabels ) "context" . ) }} + selector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }} + app.kubernetes.io/component: node + serviceName: {{ printf "%s-headless" (include "common.names.fullname" .) }} + {{- if .Values.replica.updateStrategy }} + updateStrategy: {{- toYaml .Values.replica.updateStrategy | nindent 4 }} + {{- end }} + {{- if and .Values.replica.minReadySeconds (semverCompare ">= 1.23-0" (include "common.capabilities.kubeVersion" .)) }} + minReadySeconds: {{ .Values.replica.minReadySeconds }} + {{- end }} + {{- if .Values.replica.podManagementPolicy }} + podManagementPolicy: {{ .Values.replica.podManagementPolicy | quote }} + {{- end }} + template: + metadata: + labels: {{- include "common.labels.standard" ( dict "customLabels" $podLabels "context" $ ) | nindent 8 }} + app.kubernetes.io/component: node + {{- if and .Values.metrics.enabled .Values.metrics.podLabels }} + {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.podLabels "context" $ ) | nindent 8 }} + {{- end }} + annotations: + {{- if (include "redis.createConfigmap" .) }} + checksum/configmap: {{ pick ( include (print $.Template.BasePath "/configmap.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} + {{- end }} + checksum/health: {{ pick ( include (print $.Template.BasePath "/health-configmap.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} + checksum/scripts: {{ pick ( include (print $.Template.BasePath "/scripts-configmap.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} + checksum/secret: {{ pick ( include (print $.Template.BasePath "/secret.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} + {{- if .Values.replica.podAnnotations }} + {{- include "common.tplvalues.render" ( dict "value" .Values.replica.podAnnotations "context" $ ) | nindent 8 }} + {{- end }} + {{- if and .Values.metrics.enabled .Values.metrics.podAnnotations }} + {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.podAnnotations "context" $ ) | nindent 8 }} + {{- end }} + spec: + {{- include "redis.imagePullSecrets" . | nindent 6 }} + automountServiceAccountToken: {{ .Values.replica.automountServiceAccountToken }} + {{- if .Values.replica.hostAliases }} + hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.replica.hostAliases "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.replica.podSecurityContext.enabled }} + securityContext: {{- omit .Values.replica.podSecurityContext "enabled" | toYaml | nindent 8 }} + {{- end }} + serviceAccountName: {{ template "redis.serviceAccountName" . }} + {{- if .Values.replica.priorityClassName }} + priorityClassName: {{ .Values.replica.priorityClassName | quote }} + {{- end }} + {{- if .Values.replica.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.replica.affinity "context" $) | nindent 8 }} + {{- else }} + affinity: + podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.replica.podAffinityPreset "component" "node" "customLabels" $podLabels "context" $) | nindent 10 }} + podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.replica.podAntiAffinityPreset "component" "node" "customLabels" $podLabels "context" $) | nindent 10 }} + nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.replica.nodeAffinityPreset.type "key" .Values.replica.nodeAffinityPreset.key "values" .Values.replica.nodeAffinityPreset.values) | nindent 10 }} + {{- end }} + {{- if .Values.replica.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.replica.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.replica.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.replica.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.replica.topologySpreadConstraints }} + topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.replica.topologySpreadConstraints "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.replica.shareProcessNamespace }} + shareProcessNamespace: {{ .Values.replica.shareProcessNamespace }} + {{- end }} + {{- if .Values.replica.schedulerName }} + schedulerName: {{ .Values.replica.schedulerName | quote }} + {{- end }} + {{- if .Values.replica.dnsPolicy }} + dnsPolicy: {{ .Values.replica.dnsPolicy }} + {{- end }} + {{- if .Values.replica.dnsConfig }} + dnsConfig: {{- include "common.tplvalues.render" (dict "value" .Values.replica.dnsConfig "context" $) | nindent 8 }} + {{- end }} + enableServiceLinks: {{ .Values.sentinel.enableServiceLinks }} + terminationGracePeriodSeconds: {{ .Values.sentinel.terminationGracePeriodSeconds }} + containers: + - name: redis + image: {{ template "redis.image" . }} + imagePullPolicy: {{ .Values.image.pullPolicy | quote }} + {{- if not .Values.diagnosticMode.enabled }} + {{- if .Values.replica.lifecycleHooks }} + lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.replica.lifecycleHooks "context" $) | nindent 12 }} + {{- else }} + lifecycle: + preStop: + exec: + command: + - /bin/bash + - -c + - /opt/bitnami/scripts/start-scripts/prestop-redis.sh + {{- end }} + {{- end }} + {{- if .Values.replica.containerSecurityContext.enabled }} + securityContext: {{- omit .Values.replica.containerSecurityContext "enabled" | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} + {{- else if .Values.replica.command }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.replica.command "context" $) | nindent 12 }} + {{- else }} + command: + - /bin/bash + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} + {{- else if .Values.replica.args }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.replica.args "context" $) | nindent 12 }} + {{- else }} + args: + - -c + - /opt/bitnami/scripts/start-scripts/start-node.sh + {{- end }} + env: + - name: BITNAMI_DEBUG + value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }} + - name: REDIS_MASTER_PORT_NUMBER + value: {{ .Values.replica.containerPorts.redis | quote }} + - name: ALLOW_EMPTY_PASSWORD + value: {{ ternary "no" "yes" .Values.auth.enabled | quote }} + {{- if .Values.auth.enabled }} + {{- if .Values.auth.usePasswordFiles }} + - name: REDIS_PASSWORD_FILE + value: "/opt/bitnami/redis/secrets/redis-password" + - name: REDIS_MASTER_PASSWORD_FILE + value: "/opt/bitnami/redis/secrets/redis-password" + {{- else }} + - name: REDIS_PASSWORD + valueFrom: + secretKeyRef: + name: {{ template "redis.secretName" . }} + key: {{ template "redis.secretPasswordKey" . }} + - name: REDIS_MASTER_PASSWORD + valueFrom: + secretKeyRef: + name: {{ template "redis.secretName" . }} + key: {{ template "redis.secretPasswordKey" . }} + {{- end }} + {{- end }} + - name: REDIS_TLS_ENABLED + value: {{ ternary "yes" "no" .Values.tls.enabled | quote }} + {{- if .Values.tls.enabled }} + - name: REDIS_TLS_PORT + value: {{ .Values.replica.containerPorts.redis | quote }} + - name: REDIS_TLS_AUTH_CLIENTS + value: {{ ternary "yes" "no" .Values.tls.authClients | quote }} + - name: REDIS_TLS_CERT_FILE + value: {{ template "redis.tlsCert" . }} + - name: REDIS_TLS_KEY_FILE + value: {{ template "redis.tlsCertKey" . }} + - name: REDIS_TLS_CA_FILE + value: {{ template "redis.tlsCACert" . }} + {{- if .Values.tls.dhParamsFilename }} + - name: REDIS_TLS_DH_PARAMS_FILE + value: {{ template "redis.tlsDHParams" . }} + {{- end }} + {{- else }} + - name: REDIS_PORT + value: {{ .Values.replica.containerPorts.redis | quote }} + {{- end }} + - name: REDIS_SENTINEL_TLS_ENABLED + value: {{ ternary "yes" "no" .Values.tls.enabled | quote }} + {{- if .Values.tls.enabled }} + - name: REDIS_SENTINEL_TLS_PORT_NUMBER + value: {{ .Values.sentinel.containerPorts.sentinel | quote }} + - name: REDIS_SENTINEL_TLS_AUTH_CLIENTS + value: {{ ternary "yes" "no" .Values.tls.authClients | quote }} + - name: REDIS_SENTINEL_TLS_CERT_FILE + value: {{ template "redis.tlsCert" . }} + - name: REDIS_SENTINEL_TLS_KEY_FILE + value: {{ template "redis.tlsCertKey" . }} + - name: REDIS_SENTINEL_TLS_CA_FILE + value: {{ template "redis.tlsCACert" . }} + {{- if .Values.tls.dhParamsFilename }} + - name: REDIS_SENTINEL_TLS_DH_PARAMS_FILE + value: {{ template "redis.tlsDHParams" . }} + {{- end }} + {{- else }} + - name: REDIS_SENTINEL_PORT + value: {{ .Values.sentinel.containerPorts.sentinel | quote }} + {{- end }} + - name: REDIS_DATA_DIR + value: {{ .Values.replica.persistence.path }} + {{- if .Values.replica.externalMaster.enabled }} + - name: REDIS_EXTERNAL_MASTER_HOST + value: {{ .Values.replica.externalMaster.host | quote }} + - name: REDIS_EXTERNAL_MASTER_PORT + value: {{ .Values.replica.externalMaster.port | quote }} + {{- end }} + {{- if .Values.replica.extraEnvVars }} + {{- include "common.tplvalues.render" ( dict "value" .Values.replica.extraEnvVars "context" $ ) | nindent 12 }} + {{- end }} + {{- if or .Values.replica.extraEnvVarsCM .Values.replica.extraEnvVarsSecret }} + envFrom: + {{- if .Values.replica.extraEnvVarsCM }} + - configMapRef: + name: {{ .Values.replica.extraEnvVarsCM }} + {{- end }} + {{- if .Values.replica.extraEnvVarsSecret }} + - secretRef: + name: {{ .Values.replica.extraEnvVarsSecret }} + {{- end }} + {{- end }} + ports: + - name: redis + containerPort: {{ .Values.replica.containerPorts.redis }} + {{- if not .Values.diagnosticMode.enabled }} + {{- if .Values.replica.customStartupProbe }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.replica.customStartupProbe "context" $) | nindent 12 }} + {{- else if .Values.replica.startupProbe.enabled }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.replica.startupProbe "enabled") "context" $) | nindent 12 }} + exec: + command: + - sh + - -c + - /health/ping_liveness_local.sh {{ .Values.replica.livenessProbe.timeoutSeconds }} + {{- end }} + {{- if .Values.replica.customLivenessProbe }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.replica.customLivenessProbe "context" $) | nindent 12 }} + {{- else if .Values.replica.livenessProbe.enabled }} + livenessProbe: + initialDelaySeconds: {{ .Values.replica.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.replica.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.replica.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.replica.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.replica.livenessProbe.failureThreshold }} + exec: + command: + - sh + - -c + - /health/ping_liveness_local.sh {{ .Values.replica.livenessProbe.timeoutSeconds }} + {{- end }} + {{- if .Values.replica.customReadinessProbe }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.replica.customReadinessProbe "context" $) | nindent 12 }} + {{- else if .Values.replica.readinessProbe.enabled }} + readinessProbe: + initialDelaySeconds: {{ .Values.replica.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.replica.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.replica.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.replica.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.replica.readinessProbe.failureThreshold }} + exec: + command: + - sh + - -c + - /health/ping_readiness_local.sh {{ .Values.replica.readinessProbe.timeoutSeconds }} + {{- end }} + {{- end }} + {{- if .Values.replica.resources }} + resources: {{- toYaml .Values.replica.resources | nindent 12 }} + {{- end }} + volumeMounts: + - name: start-scripts + mountPath: /opt/bitnami/scripts/start-scripts + - name: health + mountPath: /health + {{- if .Values.sentinel.persistence.enabled }} + - name: sentinel-data + mountPath: /opt/bitnami/redis-sentinel/etc + {{- end }} + {{- if .Values.auth.usePasswordFiles }} + - name: redis-password + mountPath: /opt/bitnami/redis/secrets/ + {{- end }} + - name: redis-data + mountPath: {{ .Values.replica.persistence.path }} + {{- if .Values.replica.persistence.subPath }} + subPath: {{ .Values.replica.persistence.subPath }} + {{- else if .Values.replica.persistence.subPathExpr }} + subPathExpr: {{ .Values.replica.persistence.subPathExpr }} + {{- end }} + - name: config + mountPath: /opt/bitnami/redis/mounted-etc + - name: redis-tmp-conf + mountPath: /opt/bitnami/redis/etc + - name: tmp + mountPath: /tmp + {{- if .Values.tls.enabled }} + - name: redis-certificates + mountPath: /opt/bitnami/redis/certs + readOnly: true + {{- end }} + {{- if .Values.replica.extraVolumeMounts }} + {{- include "common.tplvalues.render" ( dict "value" .Values.replica.extraVolumeMounts "context" $ ) | nindent 12 }} + {{- end }} + - name: sentinel + image: {{ template "redis.sentinel.image" . }} + imagePullPolicy: {{ .Values.sentinel.image.pullPolicy | quote }} + {{- if not .Values.diagnosticMode.enabled }} + {{- if .Values.sentinel.lifecycleHooks }} + lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.sentinel.lifecycleHooks "context" $) | nindent 12 }} + {{- else }} + lifecycle: + preStop: + exec: + command: + - /bin/bash + - -c + - /opt/bitnami/scripts/start-scripts/prestop-sentinel.sh + {{- end }} + {{- end }} + {{- if .Values.sentinel.containerSecurityContext.enabled }} + securityContext: {{- omit .Values.sentinel.containerSecurityContext "enabled" | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} + {{- else if .Values.sentinel.command }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.sentinel.command "context" $) | nindent 12 }} + {{- else }} + command: + - /bin/bash + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} + {{- else if .Values.sentinel.args }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.sentinel.args "context" $) | nindent 12 }} + {{- else }} + args: + - -c + - /opt/bitnami/scripts/start-scripts/start-sentinel.sh + {{- end }} + env: + - name: BITNAMI_DEBUG + value: {{ ternary "true" "false" (or .Values.sentinel.image.debug .Values.diagnosticMode.enabled) | quote }} + {{- if .Values.auth.enabled }} + {{- if .Values.auth.usePasswordFiles }} + - name: REDIS_PASSWORD_FILE + value: "/opt/bitnami/redis/secrets/redis-password" + {{- else }} + - name: REDIS_PASSWORD + valueFrom: + secretKeyRef: + name: {{ template "redis.secretName" . }} + key: {{ template "redis.secretPasswordKey" . }} + {{- end }} + {{- else }} + - name: ALLOW_EMPTY_PASSWORD + value: "yes" + {{- end }} + - name: REDIS_SENTINEL_TLS_ENABLED + value: {{ ternary "yes" "no" .Values.tls.enabled | quote }} + {{- if .Values.tls.enabled }} + - name: REDIS_SENTINEL_TLS_PORT_NUMBER + value: {{ .Values.sentinel.containerPorts.sentinel | quote }} + - name: REDIS_SENTINEL_TLS_AUTH_CLIENTS + value: {{ ternary "yes" "no" .Values.tls.authClients | quote }} + - name: REDIS_SENTINEL_TLS_CERT_FILE + value: {{ template "redis.tlsCert" . }} + - name: REDIS_SENTINEL_TLS_KEY_FILE + value: {{ template "redis.tlsCertKey" . }} + - name: REDIS_SENTINEL_TLS_CA_FILE + value: {{ template "redis.tlsCACert" . }} + {{- if .Values.tls.dhParamsFilename }} + - name: REDIS_SENTINEL_TLS_DH_PARAMS_FILE + value: {{ template "redis.tlsDHParams" . }} + {{- end }} + {{- else }} + - name: REDIS_SENTINEL_PORT + value: {{ .Values.sentinel.containerPorts.sentinel | quote }} + {{- end }} + {{- if .Values.sentinel.externalMaster.enabled }} + - name: REDIS_EXTERNAL_MASTER_HOST + value: {{ .Values.sentinel.externalMaster.host | quote }} + - name: REDIS_EXTERNAL_MASTER_PORT + value: {{ .Values.sentinel.externalMaster.port | quote }} + {{- end }} + {{- if .Values.sentinel.extraEnvVars }} + {{- include "common.tplvalues.render" ( dict "value" .Values.sentinel.extraEnvVars "context" $ ) | nindent 12 }} + {{- end }} + {{- if or .Values.sentinel.extraEnvVarsCM .Values.sentinel.extraEnvVarsSecret }} + envFrom: + {{- if .Values.sentinel.extraEnvVarsCM }} + - configMapRef: + name: {{ .Values.sentinel.extraEnvVarsCM }} + {{- end }} + {{- if .Values.sentinel.extraEnvVarsSecret }} + - secretRef: + name: {{ .Values.sentinel.extraEnvVarsSecret }} + {{- end }} + {{- end }} + ports: + - name: redis-sentinel + containerPort: {{ .Values.sentinel.containerPorts.sentinel }} + {{- if not .Values.diagnosticMode.enabled }} + {{- if .Values.sentinel.customStartupProbe }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.sentinel.customStartupProbe "context" $) | nindent 12 }} + {{- else if .Values.sentinel.startupProbe.enabled }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.sentinel.startupProbe "enabled") "context" $) | nindent 12 }} + exec: + command: + - sh + - -c + - /health/ping_sentinel.sh {{ .Values.sentinel.livenessProbe.timeoutSeconds }} + {{- end }} + {{- if .Values.sentinel.customLivenessProbe }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.sentinel.customLivenessProbe "context" $) | nindent 12 }} + {{- else if .Values.sentinel.livenessProbe.enabled }} + livenessProbe: + initialDelaySeconds: {{ .Values.sentinel.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.sentinel.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.sentinel.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.sentinel.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.sentinel.livenessProbe.failureThreshold }} + exec: + command: + - sh + - -c + - /health/ping_sentinel.sh {{ .Values.sentinel.livenessProbe.timeoutSeconds }} + {{- end }} + {{- end }} + {{- if not .Values.diagnosticMode.enabled }} + {{- if .Values.sentinel.customReadinessProbe }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.sentinel.customReadinessProbe "context" $) | nindent 12 }} + {{- else if .Values.sentinel.readinessProbe.enabled }} + readinessProbe: + initialDelaySeconds: {{ .Values.sentinel.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.sentinel.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.sentinel.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.sentinel.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.sentinel.readinessProbe.failureThreshold }} + exec: + command: + - sh + - -c + - /health/ping_sentinel.sh {{ .Values.sentinel.readinessProbe.timeoutSeconds }} + {{- end }} + {{- end }} + {{- if .Values.sentinel.resources }} + resources: {{- toYaml .Values.sentinel.resources | nindent 12 }} + {{- end }} + volumeMounts: + - name: start-scripts + mountPath: /opt/bitnami/scripts/start-scripts + - name: health + mountPath: /health + - name: sentinel-data + mountPath: /opt/bitnami/redis-sentinel/etc + {{- if .Values.auth.usePasswordFiles }} + - name: redis-password + mountPath: /opt/bitnami/redis/secrets/ + {{- end }} + - name: redis-data + mountPath: {{ .Values.replica.persistence.path }} + {{- if .Values.replica.persistence.subPath }} + subPath: {{ .Values.replica.persistence.subPath }} + {{- else if .Values.replica.persistence.subPathExpr }} + subPathExpr: {{ .Values.replica.persistence.subPathExpr }} + {{- end }} + - name: config + mountPath: /opt/bitnami/redis-sentinel/mounted-etc + {{- if .Values.tls.enabled }} + - name: redis-certificates + mountPath: /opt/bitnami/redis/certs + readOnly: true + {{- end }} + {{- if .Values.sentinel.extraVolumeMounts }} + {{- include "common.tplvalues.render" ( dict "value" .Values.sentinel.extraVolumeMounts "context" $ ) | nindent 12 }} + {{- end }} + {{- if .Values.metrics.enabled }} + - name: metrics + image: {{ template "redis.metrics.image" . }} + imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }} + {{- if .Values.metrics.containerSecurityContext.enabled }} + securityContext: {{- omit .Values.metrics.containerSecurityContext "enabled" | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} + {{- else }} + command: + - /bin/bash + - -c + - | + if [[ -f '/secrets/redis-password' ]]; then + export REDIS_PASSWORD=$(cat /secrets/redis-password) + fi + redis_exporter{{- range $key, $value := .Values.metrics.extraArgs }} --{{ $key }}={{ $value }}{{- end }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} + {{- end }} + env: + - name: REDIS_ALIAS + value: {{ template "common.names.fullname" . }} + {{- if .Values.auth.enabled }} + - name: REDIS_USER + value: default + {{- if (not .Values.auth.usePasswordFiles) }} + - name: REDIS_PASSWORD + valueFrom: + secretKeyRef: + name: {{ template "redis.secretName" . }} + key: {{ template "redis.secretPasswordKey" . }} + {{- end }} + {{- end }} + {{- if .Values.tls.enabled }} + - name: REDIS_ADDR + value: rediss://{{ .Values.metrics.redisTargetHost }}:{{ .Values.replica.containerPorts.redis }} + {{- if .Values.tls.authClients }} + - name: REDIS_EXPORTER_TLS_CLIENT_KEY_FILE + value: {{ template "redis.tlsCertKey" . }} + - name: REDIS_EXPORTER_TLS_CLIENT_CERT_FILE + value: {{ template "redis.tlsCert" . }} + {{- end }} + - name: REDIS_EXPORTER_TLS_CA_CERT_FILE + value: {{ template "redis.tlsCACert" . }} + {{- end }} + {{- if .Values.metrics.extraEnvVars }} + {{- include "common.tplvalues.render" (dict "value" .Values.metrics.extraEnvVars "context" $) | nindent 12 }} + {{- end }} + ports: + - name: metrics + containerPort: 9121 + {{- if not .Values.diagnosticMode.enabled }} + {{- if .Values.metrics.customStartupProbe }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customStartupProbe "context" $) | nindent 12 }} + {{- else if .Values.metrics.startupProbe.enabled }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.startupProbe "enabled") "context" $) | nindent 12 }} + tcpSocket: + port: metrics + {{- end }} + {{- if .Values.metrics.customLivenessProbe }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customLivenessProbe "context" $) | nindent 12 }} + {{- else if .Values.metrics.livenessProbe.enabled }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.livenessProbe "enabled") "context" $) | nindent 12 }} + tcpSocket: + port: metrics + {{- end }} + {{- if .Values.metrics.customReadinessProbe }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customReadinessProbe "context" $) | nindent 12 }} + {{- else if .Values.metrics.readinessProbe.enabled }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.readinessProbe "enabled") "context" $) | nindent 12 }} + httpGet: + path: / + port: metrics + {{- end }} + {{- end }} + {{- if .Values.metrics.resources }} + resources: {{- toYaml .Values.metrics.resources | nindent 12 }} + {{- end }} + volumeMounts: + {{- if .Values.auth.usePasswordFiles }} + - name: redis-password + mountPath: /secrets/ + {{- end }} + {{- if .Values.tls.enabled }} + - name: redis-certificates + mountPath: /opt/bitnami/redis/certs + readOnly: true + {{- end }} + {{- if .Values.metrics.extraVolumeMounts }} + {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.extraVolumeMounts "context" $ ) | nindent 12 }} + {{- end }} + {{- end }} + {{- if .Values.replica.sidecars }} + {{- include "common.tplvalues.render" (dict "value" .Values.replica.sidecars "context" $) | nindent 8 }} + {{- end }} + {{- $needsVolumePermissions := and .Values.volumePermissions.enabled .Values.replica.persistence.enabled .Values.replica.podSecurityContext.enabled .Values.replica.containerSecurityContext.enabled }} + {{- if or .Values.replica.initContainers $needsVolumePermissions .Values.sysctl.enabled }} + initContainers: + {{- if .Values.replica.initContainers }} + {{- include "common.tplvalues.render" (dict "value" .Values.replica.initContainers "context" $) | nindent 8 }} + {{- end }} + {{- if $needsVolumePermissions }} + - name: volume-permissions + image: {{ include "redis.volumePermissions.image" . }} + imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }} + command: + - /bin/bash + - -ec + - | + {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} + chown -R `id -u`:`id -G | cut -d " " -f2` {{ .Values.replica.persistence.path }} + {{- else }} + chown -R {{ .Values.replica.containerSecurityContext.runAsUser }}:{{ .Values.replica.podSecurityContext.fsGroup }} {{ .Values.replica.persistence.path }} + {{- end }} + {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} + securityContext: {{- omit .Values.volumePermissions.containerSecurityContext "runAsUser" | toYaml | nindent 12 }} + {{- else }} + securityContext: {{- .Values.volumePermissions.containerSecurityContext | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.volumePermissions.resources }} + resources: {{- toYaml .Values.volumePermissions.resources | nindent 12 }} + {{- end }} + volumeMounts: + - name: redis-data + mountPath: {{ .Values.replica.persistence.path }} + {{- if .Values.replica.persistence.subPath }} + subPath: {{ .Values.replica.persistence.subPath }} + {{- else if .Values.replica.persistence.subPathExpr }} + subPathExpr: {{ .Values.replica.persistence.subPathExpr }} + {{- end }} + {{- end }} + {{- if .Values.sysctl.enabled }} + - name: init-sysctl + image: {{ include "redis.sysctl.image" . }} + imagePullPolicy: {{ default "" .Values.sysctl.image.pullPolicy | quote }} + securityContext: + privileged: true + runAsUser: 0 + {{- if .Values.sysctl.command }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.sysctl.command "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.sysctl.resources }} + resources: {{- toYaml .Values.sysctl.resources | nindent 12 }} + {{- end }} + {{- if .Values.sysctl.mountHostSys }} + volumeMounts: + - name: host-sys + mountPath: /host-sys + {{- end }} + {{- end }} + {{- end }} + volumes: + - name: start-scripts + configMap: + name: {{ printf "%s-scripts" (include "common.names.fullname" .) }} + defaultMode: 0755 + - name: health + configMap: + name: {{ printf "%s-health" (include "common.names.fullname" .) }} + defaultMode: 0755 + {{- if .Values.auth.usePasswordFiles }} + - name: redis-password + secret: + secretName: {{ template "redis.secretName" . }} + items: + - key: {{ template "redis.secretPasswordKey" . }} + path: redis-password + {{- end }} + - name: config + configMap: + name: {{ include "redis.configmapName" . }} + {{- if .Values.sysctl.mountHostSys }} + - name: host-sys + hostPath: + path: /sys + {{- end }} + {{- if not .Values.sentinel.persistence.enabled }} + - name: sentinel-data + {{- if or .Values.sentinel.persistence.medium .Values.sentinel.persistence.sizeLimit }} + emptyDir: + {{- if .Values.sentinel.persistence.medium }} + medium: {{ .Values.sentinel.persistence.medium | quote }} + {{- end }} + {{- if .Values.sentinel.persistence.sizeLimit }} + sizeLimit: {{ .Values.sentinel.persistence.sizeLimit | quote }} + {{- end }} + {{- else }} + emptyDir: {} + {{- end }} + {{- end }} + - name: redis-tmp-conf + {{- if or .Values.sentinel.persistence.medium .Values.sentinel.persistence.sizeLimit }} + emptyDir: + {{- if .Values.sentinel.persistence.medium }} + medium: {{ .Values.sentinel.persistence.medium | quote }} + {{- end }} + {{- if .Values.sentinel.persistence.sizeLimit }} + sizeLimit: {{ .Values.sentinel.persistence.sizeLimit | quote }} + {{- end }} + {{- else }} + emptyDir: {} + {{- end }} + - name: tmp + {{- if or .Values.sentinel.persistence.medium .Values.sentinel.persistence.sizeLimit }} + emptyDir: + {{- if .Values.sentinel.persistence.medium }} + medium: {{ .Values.sentinel.persistence.medium | quote }} + {{- end }} + {{- if .Values.sentinel.persistence.sizeLimit }} + sizeLimit: {{ .Values.sentinel.persistence.sizeLimit | quote }} + {{- end }} + {{- else }} + emptyDir: {} + {{- end }} + {{- if .Values.replica.extraVolumes }} + {{- include "common.tplvalues.render" ( dict "value" .Values.replica.extraVolumes "context" $ ) | nindent 8 }} + {{- end }} + {{- if .Values.metrics.extraVolumes }} + {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.extraVolumes "context" $ ) | nindent 8 }} + {{- end }} + {{- if .Values.sentinel.extraVolumes }} + {{- include "common.tplvalues.render" ( dict "value" .Values.sentinel.extraVolumes "context" $ ) | nindent 8 }} + {{- end }} + {{- if .Values.tls.enabled }} + - name: redis-certificates + secret: + secretName: {{ include "redis.tlsSecretName" . }} + defaultMode: 256 + {{- end }} + {{- if not .Values.replica.persistence.enabled }} + - name: redis-data + {{- if or .Values.replica.persistence.medium .Values.replica.persistence.sizeLimit }} + emptyDir: + {{- if .Values.replica.persistence.medium }} + medium: {{ .Values.replica.persistence.medium | quote }} + {{- end }} + {{- if .Values.replica.persistence.sizeLimit }} + sizeLimit: {{ .Values.replica.persistence.sizeLimit | quote }} + {{- end }} + {{- else }} + emptyDir: {} + {{- end }} + {{- else if .Values.replica.persistence.existingClaim }} + - name: redis-data + persistentVolumeClaim: + claimName: {{ printf "%s" (tpl .Values.replica.persistence.existingClaim .) }} + {{- else }} + {{- if .Values.sentinel.persistentVolumeClaimRetentionPolicy.enabled }} + persistentVolumeClaimRetentionPolicy: + whenDeleted: {{ .Values.sentinel.persistentVolumeClaimRetentionPolicy.whenDeleted }} + whenScaled: {{ .Values.sentinel.persistentVolumeClaimRetentionPolicy.whenScaled }} + {{- end }} + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: redis-data + labels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 10 }} + app.kubernetes.io/component: node + {{- if .Values.replica.persistence.annotations }} + annotations: {{- toYaml .Values.replica.persistence.annotations | nindent 10 }} + {{- end }} + spec: + accessModes: + {{- range .Values.replica.persistence.accessModes }} + - {{ . | quote }} + {{- end }} + resources: + requests: + storage: {{ .Values.replica.persistence.size | quote }} + {{- if .Values.replica.persistence.selector }} + selector: {{- include "common.tplvalues.render" ( dict "value" .Values.replica.persistence.selector "context" $) | nindent 10 }} + {{- end }} + {{- include "common.storage.class" (dict "persistence" .Values.replica.persistence "global" .Values.global) | nindent 8 }} + {{- if .Values.sentinel.persistence.enabled }} + - metadata: + name: sentinel-data + {{- $claimLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.sentinel.persistence.labels .Values.commonLabels ) "context" . ) }} + labels: {{- include "common.labels.matchLabels" ( dict "customLabels" $claimLabels "context" $ ) | nindent 10 }} + app.kubernetes.io/component: node + {{- if .Values.sentinel.persistence.annotations }} + annotations: {{- toYaml .Values.sentinel.persistence.annotations | nindent 10 }} + {{- end }} + spec: + accessModes: + {{- range .Values.sentinel.persistence.accessModes }} + - {{ . | quote }} + {{- end }} + resources: + requests: + storage: {{ .Values.sentinel.persistence.size | quote }} + {{- if .Values.sentinel.persistence.selector }} + selector: {{- include "common.tplvalues.render" ( dict "value" .Values.sentinel.persistence.selector "context" $) | nindent 10 }} + {{- end }} + {{- if .Values.sentinel.persistence.dataSource }} + dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.sentinel.persistence.dataSource "context" $) | nindent 10 }} + {{- end }} + {{- include "common.storage.class" (dict "persistence" .Values.sentinel.persistence "global" .Values.global) | nindent 8 }} + {{- end }} + {{- end }} +{{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/serviceaccount.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/serviceaccount.yaml new file mode 100644 index 000000000..ac343a8fb --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/serviceaccount.yaml @@ -0,0 +1,18 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.serviceAccount.create .Values.sentinel.enabled }} +apiVersion: v1 +kind: ServiceAccount +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +metadata: + name: {{ template "redis.serviceAccountName" . }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if or .Values.commonAnnotations .Values.serviceAccount.annotations }} + {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.serviceAccount.annotations .Values.commonAnnotations ) "context" . ) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/servicemonitor.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/servicemonitor.yaml new file mode 100644 index 000000000..757c87001 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/servicemonitor.yaml @@ -0,0 +1,70 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ template "common.names.fullname" . }} + namespace: {{ default (include "common.names.namespace" .) .Values.metrics.serviceMonitor.namespace | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.metrics.serviceMonitor.additionalLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.additionalLabels "context" $) | nindent 4 }} + {{- end }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + endpoints: + - port: http-metrics + {{- if .Values.metrics.serviceMonitor.interval }} + interval: {{ .Values.metrics.serviceMonitor.interval }} + {{- end }} + {{- if .Values.metrics.serviceMonitor.scrapeTimeout }} + scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }} + {{- end }} + {{- if .Values.metrics.serviceMonitor.honorLabels }} + honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }} + {{- end }} + {{- if .Values.metrics.serviceMonitor.relabellings }} + relabelings: {{- toYaml .Values.metrics.serviceMonitor.relabellings | nindent 6 }} + {{- end }} + {{- if .Values.metrics.serviceMonitor.metricRelabelings }} + metricRelabelings: {{- toYaml .Values.metrics.serviceMonitor.metricRelabelings | nindent 6 }} + {{- end }} + {{- range .Values.metrics.serviceMonitor.additionalEndpoints }} + - port: {{ .port }} + {{- if .interval }} + interval: {{ .interval }} + {{- end }} + {{- if .path }} + path: {{ .path }} + {{- end }} + {{- if .params }} + params: + {{- range $key, $value := .params }} + {{ $key }}: + {{- range $value }} + - {{ . | quote }} + {{- end }} + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.metrics.serviceMonitor.podTargetLabels }} + podTargetLabels: {{- toYaml .Values.metrics.serviceMonitor.podTargetLabels | nindent 4 }} + {{- end }} + {{- with .Values.metrics.serviceMonitor.sampleLimit }} + sampleLimit: {{ . }} + {{- end }} + {{- with .Values.metrics.serviceMonitor.targetLimit }} + targetLimit: {{ . }} + {{- end }} + namespaceSelector: + matchNames: + - {{ include "common.names.namespace" . | quote }} + selector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 6 }} + app.kubernetes.io/component: metrics +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/tls-secret.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/tls-secret.yaml new file mode 100644 index 000000000..8498394fe --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/templates/tls-secret.yaml @@ -0,0 +1,31 @@ +{{- /* +Copyright VMware, Inc. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if (include "redis.createTlsSecret" .) }} +{{- $secretName := printf "%s-crt" (include "common.names.fullname" .) }} +{{- $ca := genCA "redis-ca" 365 }} +{{- $releaseNamespace := (include "common.names.namespace" .) }} +{{- $clusterDomain := .Values.clusterDomain }} +{{- $fullname := include "common.names.fullname" . }} +{{- $serviceName := include "common.names.fullname" . }} +{{- $headlessServiceName := printf "%s-headless" (include "common.names.fullname" .) }} +{{- $masterServiceName := printf "%s-master" (include "common.names.fullname" .) }} +{{- $altNames := list (printf "*.%s.%s.svc.%s" $serviceName $releaseNamespace $clusterDomain) (printf "%s.%s.svc.%s" $masterServiceName $releaseNamespace $clusterDomain) (printf "*.%s.%s.svc.%s" $masterServiceName $releaseNamespace $clusterDomain) (printf "*.%s.%s.svc.%s" $headlessServiceName $releaseNamespace $clusterDomain) (printf "%s.%s.svc.%s" $headlessServiceName $releaseNamespace $clusterDomain) "127.0.0.1" "localhost" $fullname }} +{{- $cert := genSignedCert $fullname nil $altNames 365 $ca }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ $secretName }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +type: kubernetes.io/tls +data: + tls.crt: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "tls.crt" "defaultValue" $cert.Cert "context" $) }} + tls.key: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "tls.key" "defaultValue" $cert.Key "context" $) }} + ca.crt: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "ca.crt" "defaultValue" $ca.Cert "context" $) }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/values.schema.json b/thunder_deployment/infra/beta9/charts/redis/values.schema.json new file mode 100644 index 000000000..e9feba6ad --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/values.schema.json @@ -0,0 +1,163 @@ +{ + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "architecture": { + "type": "string", + "title": "Redis architecture", + "form": true, + "description": "Allowed values: `standalone` or `replication`", + "enum": ["standalone", "replication"] + }, + "auth": { + "type": "object", + "title": "Authentication configuration", + "form": true, + "properties": { + "enabled": { + "type": "boolean", + "form": true, + "title": "Use password authentication" + }, + "password": { + "type": "string", + "title": "Redis password", + "form": true, + "description": "Defaults to a random 10-character alphanumeric string if not set", + "hidden": { + "value": false, + "path": "auth/enabled" + } + } + } + }, + "master": { + "type": "object", + "title": "Master replicas settings", + "form": true, + "properties": { + "kind": { + "type": "string", + "title": "Workload Kind", + "form": true, + "description": "Allowed values: `Deployment`, `StatefulSet` or `DaemonSet`", + "enum": ["Deployment", "StatefulSet", "DaemonSet"] + }, + "persistence": { + "type": "object", + "title": "Persistence for master replicas", + "form": true, + "properties": { + "enabled": { + "type": "boolean", + "form": true, + "title": "Enable persistence", + "description": "Enable persistence using Persistent Volume Claims" + }, + "size": { + "type": "string", + "title": "Persistent Volume Size", + "form": true, + "render": "slider", + "sliderMin": 1, + "sliderMax": 100, + "sliderUnit": "Gi", + "hidden": { + "value": false, + "path": "master/persistence/enabled" + } + } + } + } + } + }, + "replica": { + "type": "object", + "title": "Redis replicas settings", + "form": true, + "hidden": { + "value": "standalone", + "path": "architecture" + }, + "properties": { + "kind": { + "type": "string", + "title": "Workload Kind", + "form": true, + "description": "Allowed values: `DaemonSet` or `StatefulSet`", + "enum": ["DaemonSet", "StatefulSet"] + }, + "replicaCount": { + "type": "integer", + "form": true, + "title": "Number of Redis replicas" + }, + "persistence": { + "type": "object", + "title": "Persistence for Redis replicas", + "form": true, + "properties": { + "enabled": { + "type": "boolean", + "form": true, + "title": "Enable persistence", + "description": "Enable persistence using Persistent Volume Claims" + }, + "size": { + "type": "string", + "title": "Persistent Volume Size", + "form": true, + "render": "slider", + "sliderMin": 1, + "sliderMax": 100, + "sliderUnit": "Gi", + "hidden": { + "value": false, + "path": "replica/persistence/enabled" + } + } + } + } + } + }, + "volumePermissions": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "form": true, + "title": "Enable Init Containers", + "description": "Use an init container to set required folder permissions on the data volume before mounting it in the final destination" + } + } + }, + "metrics": { + "type": "object", + "form": true, + "title": "Prometheus metrics details", + "properties": { + "enabled": { + "type": "boolean", + "title": "Create Prometheus metrics exporter", + "description": "Create a side-car container to expose Prometheus metrics", + "form": true + }, + "serviceMonitor": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Create Prometheus Operator ServiceMonitor", + "description": "Create a ServiceMonitor to track metrics using Prometheus Operator", + "form": true, + "hidden": { + "value": false, + "path": "metrics/enabled" + } + } + } + } + } + } + } +} diff --git a/thunder_deployment/infra/beta9/charts/redis/values.yaml b/thunder_deployment/infra/beta9/charts/redis/values.yaml new file mode 100644 index 000000000..4183f460b --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/redis/values.yaml @@ -0,0 +1,2006 @@ +# Copyright VMware, Inc. +# SPDX-License-Identifier: APACHE-2.0 + +## @section Global parameters +## Global Docker image parameters +## Please, note that this will override the image parameters, including dependencies, configured to use the global value +## Current available global Docker image parameters: imageRegistry, imagePullSecrets and storageClass +## + +## @param global.imageRegistry Global Docker image registry +## @param global.imagePullSecrets Global Docker registry secret names as an array +## @param global.storageClass Global StorageClass for Persistent Volume(s) +## @param global.redis.password Global Redis® password (overrides `auth.password`) +## +global: + imageRegistry: "" + ## E.g. + ## imagePullSecrets: + ## - myRegistryKeySecretName + ## + imagePullSecrets: [] + storageClass: "" + redis: + password: "" + +## @section Common parameters +## + +## @param kubeVersion Override Kubernetes version +## +kubeVersion: "" +## @param nameOverride String to partially override common.names.fullname +## +nameOverride: "" +## @param fullnameOverride String to fully override common.names.fullname +## +fullnameOverride: "" +## @param namespaceOverride String to fully override common.names.namespace +## +namespaceOverride: "" +## @param commonLabels Labels to add to all deployed objects +## +commonLabels: {} +## @param commonAnnotations Annotations to add to all deployed objects +## +commonAnnotations: {} +## @param secretAnnotations Annotations to add to secret +## +secretAnnotations: {} +## @param clusterDomain Kubernetes cluster domain name +## +clusterDomain: cluster.local +## @param extraDeploy Array of extra objects to deploy with the release +## +extraDeploy: [] +## @param useHostnames Use hostnames internally when announcing replication. If false, the hostname will be resolved to an IP address +## +useHostnames: true +## @param nameResolutionThreshold Failure threshold for internal hostnames resolution +## +nameResolutionThreshold: 5 +## @param nameResolutionTimeout Timeout seconds between probes for internal hostnames resolution +## +nameResolutionTimeout: 5 + +## Enable diagnostic mode in the deployment +## +diagnosticMode: + ## @param diagnosticMode.enabled Enable diagnostic mode (all probes will be disabled and the command will be overridden) + ## + enabled: false + ## @param diagnosticMode.command Command to override all containers in the deployment + ## + command: + - sleep + ## @param diagnosticMode.args Args to override all containers in the deployment + ## + args: + - infinity + +## @section Redis® Image parameters +## + +## Bitnami Redis® image +## ref: https://hub.docker.com/r/bitnami/redis/tags/ +## @param image.registry [default: REGISTRY_NAME] Redis® image registry +## @param image.repository [default: REPOSITORY_NAME/redis] Redis® image repository +## @skip image.tag Redis® image tag (immutable tags are recommended) +## @param image.digest Redis® image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag +## @param image.pullPolicy Redis® image pull policy +## @param image.pullSecrets Redis® image pull secrets +## @param image.debug Enable image debug mode +## +image: + registry: docker.io + repository: bitnami/redis + tag: 7.2.4-debian-11-r2 + digest: "" + ## Specify a imagePullPolicy + ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images + ## + pullPolicy: IfNotPresent + ## Optionally specify an array of imagePullSecrets. + ## Secrets must be manually created in the namespace. + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + ## e.g: + ## pullSecrets: + ## - myRegistryKeySecretName + ## + pullSecrets: [] + ## Enable debug mode + ## + debug: false + +## @section Redis® common configuration parameters +## https://github.com/bitnami/containers/tree/main/bitnami/redis#configuration +## + +## @param architecture Redis® architecture. Allowed values: `standalone` or `replication` +## +architecture: replication +## Redis® Authentication parameters +## ref: https://github.com/bitnami/containers/tree/main/bitnami/redis#setting-the-server-password-on-first-run +## +auth: + ## @param auth.enabled Enable password authentication + ## + enabled: true + ## @param auth.sentinel Enable password authentication on sentinels too + ## + sentinel: true + ## @param auth.password Redis® password + ## Defaults to a random 10-character alphanumeric string if not set + ## + password: "" + ## @param auth.existingSecret The name of an existing secret with Redis® credentials + ## NOTE: When it's set, the previous `auth.password` parameter is ignored + ## + existingSecret: "" + ## @param auth.existingSecretPasswordKey Password key to be retrieved from existing secret + ## NOTE: ignored unless `auth.existingSecret` parameter is set + ## + existingSecretPasswordKey: "" + ## @param auth.usePasswordFiles Mount credentials as files instead of using an environment variable + ## + usePasswordFiles: false + +## @param commonConfiguration [string] Common configuration to be added into the ConfigMap +## ref: https://redis.io/topics/config +## +commonConfiguration: |- + # Enable AOF https://redis.io/topics/persistence#append-only-file + appendonly yes + # Disable RDB persistence, AOF persistence already enabled. + save "" +## @param existingConfigmap The name of an existing ConfigMap with your custom configuration for Redis® nodes +## +existingConfigmap: "" + +## @section Redis® master configuration parameters +## + +master: + ## @param master.count Number of Redis® master instances to deploy (experimental, requires additional configuration) + ## + count: 1 + ## @param master.configuration Configuration for Redis® master nodes + ## ref: https://redis.io/topics/config + ## + configuration: "" + ## @param master.disableCommands Array with Redis® commands to disable on master nodes + ## Commands will be completely disabled by renaming each to an empty string. + ## ref: https://redis.io/topics/security#disabling-of-specific-commands + ## + disableCommands: + - FLUSHDB + - FLUSHALL + ## @param master.command Override default container command (useful when using custom images) + ## + command: [] + ## @param master.args Override default container args (useful when using custom images) + ## + args: [] + ## @param master.enableServiceLinks Whether information about services should be injected into pod's environment variable + ## + enableServiceLinks: true + ## @param master.preExecCmds Additional commands to run prior to starting Redis® master + ## + preExecCmds: [] + ## @param master.extraFlags Array with additional command line flags for Redis® master + ## e.g: + ## extraFlags: + ## - "--maxmemory-policy volatile-ttl" + ## - "--repl-backlog-size 1024mb" + ## + extraFlags: [] + ## @param master.extraEnvVars Array with extra environment variables to add to Redis® master nodes + ## e.g: + ## extraEnvVars: + ## - name: FOO + ## value: "bar" + ## + extraEnvVars: [] + ## @param master.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for Redis® master nodes + ## + extraEnvVarsCM: "" + ## @param master.extraEnvVarsSecret Name of existing Secret containing extra env vars for Redis® master nodes + ## + extraEnvVarsSecret: "" + ## @param master.containerPorts.redis Container port to open on Redis® master nodes + ## + containerPorts: + redis: 6379 + ## Configure extra options for Redis® containers' liveness and readiness probes + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes + ## @param master.startupProbe.enabled Enable startupProbe on Redis® master nodes + ## @param master.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe + ## @param master.startupProbe.periodSeconds Period seconds for startupProbe + ## @param master.startupProbe.timeoutSeconds Timeout seconds for startupProbe + ## @param master.startupProbe.failureThreshold Failure threshold for startupProbe + ## @param master.startupProbe.successThreshold Success threshold for startupProbe + ## + startupProbe: + enabled: false + initialDelaySeconds: 20 + periodSeconds: 5 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 5 + ## @param master.livenessProbe.enabled Enable livenessProbe on Redis® master nodes + ## @param master.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe + ## @param master.livenessProbe.periodSeconds Period seconds for livenessProbe + ## @param master.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe + ## @param master.livenessProbe.failureThreshold Failure threshold for livenessProbe + ## @param master.livenessProbe.successThreshold Success threshold for livenessProbe + ## + livenessProbe: + enabled: true + initialDelaySeconds: 20 + periodSeconds: 5 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 5 + ## @param master.readinessProbe.enabled Enable readinessProbe on Redis® master nodes + ## @param master.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe + ## @param master.readinessProbe.periodSeconds Period seconds for readinessProbe + ## @param master.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe + ## @param master.readinessProbe.failureThreshold Failure threshold for readinessProbe + ## @param master.readinessProbe.successThreshold Success threshold for readinessProbe + ## + readinessProbe: + enabled: true + initialDelaySeconds: 20 + periodSeconds: 5 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 5 + ## @param master.customStartupProbe Custom startupProbe that overrides the default one + ## + customStartupProbe: {} + ## @param master.customLivenessProbe Custom livenessProbe that overrides the default one + ## + customLivenessProbe: {} + ## @param master.customReadinessProbe Custom readinessProbe that overrides the default one + ## + customReadinessProbe: {} + ## Redis® master resource requests and limits + ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + ## @param master.resources.limits The resources limits for the Redis® master containers + ## @param master.resources.requests The requested resources for the Redis® master containers + ## + resources: + limits: {} + requests: {} + ## Configure Pods Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod + ## @param master.podSecurityContext.enabled Enabled Redis® master pods' Security Context + ## @param master.podSecurityContext.fsGroupChangePolicy Set filesystem group change policy + ## @param master.podSecurityContext.sysctls Set kernel settings using the sysctl interface + ## @param master.podSecurityContext.supplementalGroups Set filesystem extra groups + ## @param master.podSecurityContext.fsGroup Set Redis® master pod's Security Context fsGroup + ## + podSecurityContext: + enabled: true + fsGroupChangePolicy: Always + sysctls: [] + supplementalGroups: [] + fsGroup: 1001 + ## Configure Container Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod + ## @param master.containerSecurityContext.enabled Enabled Redis® master containers' Security Context + ## @param master.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container + ## @param master.containerSecurityContext.runAsUser Set Redis® master containers' Security Context runAsUser + ## @param master.containerSecurityContext.runAsGroup Set Redis® master containers' Security Context runAsGroup + ## @param master.containerSecurityContext.runAsNonRoot Set Redis® master containers' Security Context runAsNonRoot + ## @param master.containerSecurityContext.allowPrivilegeEscalation Is it possible to escalate Redis® pod(s) privileges + ## @param master.containerSecurityContext.seccompProfile.type Set Redis® master containers' Security Context seccompProfile + ## @param master.containerSecurityContext.capabilities.drop Set Redis® master containers' Security Context capabilities to drop + ## + containerSecurityContext: + enabled: true + seLinuxOptions: null + runAsUser: 1001 + runAsGroup: 0 + runAsNonRoot: true + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + capabilities: + drop: + - ALL + ## @param master.kind Use either Deployment, StatefulSet (default) or DaemonSet + ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/ + ## + kind: StatefulSet + ## @param master.schedulerName Alternate scheduler for Redis® master pods + ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ + ## + schedulerName: "" + ## @param master.updateStrategy.type Redis® master statefulset strategy type + ## @skip master.updateStrategy.rollingUpdate + ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies + ## + updateStrategy: + ## StrategyType + ## Can be set to RollingUpdate, OnDelete (statefulset), Recreate (deployment) + ## + type: RollingUpdate + ## @param master.minReadySeconds How many seconds a pod needs to be ready before killing the next, during update + ## + minReadySeconds: 0 + ## @param master.priorityClassName Redis® master pods' priorityClassName + ## + priorityClassName: "" + ## @param master.automountServiceAccountToken Mount Service Account token in pod + ## + automountServiceAccountToken: false + ## @param master.hostAliases Redis® master pods host aliases + ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ + ## + hostAliases: [] + ## @param master.podLabels Extra labels for Redis® master pods + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ + ## + podLabels: {} + ## @param master.podAnnotations Annotations for Redis® master pods + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + ## + podAnnotations: {} + ## @param master.shareProcessNamespace Share a single process namespace between all of the containers in Redis® master pods + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/ + ## + shareProcessNamespace: false + ## @param master.podAffinityPreset Pod affinity preset. Ignored if `master.affinity` is set. Allowed values: `soft` or `hard` + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity + ## + podAffinityPreset: "" + ## @param master.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `master.affinity` is set. Allowed values: `soft` or `hard` + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity + ## + podAntiAffinityPreset: soft + ## Node master.affinity preset + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity + ## + nodeAffinityPreset: + ## @param master.nodeAffinityPreset.type Node affinity preset type. Ignored if `master.affinity` is set. Allowed values: `soft` or `hard` + ## + type: "" + ## @param master.nodeAffinityPreset.key Node label key to match. Ignored if `master.affinity` is set + ## + key: "" + ## @param master.nodeAffinityPreset.values Node label values to match. Ignored if `master.affinity` is set + ## E.g. + ## values: + ## - e2e-az1 + ## - e2e-az2 + ## + values: [] + ## @param master.affinity Affinity for Redis® master pods assignment + ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity + ## NOTE: `master.podAffinityPreset`, `master.podAntiAffinityPreset`, and `master.nodeAffinityPreset` will be ignored when it's set + ## + affinity: {} + ## @param master.nodeSelector Node labels for Redis® master pods assignment + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ + ## + nodeSelector: {} + ## @param master.tolerations Tolerations for Redis® master pods assignment + ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + ## + tolerations: [] + ## @param master.topologySpreadConstraints Spread Constraints for Redis® master pod assignment + ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ + ## E.g. + ## topologySpreadConstraints: + ## - maxSkew: 1 + ## topologyKey: node + ## whenUnsatisfiable: DoNotSchedule + ## + topologySpreadConstraints: [] + ## @param master.dnsPolicy DNS Policy for Redis® master pod + ## ref: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/ + ## E.g. + ## dnsPolicy: ClusterFirst + ## + dnsPolicy: "" + ## @param master.dnsConfig DNS Configuration for Redis® master pod + ## ref: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/ + ## E.g. + ## dnsConfig: + ## options: + ## - name: ndots + ## value: "4" + ## - name: single-request-reopen + ## + dnsConfig: {} + ## @param master.lifecycleHooks for the Redis® master container(s) to automate configuration before or after startup + ## + lifecycleHooks: {} + ## @param master.extraVolumes Optionally specify extra list of additional volumes for the Redis® master pod(s) + ## + extraVolumes: [] + ## @param master.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the Redis® master container(s) + ## + extraVolumeMounts: [] + ## @param master.sidecars Add additional sidecar containers to the Redis® master pod(s) + ## e.g: + ## sidecars: + ## - name: your-image-name + ## image: your-image + ## imagePullPolicy: Always + ## ports: + ## - name: portname + ## containerPort: 1234 + ## + sidecars: [] + ## @param master.initContainers Add additional init containers to the Redis® master pod(s) + ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ + ## e.g: + ## initContainers: + ## - name: your-image-name + ## image: your-image + ## imagePullPolicy: Always + ## command: ['sh', '-c', 'echo "hello world"'] + ## + initContainers: [] + ## Persistence parameters + ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ + ## + persistence: + ## @param master.persistence.enabled Enable persistence on Redis® master nodes using Persistent Volume Claims + ## + enabled: true + ## @param master.persistence.medium Provide a medium for `emptyDir` volumes. + ## + medium: "" + ## @param master.persistence.sizeLimit Set this to enable a size limit for `emptyDir` volumes. + ## + sizeLimit: "" + ## @param master.persistence.path The path the volume will be mounted at on Redis® master containers + ## NOTE: Useful when using different Redis® images + ## + path: /data + ## @param master.persistence.subPath The subdirectory of the volume to mount on Redis® master containers + ## NOTE: Useful in dev environments + ## + subPath: "" + ## @param master.persistence.subPathExpr Used to construct the subPath subdirectory of the volume to mount on Redis® master containers + ## + subPathExpr: "" + ## @param master.persistence.storageClass Persistent Volume storage class + ## If defined, storageClassName: + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner + ## + storageClass: "" + ## @param master.persistence.accessModes Persistent Volume access modes + ## + accessModes: + - ReadWriteOnce + ## @param master.persistence.size Persistent Volume size + ## + size: 8Gi + ## @param master.persistence.annotations Additional custom annotations for the PVC + ## + annotations: {} + ## @param master.persistence.labels Additional custom labels for the PVC + ## + labels: {} + ## @param master.persistence.selector Additional labels to match for the PVC + ## e.g: + ## selector: + ## matchLabels: + ## app: my-app + ## + selector: {} + ## @param master.persistence.dataSource Custom PVC data source + ## + dataSource: {} + ## @param master.persistence.existingClaim Use a existing PVC which must be created manually before bound + ## NOTE: requires master.persistence.enabled: true + ## + existingClaim: "" + ## persistentVolumeClaimRetentionPolicy + ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention + ## @param master.persistentVolumeClaimRetentionPolicy.enabled Controls if and how PVCs are deleted during the lifecycle of a StatefulSet + ## @param master.persistentVolumeClaimRetentionPolicy.whenScaled Volume retention behavior when the replica count of the StatefulSet is reduced + ## @param master.persistentVolumeClaimRetentionPolicy.whenDeleted Volume retention behavior that applies when the StatefulSet is deleted + ## + persistentVolumeClaimRetentionPolicy: + enabled: false + whenScaled: Retain + whenDeleted: Retain + ## Redis® master service parameters + ## + service: + ## @param master.service.type Redis® master service type + ## + type: ClusterIP + ## @param master.service.ports.redis Redis® master service port + ## + ports: + redis: 6379 + ## @param master.service.nodePorts.redis Node port for Redis® master + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport + ## NOTE: choose port between <30000-32767> + ## + nodePorts: + redis: "" + ## @param master.service.externalTrafficPolicy Redis® master service external traffic policy + ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + ## + externalTrafficPolicy: Cluster + ## @param master.service.extraPorts Extra ports to expose (normally used with the `sidecar` value) + ## + extraPorts: [] + ## @param master.service.internalTrafficPolicy Redis® master service internal traffic policy (requires Kubernetes v1.22 or greater to be usable) + ## ref: https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/ + ## + internalTrafficPolicy: Cluster + ## @param master.service.clusterIP Redis® master service Cluster IP + ## + clusterIP: "" + ## @param master.service.loadBalancerIP Redis® master service Load Balancer IP + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer + ## + loadBalancerIP: "" + ## @param master.service.loadBalancerClass master service Load Balancer class if service type is `LoadBalancer` (optional, cloud specific) + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer + ## + loadBalancerClass: "" + ## @param master.service.loadBalancerSourceRanges Redis® master service Load Balancer sources + ## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service + ## e.g. + ## loadBalancerSourceRanges: + ## - 10.10.10.0/24 + ## + loadBalancerSourceRanges: [] + ## @param master.service.externalIPs Redis® master service External IPs + ## https://kubernetes.io/docs/concepts/services-networking/service/#external-ips + ## e.g. + ## externalIPs: + ## - 10.10.10.1 + ## - 201.22.30.1 + ## + externalIPs: [] + ## @param master.service.annotations Additional custom annotations for Redis® master service + ## + annotations: {} + ## @param master.service.sessionAffinity Session Affinity for Kubernetes service, can be "None" or "ClientIP" + ## If "ClientIP", consecutive client requests will be directed to the same Pod + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies + ## + sessionAffinity: None + ## @param master.service.sessionAffinityConfig Additional settings for the sessionAffinity + ## sessionAffinityConfig: + ## clientIP: + ## timeoutSeconds: 300 + ## + sessionAffinityConfig: {} + ## @param master.terminationGracePeriodSeconds Integer setting the termination grace period for the redis-master pods + ## + terminationGracePeriodSeconds: 30 + ## ServiceAccount configuration + ## + serviceAccount: + ## @param master.serviceAccount.create Specifies whether a ServiceAccount should be created + ## + create: true + ## @param master.serviceAccount.name The name of the ServiceAccount to use. + ## If not set and create is true, a name is generated using the common.names.fullname template + ## + name: "" + ## @param master.serviceAccount.automountServiceAccountToken Whether to auto mount the service account token + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server + ## + automountServiceAccountToken: false + ## @param master.serviceAccount.annotations Additional custom annotations for the ServiceAccount + ## + annotations: {} + +## @section Redis® replicas configuration parameters +## + +replica: + ## @param replica.kind Use either DaemonSet or StatefulSet (default) + ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/ + ## + kind: StatefulSet + ## @param replica.replicaCount Number of Redis® replicas to deploy + ## + replicaCount: 3 + ## @param replica.configuration Configuration for Redis® replicas nodes + ## ref: https://redis.io/topics/config + ## + configuration: "" + ## @param replica.disableCommands Array with Redis® commands to disable on replicas nodes + ## Commands will be completely disabled by renaming each to an empty string. + ## ref: https://redis.io/topics/security#disabling-of-specific-commands + ## + disableCommands: + - FLUSHDB + - FLUSHALL + ## @param replica.command Override default container command (useful when using custom images) + ## + command: [] + ## @param replica.args Override default container args (useful when using custom images) + ## + args: [] + ## @param replica.enableServiceLinks Whether information about services should be injected into pod's environment variable + ## + enableServiceLinks: true + ## @param replica.preExecCmds Additional commands to run prior to starting Redis® replicas + ## + preExecCmds: [] + ## @param replica.extraFlags Array with additional command line flags for Redis® replicas + ## e.g: + ## extraFlags: + ## - "--maxmemory-policy volatile-ttl" + ## - "--repl-backlog-size 1024mb" + ## + extraFlags: [] + ## @param replica.extraEnvVars Array with extra environment variables to add to Redis® replicas nodes + ## e.g: + ## extraEnvVars: + ## - name: FOO + ## value: "bar" + ## + extraEnvVars: [] + ## @param replica.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for Redis® replicas nodes + ## + extraEnvVarsCM: "" + ## @param replica.extraEnvVarsSecret Name of existing Secret containing extra env vars for Redis® replicas nodes + ## + extraEnvVarsSecret: "" + ## @param replica.externalMaster.enabled Use external master for bootstrapping + ## @param replica.externalMaster.host External master host to bootstrap from + ## @param replica.externalMaster.port Port for Redis service external master host + ## + externalMaster: + enabled: false + host: "" + port: 6379 + ## @param replica.containerPorts.redis Container port to open on Redis® replicas nodes + ## + containerPorts: + redis: 6379 + ## Configure extra options for Redis® containers' liveness and readiness probes + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes + ## @param replica.startupProbe.enabled Enable startupProbe on Redis® replicas nodes + ## @param replica.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe + ## @param replica.startupProbe.periodSeconds Period seconds for startupProbe + ## @param replica.startupProbe.timeoutSeconds Timeout seconds for startupProbe + ## @param replica.startupProbe.failureThreshold Failure threshold for startupProbe + ## @param replica.startupProbe.successThreshold Success threshold for startupProbe + ## + startupProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 22 + ## @param replica.livenessProbe.enabled Enable livenessProbe on Redis® replicas nodes + ## @param replica.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe + ## @param replica.livenessProbe.periodSeconds Period seconds for livenessProbe + ## @param replica.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe + ## @param replica.livenessProbe.failureThreshold Failure threshold for livenessProbe + ## @param replica.livenessProbe.successThreshold Success threshold for livenessProbe + ## + livenessProbe: + enabled: true + initialDelaySeconds: 20 + periodSeconds: 5 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 5 + ## @param replica.readinessProbe.enabled Enable readinessProbe on Redis® replicas nodes + ## @param replica.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe + ## @param replica.readinessProbe.periodSeconds Period seconds for readinessProbe + ## @param replica.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe + ## @param replica.readinessProbe.failureThreshold Failure threshold for readinessProbe + ## @param replica.readinessProbe.successThreshold Success threshold for readinessProbe + ## + readinessProbe: + enabled: true + initialDelaySeconds: 20 + periodSeconds: 5 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 5 + ## @param replica.customStartupProbe Custom startupProbe that overrides the default one + ## + customStartupProbe: {} + ## @param replica.customLivenessProbe Custom livenessProbe that overrides the default one + ## + customLivenessProbe: {} + ## @param replica.customReadinessProbe Custom readinessProbe that overrides the default one + ## + customReadinessProbe: {} + ## Redis® replicas resource requests and limits + ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + ## @param replica.resources.limits The resources limits for the Redis® replicas containers + ## @param replica.resources.requests The requested resources for the Redis® replicas containers + ## + resources: + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + limits: {} + # cpu: 250m + # memory: 256Mi + requests: {} + # cpu: 250m + # memory: 256Mi + ## Configure Pods Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod + ## @param replica.podSecurityContext.enabled Enabled Redis® replicas pods' Security Context + ## @param replica.podSecurityContext.fsGroupChangePolicy Set filesystem group change policy + ## @param replica.podSecurityContext.sysctls Set kernel settings using the sysctl interface + ## @param replica.podSecurityContext.supplementalGroups Set filesystem extra groups + ## @param replica.podSecurityContext.fsGroup Set Redis® replicas pod's Security Context fsGroup + ## + podSecurityContext: + enabled: true + fsGroupChangePolicy: Always + sysctls: [] + supplementalGroups: [] + fsGroup: 1001 + ## Configure Container Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod + ## @param replica.containerSecurityContext.enabled Enabled Redis® replicas containers' Security Context + ## @param replica.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container + ## @param replica.containerSecurityContext.runAsUser Set Redis® replicas containers' Security Context runAsUser + ## @param replica.containerSecurityContext.runAsGroup Set Redis® replicas containers' Security Context runAsGroup + ## @param replica.containerSecurityContext.runAsNonRoot Set Redis® replicas containers' Security Context runAsNonRoot + ## @param replica.containerSecurityContext.allowPrivilegeEscalation Set Redis® replicas pod's Security Context allowPrivilegeEscalation + ## @param replica.containerSecurityContext.seccompProfile.type Set Redis® replicas containers' Security Context seccompProfile + ## @param replica.containerSecurityContext.capabilities.drop Set Redis® replicas containers' Security Context capabilities to drop + ## + containerSecurityContext: + enabled: true + seLinuxOptions: null + runAsUser: 1001 + runAsGroup: 0 + runAsNonRoot: true + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + capabilities: + drop: + - ALL + ## @param replica.schedulerName Alternate scheduler for Redis® replicas pods + ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ + ## + schedulerName: "" + ## @param replica.updateStrategy.type Redis® replicas statefulset strategy type + ## @skip replica.updateStrategy.rollingUpdate + ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies + ## + updateStrategy: + ## StrategyType + ## Can be set to RollingUpdate, OnDelete (statefulset), Recreate (deployment) + ## + type: RollingUpdate + ## @param replica.minReadySeconds How many seconds a pod needs to be ready before killing the next, during update + ## + minReadySeconds: 0 + ## @param replica.priorityClassName Redis® replicas pods' priorityClassName + ## + priorityClassName: "" + ## @param replica.podManagementPolicy podManagementPolicy to manage scaling operation of %%MAIN_CONTAINER_NAME%% pods + ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-management-policies + ## + podManagementPolicy: "" + ## @param replica.automountServiceAccountToken Mount Service Account token in pod + ## + automountServiceAccountToken: false + ## @param replica.hostAliases Redis® replicas pods host aliases + ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ + ## + hostAliases: [] + ## @param replica.podLabels Extra labels for Redis® replicas pods + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ + ## + podLabels: {} + ## @param replica.podAnnotations Annotations for Redis® replicas pods + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + ## + podAnnotations: {} + ## @param replica.shareProcessNamespace Share a single process namespace between all of the containers in Redis® replicas pods + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/ + ## + shareProcessNamespace: false + ## @param replica.podAffinityPreset Pod affinity preset. Ignored if `replica.affinity` is set. Allowed values: `soft` or `hard` + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity + ## + podAffinityPreset: "" + ## @param replica.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `replica.affinity` is set. Allowed values: `soft` or `hard` + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity + ## + podAntiAffinityPreset: soft + ## Node affinity preset + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity + ## + nodeAffinityPreset: + ## @param replica.nodeAffinityPreset.type Node affinity preset type. Ignored if `replica.affinity` is set. Allowed values: `soft` or `hard` + ## + type: "" + ## @param replica.nodeAffinityPreset.key Node label key to match. Ignored if `replica.affinity` is set + ## + key: "" + ## @param replica.nodeAffinityPreset.values Node label values to match. Ignored if `replica.affinity` is set + ## E.g. + ## values: + ## - e2e-az1 + ## - e2e-az2 + ## + values: [] + ## @param replica.affinity Affinity for Redis® replicas pods assignment + ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity + ## NOTE: `replica.podAffinityPreset`, `replica.podAntiAffinityPreset`, and `replica.nodeAffinityPreset` will be ignored when it's set + ## + affinity: {} + ## @param replica.nodeSelector Node labels for Redis® replicas pods assignment + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ + ## + nodeSelector: {} + ## @param replica.tolerations Tolerations for Redis® replicas pods assignment + ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + ## + tolerations: [] + ## @param replica.topologySpreadConstraints Spread Constraints for Redis® replicas pod assignment + ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ + ## E.g. + ## topologySpreadConstraints: + ## - maxSkew: 1 + ## topologyKey: node + ## whenUnsatisfiable: DoNotSchedule + ## + topologySpreadConstraints: [] + ## @param replica.dnsPolicy DNS Policy for Redis® replica pods + ## ref: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/ + ## E.g. + ## dnsPolicy: ClusterFirst + ## + dnsPolicy: "" + ## @param replica.dnsConfig DNS Configuration for Redis® replica pods + ## ref: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/ + ## E.g. + ## dnsConfig: + ## options: + ## - name: ndots + ## value: "4" + ## - name: single-request-reopen + ## + dnsConfig: {} + ## @param replica.lifecycleHooks for the Redis® replica container(s) to automate configuration before or after startup + ## + lifecycleHooks: {} + ## @param replica.extraVolumes Optionally specify extra list of additional volumes for the Redis® replicas pod(s) + ## + extraVolumes: [] + ## @param replica.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the Redis® replicas container(s) + ## + extraVolumeMounts: [] + ## @param replica.sidecars Add additional sidecar containers to the Redis® replicas pod(s) + ## e.g: + ## sidecars: + ## - name: your-image-name + ## image: your-image + ## imagePullPolicy: Always + ## ports: + ## - name: portname + ## containerPort: 1234 + ## + sidecars: [] + ## @param replica.initContainers Add additional init containers to the Redis® replicas pod(s) + ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ + ## e.g: + ## initContainers: + ## - name: your-image-name + ## image: your-image + ## imagePullPolicy: Always + ## command: ['sh', '-c', 'echo "hello world"'] + ## + initContainers: [] + ## Persistence Parameters + ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ + ## + persistence: + ## @param replica.persistence.enabled Enable persistence on Redis® replicas nodes using Persistent Volume Claims + ## + enabled: true + ## @param replica.persistence.medium Provide a medium for `emptyDir` volumes. + ## + medium: "" + ## @param replica.persistence.sizeLimit Set this to enable a size limit for `emptyDir` volumes. + ## + sizeLimit: "" + ## @param replica.persistence.path The path the volume will be mounted at on Redis® replicas containers + ## NOTE: Useful when using different Redis® images + ## + path: /data + ## @param replica.persistence.subPath The subdirectory of the volume to mount on Redis® replicas containers + ## NOTE: Useful in dev environments + ## + subPath: "" + ## @param replica.persistence.subPathExpr Used to construct the subPath subdirectory of the volume to mount on Redis® replicas containers + ## + subPathExpr: "" + ## @param replica.persistence.storageClass Persistent Volume storage class + ## If defined, storageClassName: + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner + ## + storageClass: "" + ## @param replica.persistence.accessModes Persistent Volume access modes + ## + accessModes: + - ReadWriteOnce + ## @param replica.persistence.size Persistent Volume size + ## + size: 8Gi + ## @param replica.persistence.annotations Additional custom annotations for the PVC + ## + annotations: {} + ## @param replica.persistence.labels Additional custom labels for the PVC + ## + labels: {} + ## @param replica.persistence.selector Additional labels to match for the PVC + ## e.g: + ## selector: + ## matchLabels: + ## app: my-app + ## + selector: {} + ## @param replica.persistence.dataSource Custom PVC data source + ## + dataSource: {} + ## @param replica.persistence.existingClaim Use a existing PVC which must be created manually before bound + ## NOTE: requires replica.persistence.enabled: true + ## + existingClaim: "" + ## persistentVolumeClaimRetentionPolicy + ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention + ## @param replica.persistentVolumeClaimRetentionPolicy.enabled Controls if and how PVCs are deleted during the lifecycle of a StatefulSet + ## @param replica.persistentVolumeClaimRetentionPolicy.whenScaled Volume retention behavior when the replica count of the StatefulSet is reduced + ## @param replica.persistentVolumeClaimRetentionPolicy.whenDeleted Volume retention behavior that applies when the StatefulSet is deleted + ## + persistentVolumeClaimRetentionPolicy: + enabled: false + whenScaled: Retain + whenDeleted: Retain + ## Redis® replicas service parameters + ## + service: + ## @param replica.service.type Redis® replicas service type + ## + type: ClusterIP + ## @param replica.service.ports.redis Redis® replicas service port + ## + ports: + redis: 6379 + ## @param replica.service.nodePorts.redis Node port for Redis® replicas + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport + ## NOTE: choose port between <30000-32767> + ## + nodePorts: + redis: "" + ## @param replica.service.externalTrafficPolicy Redis® replicas service external traffic policy + ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + ## + externalTrafficPolicy: Cluster + ## @param replica.service.internalTrafficPolicy Redis® replicas service internal traffic policy (requires Kubernetes v1.22 or greater to be usable) + ## ref: https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/ + ## + internalTrafficPolicy: Cluster + ## @param replica.service.extraPorts Extra ports to expose (normally used with the `sidecar` value) + ## + extraPorts: [] + ## @param replica.service.clusterIP Redis® replicas service Cluster IP + ## + clusterIP: "" + ## @param replica.service.loadBalancerIP Redis® replicas service Load Balancer IP + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer + ## + loadBalancerIP: "" + ## @param replica.service.loadBalancerClass replicas service Load Balancer class if service type is `LoadBalancer` (optional, cloud specific) + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer + ## + loadBalancerClass: "" + ## @param replica.service.loadBalancerSourceRanges Redis® replicas service Load Balancer sources + ## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service + ## e.g. + ## loadBalancerSourceRanges: + ## - 10.10.10.0/24 + ## + loadBalancerSourceRanges: [] + ## @param replica.service.annotations Additional custom annotations for Redis® replicas service + ## + annotations: {} + ## @param replica.service.sessionAffinity Session Affinity for Kubernetes service, can be "None" or "ClientIP" + ## If "ClientIP", consecutive client requests will be directed to the same Pod + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies + ## + sessionAffinity: None + ## @param replica.service.sessionAffinityConfig Additional settings for the sessionAffinity + ## sessionAffinityConfig: + ## clientIP: + ## timeoutSeconds: 300 + ## + sessionAffinityConfig: {} + ## @param replica.terminationGracePeriodSeconds Integer setting the termination grace period for the redis-replicas pods + ## + terminationGracePeriodSeconds: 30 + ## Autoscaling configuration + ## + autoscaling: + ## @param replica.autoscaling.enabled Enable replica autoscaling settings + ## + enabled: false + ## @param replica.autoscaling.minReplicas Minimum replicas for the pod autoscaling + ## + minReplicas: 1 + ## @param replica.autoscaling.maxReplicas Maximum replicas for the pod autoscaling + ## + maxReplicas: 11 + ## @param replica.autoscaling.targetCPU Percentage of CPU to consider when autoscaling + ## + targetCPU: "" + ## @param replica.autoscaling.targetMemory Percentage of Memory to consider when autoscaling + ## + targetMemory: "" + ## ServiceAccount configuration + ## + serviceAccount: + ## @param replica.serviceAccount.create Specifies whether a ServiceAccount should be created + ## + create: true + ## @param replica.serviceAccount.name The name of the ServiceAccount to use. + ## If not set and create is true, a name is generated using the common.names.fullname template + ## + name: "" + ## @param replica.serviceAccount.automountServiceAccountToken Whether to auto mount the service account token + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server + ## + automountServiceAccountToken: false + ## @param replica.serviceAccount.annotations Additional custom annotations for the ServiceAccount + ## + annotations: {} +## @section Redis® Sentinel configuration parameters +## + +sentinel: + ## @param sentinel.enabled Use Redis® Sentinel on Redis® pods. + ## IMPORTANT: this will disable the master and replicas services and + ## create a single Redis® service exposing both the Redis and Sentinel ports + ## + enabled: false + ## Bitnami Redis® Sentinel image version + ## ref: https://hub.docker.com/r/bitnami/redis-sentinel/tags/ + ## @param sentinel.image.registry [default: REGISTRY_NAME] Redis® Sentinel image registry + ## @param sentinel.image.repository [default: REPOSITORY_NAME/redis-sentinel] Redis® Sentinel image repository + ## @skip sentinel.image.tag Redis® Sentinel image tag (immutable tags are recommended) + ## @param sentinel.image.digest Redis® Sentinel image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag + ## @param sentinel.image.pullPolicy Redis® Sentinel image pull policy + ## @param sentinel.image.pullSecrets Redis® Sentinel image pull secrets + ## @param sentinel.image.debug Enable image debug mode + ## + image: + registry: docker.io + repository: bitnami/redis-sentinel + tag: 7.2.4-debian-11-r3 + digest: "" + ## Specify a imagePullPolicy + ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images + ## + pullPolicy: IfNotPresent + ## Optionally specify an array of imagePullSecrets. + ## Secrets must be manually created in the namespace. + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + ## e.g: + ## pullSecrets: + ## - myRegistryKeySecretName + ## + pullSecrets: [] + ## Enable debug mode + ## + debug: false + ## @param sentinel.annotations Additional custom annotations for Redis® Sentinel resource + ## + annotations: {} + ## @param sentinel.masterSet Master set name + ## + masterSet: mymaster + ## @param sentinel.quorum Sentinel Quorum + ## + quorum: 2 + ## @param sentinel.getMasterTimeout Amount of time to allow before get_sentinel_master_info() times out. + ## + getMasterTimeout: 90 + ## @param sentinel.automateClusterRecovery Automate cluster recovery in cases where the last replica is not considered a good replica and Sentinel won't automatically failover to it. + ## This also prevents any new replica from starting until the last remaining replica is elected as master to guarantee that it is the one to be elected by Sentinel, and not a newly started replica with no data. + ## NOTE: This feature requires a "downAfterMilliseconds" value less or equal to 2000. + ## + automateClusterRecovery: false + ## @param sentinel.redisShutdownWaitFailover Whether the Redis® master container waits for the failover at shutdown (in addition to the Redis® Sentinel container). + ## + redisShutdownWaitFailover: true + ## Sentinel timing restrictions + ## @param sentinel.downAfterMilliseconds Timeout for detecting a Redis® node is down + ## @param sentinel.failoverTimeout Timeout for performing a election failover + ## + downAfterMilliseconds: 60000 + failoverTimeout: 180000 + ## @param sentinel.parallelSyncs Number of replicas that can be reconfigured in parallel to use the new master after a failover + ## + parallelSyncs: 1 + ## @param sentinel.configuration Configuration for Redis® Sentinel nodes + ## ref: https://redis.io/topics/sentinel + ## + configuration: "" + ## @param sentinel.command Override default container command (useful when using custom images) + ## + command: [] + ## @param sentinel.args Override default container args (useful when using custom images) + ## + args: [] + ## @param sentinel.enableServiceLinks Whether information about services should be injected into pod's environment variable + ## + enableServiceLinks: true + ## @param sentinel.preExecCmds Additional commands to run prior to starting Redis® Sentinel + ## + preExecCmds: [] + ## @param sentinel.extraEnvVars Array with extra environment variables to add to Redis® Sentinel nodes + ## e.g: + ## extraEnvVars: + ## - name: FOO + ## value: "bar" + ## + extraEnvVars: [] + ## @param sentinel.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for Redis® Sentinel nodes + ## + extraEnvVarsCM: "" + ## @param sentinel.extraEnvVarsSecret Name of existing Secret containing extra env vars for Redis® Sentinel nodes + ## + extraEnvVarsSecret: "" + ## @param sentinel.externalMaster.enabled Use external master for bootstrapping + ## @param sentinel.externalMaster.host External master host to bootstrap from + ## @param sentinel.externalMaster.port Port for Redis service external master host + ## + externalMaster: + enabled: false + host: "" + port: 6379 + ## @param sentinel.containerPorts.sentinel Container port to open on Redis® Sentinel nodes + ## + containerPorts: + sentinel: 26379 + ## Configure extra options for Redis® containers' liveness and readiness probes + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes + ## @param sentinel.startupProbe.enabled Enable startupProbe on Redis® Sentinel nodes + ## @param sentinel.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe + ## @param sentinel.startupProbe.periodSeconds Period seconds for startupProbe + ## @param sentinel.startupProbe.timeoutSeconds Timeout seconds for startupProbe + ## @param sentinel.startupProbe.failureThreshold Failure threshold for startupProbe + ## @param sentinel.startupProbe.successThreshold Success threshold for startupProbe + ## + startupProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 22 + ## @param sentinel.livenessProbe.enabled Enable livenessProbe on Redis® Sentinel nodes + ## @param sentinel.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe + ## @param sentinel.livenessProbe.periodSeconds Period seconds for livenessProbe + ## @param sentinel.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe + ## @param sentinel.livenessProbe.failureThreshold Failure threshold for livenessProbe + ## @param sentinel.livenessProbe.successThreshold Success threshold for livenessProbe + ## + livenessProbe: + enabled: true + initialDelaySeconds: 20 + periodSeconds: 10 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 6 + ## @param sentinel.readinessProbe.enabled Enable readinessProbe on Redis® Sentinel nodes + ## @param sentinel.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe + ## @param sentinel.readinessProbe.periodSeconds Period seconds for readinessProbe + ## @param sentinel.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe + ## @param sentinel.readinessProbe.failureThreshold Failure threshold for readinessProbe + ## @param sentinel.readinessProbe.successThreshold Success threshold for readinessProbe + ## + readinessProbe: + enabled: true + initialDelaySeconds: 20 + periodSeconds: 5 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 6 + ## @param sentinel.customStartupProbe Custom startupProbe that overrides the default one + ## + customStartupProbe: {} + ## @param sentinel.customLivenessProbe Custom livenessProbe that overrides the default one + ## + customLivenessProbe: {} + ## @param sentinel.customReadinessProbe Custom readinessProbe that overrides the default one + ## + customReadinessProbe: {} + ## Persistence parameters + ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ + ## + persistence: + ## @param sentinel.persistence.enabled Enable persistence on Redis® sentinel nodes using Persistent Volume Claims (Experimental) + ## + enabled: false + ## @param sentinel.persistence.storageClass Persistent Volume storage class + ## If defined, storageClassName: + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner + ## + storageClass: "" + ## @param sentinel.persistence.accessModes Persistent Volume access modes + ## + accessModes: + - ReadWriteOnce + ## @param sentinel.persistence.size Persistent Volume size + ## + size: 100Mi + ## @param sentinel.persistence.annotations Additional custom annotations for the PVC + ## + annotations: {} + ## @param sentinel.persistence.labels Additional custom labels for the PVC + ## + labels: {} + ## @param sentinel.persistence.selector Additional labels to match for the PVC + ## e.g: + ## selector: + ## matchLabels: + ## app: my-app + ## + selector: {} + ## @param sentinel.persistence.dataSource Custom PVC data source + ## + dataSource: {} + ## @param sentinel.persistence.medium Provide a medium for `emptyDir` volumes. + ## + medium: "" + ## @param sentinel.persistence.sizeLimit Set this to enable a size limit for `emptyDir` volumes. + ## + sizeLimit: "" + ## persistentVolumeClaimRetentionPolicy + ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention + ## @param sentinel.persistentVolumeClaimRetentionPolicy.enabled Controls if and how PVCs are deleted during the lifecycle of a StatefulSet + ## @param sentinel.persistentVolumeClaimRetentionPolicy.whenScaled Volume retention behavior when the replica count of the StatefulSet is reduced + ## @param sentinel.persistentVolumeClaimRetentionPolicy.whenDeleted Volume retention behavior that applies when the StatefulSet is deleted + ## + persistentVolumeClaimRetentionPolicy: + enabled: false + whenScaled: Retain + whenDeleted: Retain + ## Redis® Sentinel resource requests and limits + ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + ## @param sentinel.resources.limits The resources limits for the Redis® Sentinel containers + ## @param sentinel.resources.requests The requested resources for the Redis® Sentinel containers + ## + resources: + limits: {} + requests: {} + ## Configure Container Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod + ## @param sentinel.containerSecurityContext.enabled Enabled Redis® Sentinel containers' Security Context + ## @param sentinel.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container + ## @param sentinel.containerSecurityContext.runAsUser Set Redis® Sentinel containers' Security Context runAsUser + ## @param sentinel.containerSecurityContext.runAsGroup Set Redis® Sentinel containers' Security Context runAsGroup + ## @param sentinel.containerSecurityContext.runAsNonRoot Set Redis® Sentinel containers' Security Context runAsNonRoot + ## @param sentinel.containerSecurityContext.allowPrivilegeEscalation Set Redis® Sentinel containers' Security Context allowPrivilegeEscalation + ## @param sentinel.containerSecurityContext.seccompProfile.type Set Redis® Sentinel containers' Security Context seccompProfile + ## @param sentinel.containerSecurityContext.capabilities.drop Set Redis® Sentinel containers' Security Context capabilities to drop + ## + containerSecurityContext: + enabled: true + seLinuxOptions: null + runAsUser: 1001 + runAsGroup: 0 + runAsNonRoot: true + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + capabilities: + drop: + - ALL + ## @param sentinel.lifecycleHooks for the Redis® sentinel container(s) to automate configuration before or after startup + ## + lifecycleHooks: {} + ## @param sentinel.extraVolumes Optionally specify extra list of additional volumes for the Redis® Sentinel + ## + extraVolumes: [] + ## @param sentinel.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the Redis® Sentinel container(s) + ## + extraVolumeMounts: [] + ## Redis® Sentinel service parameters + ## + service: + ## @param sentinel.service.type Redis® Sentinel service type + ## + type: ClusterIP + ## @param sentinel.service.ports.redis Redis® service port for Redis® + ## @param sentinel.service.ports.sentinel Redis® service port for Redis® Sentinel + ## + ports: + redis: 6379 + sentinel: 26379 + ## @param sentinel.service.nodePorts.redis Node port for Redis® + ## @param sentinel.service.nodePorts.sentinel Node port for Sentinel + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport + ## NOTE: choose port between <30000-32767> + ## NOTE: By leaving these values blank, they will be generated by ports-configmap + ## If setting manually, please leave at least replica.replicaCount + 1 in between sentinel.service.nodePorts.redis and sentinel.service.nodePorts.sentinel to take into account the ports that will be created while incrementing that base port + ## + nodePorts: + redis: "" + sentinel: "" + ## @param sentinel.service.externalTrafficPolicy Redis® Sentinel service external traffic policy + ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + ## + externalTrafficPolicy: Cluster + ## @param sentinel.service.extraPorts Extra ports to expose (normally used with the `sidecar` value) + ## + extraPorts: [] + ## @param sentinel.service.clusterIP Redis® Sentinel service Cluster IP + ## + clusterIP: "" + ## @param sentinel.service.loadBalancerIP Redis® Sentinel service Load Balancer IP + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer + ## + loadBalancerIP: "" + ## @param sentinel.service.loadBalancerClass sentinel service Load Balancer class if service type is `LoadBalancer` (optional, cloud specific) + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer + ## + loadBalancerClass: "" + ## @param sentinel.service.loadBalancerSourceRanges Redis® Sentinel service Load Balancer sources + ## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service + ## e.g. + ## loadBalancerSourceRanges: + ## - 10.10.10.0/24 + ## + loadBalancerSourceRanges: [] + ## @param sentinel.service.annotations Additional custom annotations for Redis® Sentinel service + ## + annotations: {} + ## @param sentinel.service.sessionAffinity Session Affinity for Kubernetes service, can be "None" or "ClientIP" + ## If "ClientIP", consecutive client requests will be directed to the same Pod + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies + ## + sessionAffinity: None + ## @param sentinel.service.sessionAffinityConfig Additional settings for the sessionAffinity + ## sessionAffinityConfig: + ## clientIP: + ## timeoutSeconds: 300 + ## + sessionAffinityConfig: {} + ## Headless service properties + ## + headless: + ## @param sentinel.service.headless.annotations Annotations for the headless service. + ## + annotations: {} + ## @param sentinel.terminationGracePeriodSeconds Integer setting the termination grace period for the redis-node pods + ## + terminationGracePeriodSeconds: 30 + +## @section Other Parameters +## + +## @param serviceBindings.enabled Create secret for service binding (Experimental) +## Ref: https://servicebinding.io/service-provider/ +## +serviceBindings: + enabled: false + +## Network Policy configuration +## ref: https://kubernetes.io/docs/concepts/services-networking/network-policies/ +## +networkPolicy: + ## @param networkPolicy.enabled Enable creation of NetworkPolicy resources + ## + enabled: false + ## @param networkPolicy.allowExternal Don't require client label for connections + ## When set to false, only pods with the correct client label will have network access to the ports + ## Redis® is listening on. When true, Redis® will accept connections from any source + ## (with the correct destination port). + ## + allowExternal: true + ## @param networkPolicy.extraIngress Add extra ingress rules to the NetworkPolicy + ## e.g: + ## extraIngress: + ## - ports: + ## - port: 1234 + ## from: + ## - podSelector: + ## - matchLabels: + ## - role: frontend + ## - podSelector: + ## - matchExpressions: + ## - key: role + ## operator: In + ## values: + ## - frontend + ## + extraIngress: [] + ## @param networkPolicy.extraEgress Add extra egress rules to the NetworkPolicy + ## e.g: + ## extraEgress: + ## - ports: + ## - port: 1234 + ## to: + ## - podSelector: + ## - matchLabels: + ## - role: frontend + ## - podSelector: + ## - matchExpressions: + ## - key: role + ## operator: In + ## values: + ## - frontend + ## + extraEgress: [] + ## @param networkPolicy.ingressNSMatchLabels Labels to match to allow traffic from other namespaces + ## @param networkPolicy.ingressNSPodMatchLabels Pod labels to match to allow traffic from other namespaces + ## + ingressNSMatchLabels: {} + ingressNSPodMatchLabels: {} + + metrics: + ## @param networkPolicy.metrics.allowExternal Don't require client label for connections for metrics endpoint + ## When set to false, only pods with the correct client label will have network access to the metrics port + ## + allowExternal: true + ## @param networkPolicy.metrics.ingressNSMatchLabels Labels to match to allow traffic from other namespaces to metrics endpoint + ## @param networkPolicy.metrics.ingressNSPodMatchLabels Pod labels to match to allow traffic from other namespaces to metrics endpoint + ## + ingressNSMatchLabels: {} + ingressNSPodMatchLabels: {} + +## PodSecurityPolicy configuration +## ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/ +## +podSecurityPolicy: + ## @param podSecurityPolicy.create Whether to create a PodSecurityPolicy. WARNING: PodSecurityPolicy is deprecated in Kubernetes v1.21 or later, unavailable in v1.25 or later + ## + create: false + ## @param podSecurityPolicy.enabled Enable PodSecurityPolicy's RBAC rules + ## + enabled: false +## RBAC configuration +## +rbac: + ## @param rbac.create Specifies whether RBAC resources should be created + ## + create: false + ## @param rbac.rules Custom RBAC rules to set + ## e.g: + ## rules: + ## - apiGroups: + ## - "" + ## resources: + ## - pods + ## verbs: + ## - get + ## - list + ## + rules: [] +## ServiceAccount configuration +## +serviceAccount: + ## @param serviceAccount.create Specifies whether a ServiceAccount should be created + ## + create: true + ## @param serviceAccount.name The name of the ServiceAccount to use. + ## If not set and create is true, a name is generated using the common.names.fullname template + ## + name: "" + ## @param serviceAccount.automountServiceAccountToken Whether to auto mount the service account token + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server + ## + automountServiceAccountToken: false + ## @param serviceAccount.annotations Additional custom annotations for the ServiceAccount + ## + annotations: {} +## Redis® Pod Disruption Budget configuration +## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/ +## +pdb: + ## @param pdb.create Specifies whether a PodDisruptionBudget should be created + ## + create: false + ## @param pdb.minAvailable Min number of pods that must still be available after the eviction + ## + minAvailable: 1 + ## @param pdb.maxUnavailable Max number of pods that can be unavailable after the eviction + ## + maxUnavailable: "" +## TLS configuration +## +tls: + ## @param tls.enabled Enable TLS traffic + ## + enabled: false + ## @param tls.authClients Require clients to authenticate + ## + authClients: true + ## @param tls.autoGenerated Enable autogenerated certificates + ## + autoGenerated: false + ## @param tls.existingSecret The name of the existing secret that contains the TLS certificates + ## + existingSecret: "" + ## @param tls.certificatesSecret DEPRECATED. Use existingSecret instead. + ## + certificatesSecret: "" + ## @param tls.certFilename Certificate filename + ## + certFilename: "" + ## @param tls.certKeyFilename Certificate Key filename + ## + certKeyFilename: "" + ## @param tls.certCAFilename CA Certificate filename + ## + certCAFilename: "" + ## @param tls.dhParamsFilename File containing DH params (in order to support DH based ciphers) + ## + dhParamsFilename: "" + +## @section Metrics Parameters +## + +metrics: + ## @param metrics.enabled Start a sidecar prometheus exporter to expose Redis® metrics + ## + enabled: false + ## Bitnami Redis® Exporter image + ## ref: https://hub.docker.com/r/bitnami/redis-exporter/tags/ + ## @param metrics.image.registry [default: REGISTRY_NAME] Redis® Exporter image registry + ## @param metrics.image.repository [default: REPOSITORY_NAME/redis-exporter] Redis® Exporter image repository + ## @skip metrics.image.tag Redis® Exporter image tag (immutable tags are recommended) + ## @param metrics.image.digest Redis® Exporter image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag + ## @param metrics.image.pullPolicy Redis® Exporter image pull policy + ## @param metrics.image.pullSecrets Redis® Exporter image pull secrets + ## + image: + registry: docker.io + repository: bitnami/redis-exporter + tag: 1.56.0-debian-11-r1 + digest: "" + pullPolicy: IfNotPresent + ## Optionally specify an array of imagePullSecrets. + ## Secrets must be manually created in the namespace. + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + ## e.g: + ## pullSecrets: + ## - myRegistryKeySecretName + ## + pullSecrets: [] + ## Configure extra options for Redis® containers' liveness, readiness & startup probes + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/ + ## @param metrics.startupProbe.enabled Enable startupProbe on Redis® replicas nodes + ## @param metrics.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe + ## @param metrics.startupProbe.periodSeconds Period seconds for startupProbe + ## @param metrics.startupProbe.timeoutSeconds Timeout seconds for startupProbe + ## @param metrics.startupProbe.failureThreshold Failure threshold for startupProbe + ## @param metrics.startupProbe.successThreshold Success threshold for startupProbe + ## + startupProbe: + enabled: false + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 5 + ## @param metrics.livenessProbe.enabled Enable livenessProbe on Redis® replicas nodes + ## @param metrics.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe + ## @param metrics.livenessProbe.periodSeconds Period seconds for livenessProbe + ## @param metrics.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe + ## @param metrics.livenessProbe.failureThreshold Failure threshold for livenessProbe + ## @param metrics.livenessProbe.successThreshold Success threshold for livenessProbe + ## + livenessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 5 + ## @param metrics.readinessProbe.enabled Enable readinessProbe on Redis® replicas nodes + ## @param metrics.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe + ## @param metrics.readinessProbe.periodSeconds Period seconds for readinessProbe + ## @param metrics.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe + ## @param metrics.readinessProbe.failureThreshold Failure threshold for readinessProbe + ## @param metrics.readinessProbe.successThreshold Success threshold for readinessProbe + ## + readinessProbe: + enabled: true + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 3 + ## @param metrics.customStartupProbe Custom startupProbe that overrides the default one + ## + customStartupProbe: {} + ## @param metrics.customLivenessProbe Custom livenessProbe that overrides the default one + ## + customLivenessProbe: {} + ## @param metrics.customReadinessProbe Custom readinessProbe that overrides the default one + ## + customReadinessProbe: {} + ## @param metrics.command Override default metrics container init command (useful when using custom images) + ## + command: [] + ## @param metrics.redisTargetHost A way to specify an alternative Redis® hostname + ## Useful for certificate CN/SAN matching + ## + redisTargetHost: "localhost" + ## @param metrics.extraArgs Extra arguments for Redis® exporter, for example: + ## e.g.: + ## extraArgs: + ## check-keys: myKey,myOtherKey + ## + extraArgs: {} + ## @param metrics.extraEnvVars Array with extra environment variables to add to Redis® exporter + ## e.g: + ## extraEnvVars: + ## - name: FOO + ## value: "bar" + ## + extraEnvVars: [] + ## Configure Container Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod + ## @param metrics.containerSecurityContext.enabled Enabled Redis® exporter containers' Security Context + ## @param metrics.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container + ## @param metrics.containerSecurityContext.runAsUser Set Redis® exporter containers' Security Context runAsUser + ## @param metrics.containerSecurityContext.runAsGroup Set Redis® exporter containers' Security Context runAsGroup + ## @param metrics.containerSecurityContext.runAsNonRoot Set Redis® exporter containers' Security Context runAsNonRoot + ## @param metrics.containerSecurityContext.allowPrivilegeEscalation Set Redis® exporter containers' Security Context allowPrivilegeEscalation + ## @param metrics.containerSecurityContext.seccompProfile.type Set Redis® exporter containers' Security Context seccompProfile + ## @param metrics.containerSecurityContext.capabilities.drop Set Redis® exporter containers' Security Context capabilities to drop + ## + containerSecurityContext: + enabled: true + seLinuxOptions: null + runAsUser: 1001 + runAsGroup: 0 + runAsNonRoot: true + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + capabilities: + drop: + - ALL + ## @param metrics.extraVolumes Optionally specify extra list of additional volumes for the Redis® metrics sidecar + ## + extraVolumes: [] + ## @param metrics.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the Redis® metrics sidecar + ## + extraVolumeMounts: [] + ## Redis® exporter resource requests and limits + ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + ## @param metrics.resources.limits The resources limits for the Redis® exporter container + ## @param metrics.resources.requests The requested resources for the Redis® exporter container + ## + resources: + limits: {} + requests: {} + ## @param metrics.podLabels Extra labels for Redis® exporter pods + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ + ## + podLabels: {} + ## @param metrics.podAnnotations [object] Annotations for Redis® exporter pods + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + ## + podAnnotations: + prometheus.io/scrape: "true" + prometheus.io/port: "9121" + ## Redis® exporter service parameters + ## + service: + ## @param metrics.service.type Redis® exporter service type + ## + type: ClusterIP + ## @param metrics.service.port Redis® exporter service port + ## + port: 9121 + ## @param metrics.service.externalTrafficPolicy Redis® exporter service external traffic policy + ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + ## + externalTrafficPolicy: Cluster + ## @param metrics.service.extraPorts Extra ports to expose (normally used with the `sidecar` value) + ## + extraPorts: [] + ## @param metrics.service.loadBalancerIP Redis® exporter service Load Balancer IP + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer + ## + loadBalancerIP: "" + ## @param metrics.service.loadBalancerClass exporter service Load Balancer class if service type is `LoadBalancer` (optional, cloud specific) + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer + ## + loadBalancerClass: "" + ## @param metrics.service.loadBalancerSourceRanges Redis® exporter service Load Balancer sources + ## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service + ## e.g. + ## loadBalancerSourceRanges: + ## - 10.10.10.0/24 + ## + loadBalancerSourceRanges: [] + ## @param metrics.service.annotations Additional custom annotations for Redis® exporter service + ## + annotations: {} + ## @param metrics.service.clusterIP Redis® exporter service Cluster IP + ## + clusterIP: "" + ## Prometheus Service Monitor + ## ref: https://github.com/coreos/prometheus-operator + ## https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint + ## + serviceMonitor: + ## @param metrics.serviceMonitor.enabled Create ServiceMonitor resource(s) for scraping metrics using PrometheusOperator + ## + enabled: false + ## @param metrics.serviceMonitor.namespace The namespace in which the ServiceMonitor will be created + ## + namespace: "" + ## @param metrics.serviceMonitor.interval The interval at which metrics should be scraped + ## + interval: 30s + ## @param metrics.serviceMonitor.scrapeTimeout The timeout after which the scrape is ended + ## + scrapeTimeout: "" + ## @param metrics.serviceMonitor.relabellings Metrics RelabelConfigs to apply to samples before scraping. + ## + relabellings: [] + ## @param metrics.serviceMonitor.metricRelabelings Metrics RelabelConfigs to apply to samples before ingestion. + ## + metricRelabelings: [] + ## @param metrics.serviceMonitor.honorLabels Specify honorLabels parameter to add the scrape endpoint + ## + honorLabels: false + ## @param metrics.serviceMonitor.additionalLabels Additional labels that can be used so ServiceMonitor resource(s) can be discovered by Prometheus + ## + additionalLabels: {} + ## @param metrics.serviceMonitor.podTargetLabels Labels from the Kubernetes pod to be transferred to the created metrics + ## + podTargetLabels: [] + ## @param metrics.serviceMonitor.sampleLimit Limit of how many samples should be scraped from every Pod + ## + sampleLimit: false + ## @param metrics.serviceMonitor.targetLimit Limit of how many targets should be scraped + ## + targetLimit: false + ## @param metrics.serviceMonitor.additionalEndpoints Additional endpoints to scrape (e.g sentinel) + ## + additionalEndpoints: [] + # uncomment in order to scrape sentinel metrics + # - port: http-metrics + # interval: 30s + # path: /scrape + # params: + # target: + # - localhost:26379 + ## Prometheus Pod Monitor + ## ref: https://github.com/coreos/prometheus-operator + ## https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#podmonitor + ## + podMonitor: + ## @param metrics.podMonitor.enabled Create PodMonitor resource(s) for scraping metrics using PrometheusOperator + ## + enabled: false + ## @param metrics.podMonitor.namespace The namespace in which the PodMonitor will be created + ## + namespace: "" + ## @param metrics.podMonitor.interval The interval at which metrics should be scraped + ## + interval: 30s + ## @param metrics.podMonitor.scrapeTimeout The timeout after which the scrape is ended + ## + scrapeTimeout: "" + ## @param metrics.podMonitor.relabellings Metrics RelabelConfigs to apply to samples before scraping. + ## + relabellings: [] + ## @param metrics.podMonitor.metricRelabelings Metrics RelabelConfigs to apply to samples before ingestion. + ## + metricRelabelings: [] + ## @param metrics.podMonitor.honorLabels Specify honorLabels parameter to add the scrape endpoint + ## + honorLabels: false + ## @param metrics.podMonitor.additionalLabels Additional labels that can be used so PodMonitor resource(s) can be discovered by Prometheus + ## + additionalLabels: {} + ## @param metrics.podMonitor.podTargetLabels Labels from the Kubernetes pod to be transferred to the created metrics + ## + podTargetLabels: [] + ## @param metrics.podMonitor.sampleLimit Limit of how many samples should be scraped from every Pod + ## + sampleLimit: false + ## @param metrics.podMonitor.targetLimit Limit of how many targets should be scraped + ## + targetLimit: false + ## @param metrics.podMonitor.additionalEndpoints Additional endpoints to scrape (e.g sentinel) + ## + additionalEndpoints: [] + # uncomment in order to scrape sentinel metrics + # - port: metrics + # interval: 30s + # path: /scrape + # params: + # target: + # - localhost:26379 + + ## Custom PrometheusRule to be defined + ## ref: https://github.com/coreos/prometheus-operator#customresourcedefinitions + ## + prometheusRule: + ## @param metrics.prometheusRule.enabled Create a custom prometheusRule Resource for scraping metrics using PrometheusOperator + ## + enabled: false + ## @param metrics.prometheusRule.namespace The namespace in which the prometheusRule will be created + ## + namespace: "" + ## @param metrics.prometheusRule.additionalLabels Additional labels for the prometheusRule + ## + additionalLabels: {} + ## @param metrics.prometheusRule.rules Custom Prometheus rules + ## e.g: + ## rules: + ## - alert: RedisDown + ## expr: redis_up{service="{{ template "common.names.fullname" . }}-metrics"} == 0 + ## for: 2m + ## labels: + ## severity: error + ## annotations: + ## summary: Redis® instance {{ "{{ $labels.instance }}" }} down + ## description: Redis® instance {{ "{{ $labels.instance }}" }} is down + ## - alert: RedisMemoryHigh + ## expr: > + ## redis_memory_used_bytes{service="{{ template "common.names.fullname" . }}-metrics"} * 100 + ## / + ## redis_memory_max_bytes{service="{{ template "common.names.fullname" . }}-metrics"} + ## > 90 + ## for: 2m + ## labels: + ## severity: error + ## annotations: + ## summary: Redis® instance {{ "{{ $labels.instance }}" }} is using too much memory + ## description: | + ## Redis® instance {{ "{{ $labels.instance }}" }} is using {{ "{{ $value }}" }}% of its available memory. + ## - alert: RedisKeyEviction + ## expr: | + ## increase(redis_evicted_keys_total{service="{{ template "common.names.fullname" . }}-metrics"}[5m]) > 0 + ## for: 1s + ## labels: + ## severity: error + ## annotations: + ## summary: Redis® instance {{ "{{ $labels.instance }}" }} has evicted keys + ## description: | + ## Redis® instance {{ "{{ $labels.instance }}" }} has evicted {{ "{{ $value }}" }} keys in the last 5 minutes. + ## + rules: [] + +## @section Init Container Parameters +## + +## 'volumePermissions' init container parameters +## Changes the owner and group of the persistent volume mount point to runAsUser:fsGroup values +## based on the *podSecurityContext/*containerSecurityContext parameters +## +volumePermissions: + ## @param volumePermissions.enabled Enable init container that changes the owner/group of the PV mount point to `runAsUser:fsGroup` + ## + enabled: false + ## OS Shell + Utility image + ## ref: https://hub.docker.com/r/bitnami/os-shell/tags/ + ## @param volumePermissions.image.registry [default: REGISTRY_NAME] OS Shell + Utility image registry + ## @param volumePermissions.image.repository [default: REPOSITORY_NAME/os-shell] OS Shell + Utility image repository + ## @skip volumePermissions.image.tag OS Shell + Utility image tag (immutable tags are recommended) + ## @param volumePermissions.image.digest OS Shell + Utility image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag + ## @param volumePermissions.image.pullPolicy OS Shell + Utility image pull policy + ## @param volumePermissions.image.pullSecrets OS Shell + Utility image pull secrets + ## + image: + registry: docker.io + repository: bitnami/os-shell + tag: 11-debian-11-r94 + digest: "" + pullPolicy: IfNotPresent + ## Optionally specify an array of imagePullSecrets. + ## Secrets must be manually created in the namespace. + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + ## e.g: + ## pullSecrets: + ## - myRegistryKeySecretName + ## + pullSecrets: [] + ## Init container's resource requests and limits + ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + ## @param volumePermissions.resources.limits The resources limits for the init container + ## @param volumePermissions.resources.requests The requested resources for the init container + ## + resources: + limits: {} + requests: {} + ## Init container Container Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container + ## @param volumePermissions.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container + ## @param volumePermissions.containerSecurityContext.runAsUser Set init container's Security Context runAsUser + ## NOTE: when runAsUser is set to special value "auto", init container will try to chown the + ## data folder to auto-determined user&group, using commands: `id -u`:`id -G | cut -d" " -f2` + ## "auto" is especially useful for OpenShift which has scc with dynamic user ids (and 0 is not allowed) + ## + containerSecurityContext: + seLinuxOptions: null + runAsUser: 0 + +## init-sysctl container parameters +## used to perform sysctl operation to modify Kernel settings (needed sometimes to avoid warnings) +## +sysctl: + ## @param sysctl.enabled Enable init container to modify Kernel settings + ## + enabled: false + ## OS Shell + Utility image + ## ref: https://hub.docker.com/r/bitnami/os-shell/tags/ + ## @param sysctl.image.registry [default: REGISTRY_NAME] OS Shell + Utility image registry + ## @param sysctl.image.repository [default: REPOSITORY_NAME/os-shell] OS Shell + Utility image repository + ## @skip sysctl.image.tag OS Shell + Utility image tag (immutable tags are recommended) + ## @param sysctl.image.digest OS Shell + Utility image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag + ## @param sysctl.image.pullPolicy OS Shell + Utility image pull policy + ## @param sysctl.image.pullSecrets OS Shell + Utility image pull secrets + ## + image: + registry: docker.io + repository: bitnami/os-shell + tag: 11-debian-11-r94 + digest: "" + pullPolicy: IfNotPresent + ## Optionally specify an array of imagePullSecrets. + ## Secrets must be manually created in the namespace. + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + ## e.g: + ## pullSecrets: + ## - myRegistryKeySecretName + ## + pullSecrets: [] + ## @param sysctl.command Override default init-sysctl container command (useful when using custom images) + ## + command: [] + ## @param sysctl.mountHostSys Mount the host `/sys` folder to `/host-sys` + ## + mountHostSys: false + ## Init container's resource requests and limits + ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + ## @param sysctl.resources.limits The resources limits for the init container + ## @param sysctl.resources.requests The requested resources for the init container + ## + resources: + limits: {} + requests: {} + +## @section useExternalDNS Parameters +## +## @param useExternalDNS.enabled Enable various syntax that would enable external-dns to work. Note this requires a working installation of `external-dns` to be usable. +## @param useExternalDNS.additionalAnnotations Extra annotations to be utilized when `external-dns` is enabled. +## @param useExternalDNS.annotationKey The annotation key utilized when `external-dns` is enabled. Setting this to `false` will disable annotations. +## @param useExternalDNS.suffix The DNS suffix utilized when `external-dns` is enabled. Note that we prepend the suffix with the full name of the release. +## +useExternalDNS: + enabled: false + suffix: "" + annotationKey: external-dns.alpha.kubernetes.io/ + additionalAnnotations: {} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/.helmignore b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/.helmignore new file mode 100644 index 000000000..0e8a0eb36 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/CHANGELOG.md b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/CHANGELOG.md new file mode 100644 index 000000000..31346f64a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/CHANGELOG.md @@ -0,0 +1,163 @@ +# CHANGELOG for `victoria-metrics-agent` helm-chart + +## Next release + +- TODO + +## 0.9.17 + +**Release date:** 2024-02-01 + +![AppVersion: v1.97.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.97.1&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- bump version of VM components to [v1.97.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.97.1) + +## 0.9.16 + +**Release date:** 2023-12-20 + +![AppVersion: v1.96.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.96.0&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- Add init containers for deployment and statefulset. See [#806](https://github.com/VictoriaMetrics/helm-charts/pull/806) by @MemberIT. + +## 0.9.15 + +**Release date:** 2023-12-13 + +![AppVersion: v1.96.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.96.0&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- Fix configuration of volume mount for license key referenced by using secret. + +## 0.9.14 + +**Release date:** 2023-12-12 + +![AppVersion: v1.96.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.96.0&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- bump version of VM components to [v1.96.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.96.0) + +## 0.9.13 + +**Release date:** 2023-11-16 + +![AppVersion: v1.95.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.95.1&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- bump version of VM components to [v1.95.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.95.1) + +## 0.9.12 + +**Release date:** 2023-11-15 + +![AppVersion: v1.95.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.95.0&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- bump version of VM components to [v1.95.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.95.0) + +## 0.9.11 + +**Release date:** 2023-10-04 + +![AppVersion: v1.94.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.94.0&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- bump version of VM components to [v1.94.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.94.0) +- Add support of providing enterprise license key for VictoriaMetrics enterprise. See [these docs](https://docs.victoriametrics.com/enterprise.html) for details. + +## 0.9.10 + +**Release date:** 2023-09-21 + +![AppVersion: v1.93.5](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.5&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- Bump version of VM components to [v1.93.5](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.93.5) + +## 0.9.9 + +**Release date:** 2023-09-11 + +![AppVersion: v1.93.4](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.4&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- Bump version of VM components to [v1.93.4](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.93.4) + +## 0.9.8 + +**Release date:** 2023-09-04 + +![AppVersion: v1.93.3](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.3&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- Bump version of vmagent to `v1.93.3` + +## 0.9.6 + +**Release date:** 2023-08-30 + +![AppVersion: v1.93.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.1&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +* fix `honor_timestamps` field for cadvisor scrape job (#626) + +## 0.9.5 + +**Release date:** 2023-08-24 + +![AppVersion: v1.93.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.1&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +* Disable `honorTimestamps` for cadvisor scrape job by default (#617) + +## 0.9.4 + +**Release date:** 2023-08-23 + +![AppVersion: v1.93.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.0&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +* Update VictoriaMetrics components from v1.93.0 to v1.93.1 + +## 0.9.3 + +**Release date:** 2023-08-12 + +![AppVersion: v1.93.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.0&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +* Update VictoriaMetrics components from v1.92.1 to v1.93.0 + +## 0.9.2 + +**Release date:** 2023-07-28 + +![AppVersion: v1.92.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.92.1&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +* Update VictoriaMetrics components from v1.92.0 to v1.92.1 (#599) + +## 0.9.1 + +**Release date:** 2023-07-27 + +![AppVersion: v1.92.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.92.0&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +* Update VictoriaMetrics components from v1.91.3 to v1.92.0 +* make package merge gen-docs + +## 0.9.0 + +**Release date:** 2023-07-13 + +![AppVersion: v1.91.3](https://img.shields.io/static/v1?label=AppVersion&message=v1.91.3&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +* bump version of agent, alert, auth, cluster, single +* feat(vmagent): Add support for topologySpreadConstraints field (#583) +* Feat: Add custom objects to vma helm charts (#558) +* fix(vmagent): Use endpoints instead of endpointslices on kubernetes-apiservers (#574) diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/Chart.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/Chart.yaml new file mode 100644 index 000000000..f2acc26f1 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/Chart.yaml @@ -0,0 +1,33 @@ +annotations: + artifacthub.io/category: monitoring-logging + artifacthub.io/changes: '- bump version of VM components to [v1.97.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.97.1)' + artifacthub.io/license: Apache-2.0 + artifacthub.io/links: | + - name: Sources + url: https://github.com/VictoriaMetrics/helm-charts + - name: Charts repo + url: https://victoriametrics.github.io/helm-charts/ + - name: Docs + url: https://docs.victoriametrics.com/vmagent.html +apiVersion: v1 +appVersion: v1.97.1 +description: Victoria Metrics Agent - collects metrics from various sources and stores + them to VictoriaMetrics +home: https://github.com/VictoriaMetrics/helm-charts +icon: https://avatars.githubusercontent.com/u/43720803?s=200&v=4 +keywords: +- victoriametrics +- vmagent +- agent +- collector +- monitoring +- kubernetes +- observability +- metrics +- timeseries +- servicediscovery +kubeVersion: '>=1.23.0-0' +name: victoria-metrics-agent +sources: +- https://github.com/VictoriaMetrics/helm-charts +version: 0.9.17 diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/README.md b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/README.md new file mode 100644 index 000000000..68d5c86b5 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/README.md @@ -0,0 +1,358 @@ +# Helm Chart For Victoria Metrics Agent. + + ![Version: 0.9.17](https://img.shields.io/badge/Version-0.9.17-informational?style=flat-square) +[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/victoriametrics)](https://artifacthub.io/packages/helm/victoriametrics/victoria-metrics-agent) +[![Slack](https://img.shields.io/badge/join%20slack-%23victoriametrics-brightgreen.svg)](https://slack.victoriametrics.com/) + +Victoria Metrics Agent - collects metrics from various sources and stores them to VictoriaMetrics + +## Prerequisites + +* Install the follow packages: ``git``, ``kubectl``, ``helm``, ``helm-docs``. See this [tutorial](../../REQUIREMENTS.md). + +## How to install + +Access a Kubernetes cluster. + +Add a chart helm repository with follow commands: + +```console +helm repo add vm https://victoriametrics.github.io/helm-charts/ + +helm repo update +``` + +List versions of ``vm/victoria-metrics-agent`` chart available to installation: + +```console +helm search repo vm/victoria-metrics-agent -l +``` + +Export default values of ``victoria-metrics-agent`` chart to file ``values.yaml``: + +```console +helm show values vm/victoria-metrics-agent > values.yaml +``` + +Change the values according to the need of the environment in ``values.yaml`` file. + +Test the installation with command: + +```console +helm install vmagent vm/victoria-metrics-agent -f values.yaml -n NAMESPACE --debug --dry-run +``` + +Install chart with command: + +```console +helm install vmagent vm/victoria-metrics-agent -f values.yaml -n NAMESPACE +``` + +Get the pods lists by running this commands: + +```console +kubectl get pods -A | grep 'agent' +``` + +Get the application by running this command: + +```console +helm list -f vmagent -n NAMESPACE +``` + +See the history of versions of ``vmagent`` application with command. + +```console +helm history vmagent -n NAMESPACE +``` + +## How to uninstall + +Remove application with command. + +```console +helm uninstall vmagent -n NAMESPACE +``` + +## Documentation of Helm Chart + +Install ``helm-docs`` following the instructions on this [tutorial](../../REQUIREMENTS.md). + +Generate docs with ``helm-docs`` command. + +```bash +cd charts/victoria-metrics-agent + +helm-docs +``` + +The markdown generation is entirely go template driven. The tool parses metadata from charts and generates a number of sub-templates that can be referenced in a template file (by default ``README.md.gotmpl``). If no template file is provided, the tool has a default internal template that will generate a reasonably formatted README. + +## Parameters + +The following tables lists the configurable parameters of the chart and their default values. + +Change the values according to the need of the environment in ``victoria-metrics-agent/values.yaml`` file. + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| annotations | object | `{}` | | +| config.global.scrape_interval | string | `"10s"` | | +| config.scrape_configs[0].job_name | string | `"vmagent"` | | +| config.scrape_configs[0].static_configs[0].targets[0] | string | `"localhost:8429"` | | +| config.scrape_configs[1].bearer_token_file | string | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | | +| config.scrape_configs[1].job_name | string | `"kubernetes-apiservers"` | | +| config.scrape_configs[1].kubernetes_sd_configs[0].role | string | `"endpoints"` | | +| config.scrape_configs[1].relabel_configs[0].action | string | `"keep"` | | +| config.scrape_configs[1].relabel_configs[0].regex | string | `"default;kubernetes;https"` | | +| config.scrape_configs[1].relabel_configs[0].source_labels[0] | string | `"__meta_kubernetes_namespace"` | | +| config.scrape_configs[1].relabel_configs[0].source_labels[1] | string | `"__meta_kubernetes_service_name"` | | +| config.scrape_configs[1].relabel_configs[0].source_labels[2] | string | `"__meta_kubernetes_endpoint_port_name"` | | +| config.scrape_configs[1].scheme | string | `"https"` | | +| config.scrape_configs[1].tls_config.ca_file | string | `"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"` | | +| config.scrape_configs[1].tls_config.insecure_skip_verify | bool | `true` | | +| config.scrape_configs[2].bearer_token_file | string | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | | +| config.scrape_configs[2].job_name | string | `"kubernetes-nodes"` | | +| config.scrape_configs[2].kubernetes_sd_configs[0].role | string | `"node"` | | +| config.scrape_configs[2].relabel_configs[0].action | string | `"labelmap"` | | +| config.scrape_configs[2].relabel_configs[0].regex | string | `"__meta_kubernetes_node_label_(.+)"` | | +| config.scrape_configs[2].relabel_configs[1].replacement | string | `"kubernetes.default.svc:443"` | | +| config.scrape_configs[2].relabel_configs[1].target_label | string | `"__address__"` | | +| config.scrape_configs[2].relabel_configs[2].regex | string | `"(.+)"` | | +| config.scrape_configs[2].relabel_configs[2].replacement | string | `"/api/v1/nodes/$1/proxy/metrics"` | | +| config.scrape_configs[2].relabel_configs[2].source_labels[0] | string | `"__meta_kubernetes_node_name"` | | +| config.scrape_configs[2].relabel_configs[2].target_label | string | `"__metrics_path__"` | | +| config.scrape_configs[2].scheme | string | `"https"` | | +| config.scrape_configs[2].tls_config.ca_file | string | `"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"` | | +| config.scrape_configs[2].tls_config.insecure_skip_verify | bool | `true` | | +| config.scrape_configs[3].bearer_token_file | string | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | | +| config.scrape_configs[3].honor_timestamps | bool | `false` | | +| config.scrape_configs[3].job_name | string | `"kubernetes-nodes-cadvisor"` | | +| config.scrape_configs[3].kubernetes_sd_configs[0].role | string | `"node"` | | +| config.scrape_configs[3].relabel_configs[0].action | string | `"labelmap"` | | +| config.scrape_configs[3].relabel_configs[0].regex | string | `"__meta_kubernetes_node_label_(.+)"` | | +| config.scrape_configs[3].relabel_configs[1].replacement | string | `"kubernetes.default.svc:443"` | | +| config.scrape_configs[3].relabel_configs[1].target_label | string | `"__address__"` | | +| config.scrape_configs[3].relabel_configs[2].regex | string | `"(.+)"` | | +| config.scrape_configs[3].relabel_configs[2].replacement | string | `"/api/v1/nodes/$1/proxy/metrics/cadvisor"` | | +| config.scrape_configs[3].relabel_configs[2].source_labels[0] | string | `"__meta_kubernetes_node_name"` | | +| config.scrape_configs[3].relabel_configs[2].target_label | string | `"__metrics_path__"` | | +| config.scrape_configs[3].scheme | string | `"https"` | | +| config.scrape_configs[3].tls_config.ca_file | string | `"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"` | | +| config.scrape_configs[3].tls_config.insecure_skip_verify | bool | `true` | | +| config.scrape_configs[4].job_name | string | `"kubernetes-service-endpoints"` | | +| config.scrape_configs[4].kubernetes_sd_configs[0].role | string | `"endpointslices"` | | +| config.scrape_configs[4].relabel_configs[0].action | string | `"drop"` | | +| config.scrape_configs[4].relabel_configs[0].regex | bool | `true` | | +| config.scrape_configs[4].relabel_configs[0].source_labels[0] | string | `"__meta_kubernetes_pod_container_init"` | | +| config.scrape_configs[4].relabel_configs[10].source_labels[0] | string | `"__meta_kubernetes_service_name"` | | +| config.scrape_configs[4].relabel_configs[10].target_label | string | `"service"` | | +| config.scrape_configs[4].relabel_configs[11].replacement | string | `"${1}"` | | +| config.scrape_configs[4].relabel_configs[11].source_labels[0] | string | `"__meta_kubernetes_service_name"` | | +| config.scrape_configs[4].relabel_configs[11].target_label | string | `"job"` | | +| config.scrape_configs[4].relabel_configs[12].action | string | `"replace"` | | +| config.scrape_configs[4].relabel_configs[12].source_labels[0] | string | `"__meta_kubernetes_pod_node_name"` | | +| config.scrape_configs[4].relabel_configs[12].target_label | string | `"node"` | | +| config.scrape_configs[4].relabel_configs[1].action | string | `"keep_if_equal"` | | +| config.scrape_configs[4].relabel_configs[1].source_labels[0] | string | `"__meta_kubernetes_service_annotation_prometheus_io_port"` | | +| config.scrape_configs[4].relabel_configs[1].source_labels[1] | string | `"__meta_kubernetes_pod_container_port_number"` | | +| config.scrape_configs[4].relabel_configs[2].action | string | `"keep"` | | +| config.scrape_configs[4].relabel_configs[2].regex | bool | `true` | | +| config.scrape_configs[4].relabel_configs[2].source_labels[0] | string | `"__meta_kubernetes_service_annotation_prometheus_io_scrape"` | | +| config.scrape_configs[4].relabel_configs[3].action | string | `"replace"` | | +| config.scrape_configs[4].relabel_configs[3].regex | string | `"(https?)"` | | +| config.scrape_configs[4].relabel_configs[3].source_labels[0] | string | `"__meta_kubernetes_service_annotation_prometheus_io_scheme"` | | +| config.scrape_configs[4].relabel_configs[3].target_label | string | `"__scheme__"` | | +| config.scrape_configs[4].relabel_configs[4].action | string | `"replace"` | | +| config.scrape_configs[4].relabel_configs[4].regex | string | `"(.+)"` | | +| config.scrape_configs[4].relabel_configs[4].source_labels[0] | string | `"__meta_kubernetes_service_annotation_prometheus_io_path"` | | +| config.scrape_configs[4].relabel_configs[4].target_label | string | `"__metrics_path__"` | | +| config.scrape_configs[4].relabel_configs[5].action | string | `"replace"` | | +| config.scrape_configs[4].relabel_configs[5].regex | string | `"([^:]+)(?::\\d+)?;(\\d+)"` | | +| config.scrape_configs[4].relabel_configs[5].replacement | string | `"$1:$2"` | | +| config.scrape_configs[4].relabel_configs[5].source_labels[0] | string | `"__address__"` | | +| config.scrape_configs[4].relabel_configs[5].source_labels[1] | string | `"__meta_kubernetes_service_annotation_prometheus_io_port"` | | +| config.scrape_configs[4].relabel_configs[5].target_label | string | `"__address__"` | | +| config.scrape_configs[4].relabel_configs[6].action | string | `"labelmap"` | | +| config.scrape_configs[4].relabel_configs[6].regex | string | `"__meta_kubernetes_service_label_(.+)"` | | +| config.scrape_configs[4].relabel_configs[7].source_labels[0] | string | `"__meta_kubernetes_pod_name"` | | +| config.scrape_configs[4].relabel_configs[7].target_label | string | `"pod"` | | +| config.scrape_configs[4].relabel_configs[8].source_labels[0] | string | `"__meta_kubernetes_pod_container_name"` | | +| config.scrape_configs[4].relabel_configs[8].target_label | string | `"container"` | | +| config.scrape_configs[4].relabel_configs[9].source_labels[0] | string | `"__meta_kubernetes_namespace"` | | +| config.scrape_configs[4].relabel_configs[9].target_label | string | `"namespace"` | | +| config.scrape_configs[5].job_name | string | `"kubernetes-service-endpoints-slow"` | | +| config.scrape_configs[5].kubernetes_sd_configs[0].role | string | `"endpointslices"` | | +| config.scrape_configs[5].relabel_configs[0].action | string | `"drop"` | | +| config.scrape_configs[5].relabel_configs[0].regex | bool | `true` | | +| config.scrape_configs[5].relabel_configs[0].source_labels[0] | string | `"__meta_kubernetes_pod_container_init"` | | +| config.scrape_configs[5].relabel_configs[10].source_labels[0] | string | `"__meta_kubernetes_service_name"` | | +| config.scrape_configs[5].relabel_configs[10].target_label | string | `"service"` | | +| config.scrape_configs[5].relabel_configs[11].replacement | string | `"${1}"` | | +| config.scrape_configs[5].relabel_configs[11].source_labels[0] | string | `"__meta_kubernetes_service_name"` | | +| config.scrape_configs[5].relabel_configs[11].target_label | string | `"job"` | | +| config.scrape_configs[5].relabel_configs[12].action | string | `"replace"` | | +| config.scrape_configs[5].relabel_configs[12].source_labels[0] | string | `"__meta_kubernetes_pod_node_name"` | | +| config.scrape_configs[5].relabel_configs[12].target_label | string | `"node"` | | +| config.scrape_configs[5].relabel_configs[1].action | string | `"keep_if_equal"` | | +| config.scrape_configs[5].relabel_configs[1].source_labels[0] | string | `"__meta_kubernetes_service_annotation_prometheus_io_port"` | | +| config.scrape_configs[5].relabel_configs[1].source_labels[1] | string | `"__meta_kubernetes_pod_container_port_number"` | | +| config.scrape_configs[5].relabel_configs[2].action | string | `"keep"` | | +| config.scrape_configs[5].relabel_configs[2].regex | bool | `true` | | +| config.scrape_configs[5].relabel_configs[2].source_labels[0] | string | `"__meta_kubernetes_service_annotation_prometheus_io_scrape_slow"` | | +| config.scrape_configs[5].relabel_configs[3].action | string | `"replace"` | | +| config.scrape_configs[5].relabel_configs[3].regex | string | `"(https?)"` | | +| config.scrape_configs[5].relabel_configs[3].source_labels[0] | string | `"__meta_kubernetes_service_annotation_prometheus_io_scheme"` | | +| config.scrape_configs[5].relabel_configs[3].target_label | string | `"__scheme__"` | | +| config.scrape_configs[5].relabel_configs[4].action | string | `"replace"` | | +| config.scrape_configs[5].relabel_configs[4].regex | string | `"(.+)"` | | +| config.scrape_configs[5].relabel_configs[4].source_labels[0] | string | `"__meta_kubernetes_service_annotation_prometheus_io_path"` | | +| config.scrape_configs[5].relabel_configs[4].target_label | string | `"__metrics_path__"` | | +| config.scrape_configs[5].relabel_configs[5].action | string | `"replace"` | | +| config.scrape_configs[5].relabel_configs[5].regex | string | `"([^:]+)(?::\\d+)?;(\\d+)"` | | +| config.scrape_configs[5].relabel_configs[5].replacement | string | `"$1:$2"` | | +| config.scrape_configs[5].relabel_configs[5].source_labels[0] | string | `"__address__"` | | +| config.scrape_configs[5].relabel_configs[5].source_labels[1] | string | `"__meta_kubernetes_service_annotation_prometheus_io_port"` | | +| config.scrape_configs[5].relabel_configs[5].target_label | string | `"__address__"` | | +| config.scrape_configs[5].relabel_configs[6].action | string | `"labelmap"` | | +| config.scrape_configs[5].relabel_configs[6].regex | string | `"__meta_kubernetes_service_label_(.+)"` | | +| config.scrape_configs[5].relabel_configs[7].source_labels[0] | string | `"__meta_kubernetes_pod_name"` | | +| config.scrape_configs[5].relabel_configs[7].target_label | string | `"pod"` | | +| config.scrape_configs[5].relabel_configs[8].source_labels[0] | string | `"__meta_kubernetes_pod_container_name"` | | +| config.scrape_configs[5].relabel_configs[8].target_label | string | `"container"` | | +| config.scrape_configs[5].relabel_configs[9].source_labels[0] | string | `"__meta_kubernetes_namespace"` | | +| config.scrape_configs[5].relabel_configs[9].target_label | string | `"namespace"` | | +| config.scrape_configs[5].scrape_interval | string | `"5m"` | | +| config.scrape_configs[5].scrape_timeout | string | `"30s"` | | +| config.scrape_configs[6].job_name | string | `"kubernetes-services"` | | +| config.scrape_configs[6].kubernetes_sd_configs[0].role | string | `"service"` | | +| config.scrape_configs[6].metrics_path | string | `"/probe"` | | +| config.scrape_configs[6].params.module[0] | string | `"http_2xx"` | | +| config.scrape_configs[6].relabel_configs[0].action | string | `"keep"` | | +| config.scrape_configs[6].relabel_configs[0].regex | bool | `true` | | +| config.scrape_configs[6].relabel_configs[0].source_labels[0] | string | `"__meta_kubernetes_service_annotation_prometheus_io_probe"` | | +| config.scrape_configs[6].relabel_configs[1].source_labels[0] | string | `"__address__"` | | +| config.scrape_configs[6].relabel_configs[1].target_label | string | `"__param_target"` | | +| config.scrape_configs[6].relabel_configs[2].replacement | string | `"blackbox"` | | +| config.scrape_configs[6].relabel_configs[2].target_label | string | `"__address__"` | | +| config.scrape_configs[6].relabel_configs[3].source_labels[0] | string | `"__param_target"` | | +| config.scrape_configs[6].relabel_configs[3].target_label | string | `"instance"` | | +| config.scrape_configs[6].relabel_configs[4].action | string | `"labelmap"` | | +| config.scrape_configs[6].relabel_configs[4].regex | string | `"__meta_kubernetes_service_label_(.+)"` | | +| config.scrape_configs[6].relabel_configs[5].source_labels[0] | string | `"__meta_kubernetes_namespace"` | | +| config.scrape_configs[6].relabel_configs[5].target_label | string | `"namespace"` | | +| config.scrape_configs[6].relabel_configs[6].source_labels[0] | string | `"__meta_kubernetes_service_name"` | | +| config.scrape_configs[6].relabel_configs[6].target_label | string | `"service"` | | +| config.scrape_configs[7].job_name | string | `"kubernetes-pods"` | | +| config.scrape_configs[7].kubernetes_sd_configs[0].role | string | `"pod"` | | +| config.scrape_configs[7].relabel_configs[0].action | string | `"drop"` | | +| config.scrape_configs[7].relabel_configs[0].regex | bool | `true` | | +| config.scrape_configs[7].relabel_configs[0].source_labels[0] | string | `"__meta_kubernetes_pod_container_init"` | | +| config.scrape_configs[7].relabel_configs[1].action | string | `"keep_if_equal"` | | +| config.scrape_configs[7].relabel_configs[1].source_labels[0] | string | `"__meta_kubernetes_pod_annotation_prometheus_io_port"` | | +| config.scrape_configs[7].relabel_configs[1].source_labels[1] | string | `"__meta_kubernetes_pod_container_port_number"` | | +| config.scrape_configs[7].relabel_configs[2].action | string | `"keep"` | | +| config.scrape_configs[7].relabel_configs[2].regex | bool | `true` | | +| config.scrape_configs[7].relabel_configs[2].source_labels[0] | string | `"__meta_kubernetes_pod_annotation_prometheus_io_scrape"` | | +| config.scrape_configs[7].relabel_configs[3].action | string | `"replace"` | | +| config.scrape_configs[7].relabel_configs[3].regex | string | `"(.+)"` | | +| config.scrape_configs[7].relabel_configs[3].source_labels[0] | string | `"__meta_kubernetes_pod_annotation_prometheus_io_path"` | | +| config.scrape_configs[7].relabel_configs[3].target_label | string | `"__metrics_path__"` | | +| config.scrape_configs[7].relabel_configs[4].action | string | `"replace"` | | +| config.scrape_configs[7].relabel_configs[4].regex | string | `"([^:]+)(?::\\d+)?;(\\d+)"` | | +| config.scrape_configs[7].relabel_configs[4].replacement | string | `"$1:$2"` | | +| config.scrape_configs[7].relabel_configs[4].source_labels[0] | string | `"__address__"` | | +| config.scrape_configs[7].relabel_configs[4].source_labels[1] | string | `"__meta_kubernetes_pod_annotation_prometheus_io_port"` | | +| config.scrape_configs[7].relabel_configs[4].target_label | string | `"__address__"` | | +| config.scrape_configs[7].relabel_configs[5].action | string | `"labelmap"` | | +| config.scrape_configs[7].relabel_configs[5].regex | string | `"__meta_kubernetes_pod_label_(.+)"` | | +| config.scrape_configs[7].relabel_configs[6].source_labels[0] | string | `"__meta_kubernetes_pod_name"` | | +| config.scrape_configs[7].relabel_configs[6].target_label | string | `"pod"` | | +| config.scrape_configs[7].relabel_configs[7].source_labels[0] | string | `"__meta_kubernetes_pod_container_name"` | | +| config.scrape_configs[7].relabel_configs[7].target_label | string | `"container"` | | +| config.scrape_configs[7].relabel_configs[8].source_labels[0] | string | `"__meta_kubernetes_namespace"` | | +| config.scrape_configs[7].relabel_configs[8].target_label | string | `"namespace"` | | +| config.scrape_configs[7].relabel_configs[9].action | string | `"replace"` | | +| config.scrape_configs[7].relabel_configs[9].source_labels[0] | string | `"__meta_kubernetes_pod_node_name"` | | +| config.scrape_configs[7].relabel_configs[9].target_label | string | `"node"` | | +| configMap | string | `""` | | +| containerWorkingDir | string | `"/"` | | +| deployment.enabled | bool | `true` | | +| deployment.strategy | object | `{}` | | +| env | list | `[]` | Additional environment variables (ex.: secret tokens, flags) https://github.com/VictoriaMetrics/VictoriaMetrics#environment-variables | +| envFrom | list | `[]` | | +| extraArgs."envflag.enable" | string | `"true"` | | +| extraArgs."envflag.prefix" | string | `"VM_"` | | +| extraArgs.loggerFormat | string | `"json"` | | +| extraContainers | list | `[]` | | +| extraHostPathMounts | list | `[]` | | +| extraLabels | object | `{}` | | +| extraObjects | list | `[]` | | +| extraScrapeConfigs | list | `[]` | Extra scrape configs that will be appended to `config` | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| fullnameOverride | string | `""` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"victoriametrics/vmagent"` | | +| image.tag | string | `""` | | +| imagePullSecrets | list | `[]` | | +| ingress.annotations | object | `{}` | | +| ingress.enabled | bool | `false` | | +| ingress.extraLabels | object | `{}` | | +| ingress.hosts | list | `[]` | | +| ingress.pathType | string | `"Prefix"` | pathType is only for k8s >= 1.1= | +| ingress.tls | list | `[]` | | +| initContainers | list | `[]` | | +| license | object | `{"key":"","secret":{"key":"","name":""}}` | Enterprise license key configuration for VictoriaMetrics enterprise. Required only for VictoriaMetrics enterprise. Documentation - https://docs.victoriametrics.com/enterprise.html, for more information, visit https://victoriametrics.com/products/enterprise/ . To request a trial license, go to https://victoriametrics.com/products/enterprise/trial/ Supported starting from VictoriaMetrics v1.94.0 | +| license.key | string | `""` | License key | +| license.secret | object | `{"key":"","name":""}` | Use existing secret with license key | +| license.secret.key | string | `""` | Key in secret with license key | +| license.secret.name | string | `""` | Existing secret name | +| multiTenantUrls | list | `[]` | | +| nameOverride | string | `""` | | +| nodeSelector | object | `{}` | | +| persistence.accessModes[0] | string | `"ReadWriteOnce"` | | +| persistence.annotations | object | `{}` | | +| persistence.enabled | bool | `false` | | +| persistence.existingClaim | string | `""` | | +| persistence.extraLabels | object | `{}` | | +| persistence.matchLabels | object | `{}` | Bind Persistent Volume by labels. Must match all labels of targeted PV. | +| persistence.size | string | `"10Gi"` | | +| podAnnotations | object | `{}` | | +| podDisruptionBudget.enabled | bool | `false` | | +| podDisruptionBudget.labels | object | `{}` | | +| podLabels | object | `{}` | | +| podSecurityContext | object | `{}` | | +| priorityClassName | string | `""` | priority class to be assigned to the pod(s) | +| rbac.annotations | object | `{}` | | +| rbac.create | bool | `true` | | +| rbac.extraLabels | object | `{}` | | +| rbac.namespaced | bool | `false` | if true and `rbac.enabled`, will deploy a Role/Rolebinding instead of a ClusterRole/ClusterRoleBinding | +| rbac.pspEnabled | bool | `true` | | +| remoteWriteUrls | list | `[]` | | +| replicaCount | int | `1` | | +| resources | object | `{}` | | +| securityContext | object | `{}` | | +| service.annotations | object | `{}` | | +| service.clusterIP | string | `""` | | +| service.enabled | bool | `false` | | +| service.externalIPs | list | `[]` | | +| service.extraLabels | object | `{}` | | +| service.loadBalancerIP | string | `""` | | +| service.loadBalancerSourceRanges | list | `[]` | | +| service.servicePort | int | `8429` | | +| service.type | string | `"ClusterIP"` | | +| serviceAccount.annotations | object | `{}` | | +| serviceAccount.create | bool | `true` | | +| serviceAccount.name | string | `nil` | | +| serviceMonitor.annotations | object | `{}` | | +| serviceMonitor.enabled | bool | `false` | | +| serviceMonitor.extraLabels | object | `{}` | | +| serviceMonitor.relabelings | list | `[]` | | +| statefulset.clusterMode | bool | `false` | create cluster of vmagents. See https://docs.victoriametrics.com/vmagent.html#scraping-big-number-of-targets available since 1.77.2 version https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.77.2 | +| statefulset.enabled | bool | `false` | | +| statefulset.replicationFactor | int | `1` | replication factor for vmagent in cluster mode | +| statefulset.updateStrategy | object | `{}` | | +| tolerations | list | `[]` | | +| topologySpreadConstraints | list | `[]` | | diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/README.md.gotmpl b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/README.md.gotmpl new file mode 100644 index 000000000..1ff4d25c8 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/README.md.gotmpl @@ -0,0 +1,97 @@ +# Helm Chart For Victoria Metrics Agent. + +{{ template "chart.typeBadge" . }} {{ template "chart.versionBadge" . }} +[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/victoriametrics)](https://artifacthub.io/packages/helm/victoriametrics/victoria-metrics-agent) +[![Slack](https://img.shields.io/badge/join%20slack-%23victoriametrics-brightgreen.svg)](https://slack.victoriametrics.com/) + +{{ template "chart.description" . }} + +## Prerequisites + +* Install the follow packages: ``git``, ``kubectl``, ``helm``, ``helm-docs``. See this [tutorial](../../REQUIREMENTS.md). + +## How to install + +Access a Kubernetes cluster. + +Add a chart helm repository with follow commands: + +```console +helm repo add vm https://victoriametrics.github.io/helm-charts/ + +helm repo update +``` + +List versions of ``vm/victoria-metrics-agent`` chart available to installation: + +```console +helm search repo vm/victoria-metrics-agent -l +``` + +Export default values of ``victoria-metrics-agent`` chart to file ``values.yaml``: + +```console +helm show values vm/victoria-metrics-agent > values.yaml +``` + +Change the values according to the need of the environment in ``values.yaml`` file. + +Test the installation with command: + +```console +helm install vmagent vm/victoria-metrics-agent -f values.yaml -n NAMESPACE --debug --dry-run +``` + +Install chart with command: + +```console +helm install vmagent vm/victoria-metrics-agent -f values.yaml -n NAMESPACE +``` + +Get the pods lists by running this commands: + +```console +kubectl get pods -A | grep 'agent' +``` + +Get the application by running this command: + +```console +helm list -f vmagent -n NAMESPACE +``` + +See the history of versions of ``vmagent`` application with command. + +```console +helm history vmagent -n NAMESPACE +``` + +## How to uninstall + +Remove application with command. + +```console +helm uninstall vmagent -n NAMESPACE +``` + +## Documentation of Helm Chart + +Install ``helm-docs`` following the instructions on this [tutorial](../../REQUIREMENTS.md). + +Generate docs with ``helm-docs`` command. + +```bash +cd charts/victoria-metrics-agent + +helm-docs +``` + +The markdown generation is entirely go template driven. The tool parses metadata from charts and generates a number of sub-templates that can be referenced in a template file (by default ``README.md.gotmpl``). If no template file is provided, the tool has a default internal template that will generate a reasonably formatted README. + +## Parameters + +The following tables lists the configurable parameters of the chart and their default values. + +Change the values according to the need of the environment in ``victoria-metrics-agent/values.yaml`` file. + +{{ template "chart.valuesTable" . }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/RELEASE_NOTES.md b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/RELEASE_NOTES.md new file mode 100644 index 000000000..97a8e7604 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/RELEASE_NOTES.md @@ -0,0 +1,9 @@ +# Release notes for version 0.9.17 + +**Release date:** 2024-02-01 + +![AppVersion: v1.97.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.97.1&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- bump version of VM components to [v1.97.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.97.1) + diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/_helpers.tpl b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/_helpers.tpl new file mode 100644 index 000000000..6f0be4786 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/_helpers.tpl @@ -0,0 +1,148 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "chart.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "chart.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "chart.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Common labels +*/}} +{{- define "chart.labels" -}} +helm.sh/chart: {{ include "chart.chart" . }} +{{ include "chart.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Selector labels +*/}} +{{- define "chart.selectorLabels" -}} +app.kubernetes.io/name: {{ include "chart.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} + +{{/* +Create the name of the service account to use +*/}} +{{- define "chart.serviceAccountName" -}} +{{- if .Values.serviceAccount.create -}} + {{ default (include "chart.fullname" .) .Values.serviceAccount.name }} +{{- else -}} + {{ default "default" .Values.serviceAccount.name }} +{{- end -}} +{{- end -}} + +{{/* +Defines the name of configuration map +*/}} +{{- define "chart.configname" -}} +{{- if .Values.configMap -}} +{{- .Values.configMap -}} +{{- else -}} +{{- include "chart.fullname" . -}}-config +{{- end -}} +{{- end -}} + +{{- define "split-host-port" -}} +{{- $hp := split ":" . -}} +{{- printf "%s" $hp._1 -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for ingress. +*/}} +{{- define "vmagent.ingress.apiVersion" -}} + {{- if and (.Capabilities.APIVersions.Has "networking.k8s.io/v1") -}} + {{- print "networking.k8s.io/v1" -}} + {{- else if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" -}} + {{- print "networking.k8s.io/v1beta1" -}} + {{- else -}} + {{- print "extensions/v1beta1" -}} + {{- end -}} +{{- end -}} + +{{/* +Return if ingress is stable. +*/}} +{{- define "vmagent.ingress.isStable" -}} + {{- eq (include "vmagent.ingress.apiVersion" .) "networking.k8s.io/v1" -}} +{{- end -}} + +{{/* +Return if ingress supports ingressClassName. +*/}} +{{- define "vmagent.ingress.supportsIngressClassName" -}} + {{- or (eq (include "vmagent.ingress.isStable" .) "true") (and (eq (include "vmagent.ingress.apiVersion" .) "networking.k8s.io/v1beta1")) -}} +{{- end -}} + +{{/* +Return if ingress supports pathType. +*/}} +{{- define "vmagent.ingress.supportsPathType" -}} + {{- or (eq (include "vmagent.ingress.isStable" .) "true") (and (eq (include "vmagent.ingress.apiVersion" .) "networking.k8s.io/v1beta1")) -}} +{{- end -}} + +{{/* +Return license flag if necessary. +*/}} +{{- define "chart.license.flag" -}} +{{- if .Values.license.key -}} +-license={{ .Values.license.key }} +{{- end }} +{{- if and .Values.license.secret.name .Values.license.secret.key -}} +-licenseFile=/etc/vm-license-key/{{ .Values.license.secret.key }} +{{- end -}} +{{- end -}} + + +{{/* +Return license volume mount +*/}} +{{- define "chart.license.volume" -}} +{{- if and .Values.license.secret.name .Values.license.secret.key -}} +- name: license-key + secret: + secretName: {{ .Values.license.secret.name }} +{{- end -}} +{{- end -}} + +{{/* +Return license volume mount for container +*/}} +{{- define "chart.license.mount" -}} +{{- if and .Values.license.secret.name .Values.license.secret.key -}} +- name: license-key + mountPath: /etc/vm-license-key + readOnly: true +{{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/clusterrole.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/clusterrole.yaml new file mode 100644 index 000000000..5151d1aaf --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/clusterrole.yaml @@ -0,0 +1,50 @@ +{{- if .Values.rbac.create -}} +{{- $namespaced := .Values.rbac.namespaced }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: {{ ternary "Role" "ClusterRole" $namespaced }} +metadata: + name: {{ template "chart.fullname" . }}{{- ternary "" "-clusterrole" $namespaced }} + {{- if not $namespaced }} + namespace: {{ .Release.Namespace }} + {{- end }} + labels: + {{- include "chart.labels" . | nindent 4 }} +{{- with .Values.rbac.extraLabels }} +{{ toYaml . | indent 4}} +{{- end }} + {{- with .Values.rbac.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +rules: +- apiGroups: + - discovery.k8s.io + resources: + - endpointslices + verbs: ["get", "list", "watch"] +- apiGroups: [""] + resources: + - nodes + - nodes/proxy + - nodes/metrics + - services + - endpoints + - pods + verbs: ["get", "list", "watch"] +- apiGroups: + - extensions + - networking.k8s.io + resources: + - ingresses + verbs: ["get", "list", "watch"] +{{- if not $namespaced }} +- nonResourceURLs: ["/metrics"] + verbs: ["get"] +{{- end }} +{{- if and .Values.rbac.pspEnabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} +- apiGroups: ['extensions'] + resources: ['podsecuritypolicies'] + verbs: ['use'] + resourceNames: [{{ template "chart.fullname" . }}] +{{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/clusterrolebinding.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/clusterrolebinding.yaml new file mode 100644 index 000000000..016aa27c9 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/clusterrolebinding.yaml @@ -0,0 +1,27 @@ +{{- if .Values.rbac.create -}} +{{- $namespaced := .Values.rbac.namespaced }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: {{ ternary "RoleBinding" "ClusterRoleBinding" $namespaced }} +metadata: + name: {{ template "chart.fullname" . }}{{- ternary "" "-clusterrolebinding" $namespaced }} + {{- if not $namespaced }} + namespace: {{ .Release.Namespace }} + {{- end }} + labels: + {{- include "chart.labels" . | nindent 4 }} +{{- with .Values.rbac.extraLabels }} +{{ toYaml . | indent 4}} +{{- end }} + {{- with .Values.rbac.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: {{ ternary "Role" "ClusterRole" $namespaced }} + name: {{ template "chart.fullname" . }}{{- ternary "" "-clusterrole" $namespaced }} +subjects: + - kind: ServiceAccount + name: {{ template "chart.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/configmap.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/configmap.yaml new file mode 100644 index 000000000..086cd62b1 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/configmap.yaml @@ -0,0 +1,17 @@ +{{- if eq .Values.configMap "" }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "chart.configname" .}} + namespace: {{ .Release.Namespace }} + labels: {{- include "chart.labels" . | nindent 4 }} +data: + scrape.yml: | + {{- range $k, $v := .Values.config }} + {{- if and (eq $k "scrape_configs") ($.Values.extraScrapeConfigs) }} + {{ dict $k (concat $v $.Values.extraScrapeConfigs) | toYaml | nindent 4 }} + {{- else }} + {{ dict $k $v | toYaml | nindent 4 }} + {{- end }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/deployment.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/deployment.yaml new file mode 100644 index 000000000..8e4ad2c81 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/deployment.yaml @@ -0,0 +1,203 @@ +{{- if .Values.deployment.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "chart.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "chart.labels" . | nindent 4 }} +{{- with .Values.extraLabels }} +{{ toYaml . | indent 4 }} +{{- end }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + {{- with .Values.deployment.strategy }} + strategy: + {{- toYaml . | nindent 4 }} + {{- end }} + selector: + matchLabels: + {{- include "chart.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "chart.selectorLabels" . | nindent 8 }} +{{- with .Values.extraLabels }} +{{ toYaml . | indent 8 }} +{{- end }} +{{- with .Values.podLabels }} +{{ toYaml . | indent 8 }} +{{- end }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + {{- range $key, $value := .Values.podAnnotations }} + {{ $key }}: {{ $value | quote }} + {{- end }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "chart.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + {{- with .Values.initContainers }} + initContainers: + {{- toYaml . | nindent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ default .Chart.AppVersion .Values.image.tag }}" + workingDir: {{ .Values.containerWorkingDir }} + args: + - -promscrape.config=/config/scrape.yml + - -remoteWrite.tmpDataPath=/tmpData + {{- range .Values.remoteWriteUrls }} + - -remoteWrite.url={{ . }} + {{- end }} + {{- range .Values.multiTenantUrls }} + - -remoteWrite.multitenantURL={{ . }} + {{- end }} + {{- range $key, $value := .Values.extraArgs }} + - -{{ $key }}={{ $value }} + {{- end }} + {{- with (include "chart.license.flag" .) }} + - {{ . }} + {{- end }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: 8429 + {{- if .Values.extraArgs.graphiteListenAddr }} + - name: graphite-tcp + protocol: TCP + containerPort: {{ include "split-host-port" .Values.extraArgs.graphiteListenAddr }} + {{- end }} + {{- if .Values.extraArgs.graphiteListenAddr }} + - name: graphite-udp + protocol: UDP + containerPort: {{ include "split-host-port" .Values.extraArgs.graphiteListenAddr }} + {{- end }} + {{- if .Values.extraArgs.influxListenAddr }} + - name: influx-tcp + protocol: TCP + containerPort: {{ include "split-host-port" .Values.extraArgs.influxListenAddr }} + {{- end }} + {{- if .Values.extraArgs.influxListenAddr }} + - name: influx-udp + protocol: UDP + containerPort: {{ include "split-host-port" .Values.extraArgs.influxListenAddr }} + {{- end }} + {{- if .Values.extraArgs.opentsdbHTTPListenAddr }} + - name: opentsdbhttp + protocol: TCP + containerPort: {{ include "split-host-port" .Values.extraArgs.opentsdbHTTPListenAddr }} + {{- end }} + {{- if .Values.extraArgs.opentsdbListenAddr }} + - name: opentsdb-tcp + protocol: TCP + containerPort: {{ include "split-host-port" .Values.extraArgs.opentsdbListenAddr }} + {{- end }} + {{- if .Values.extraArgs.opentsdbListenAddr }} + - name: opentsdb-udp + protocol: UDP + containerPort: {{ include "split-host-port" .Values.extraArgs.opentsdbListenAddr }} + {{- end }} + {{- if .Values.envFrom }} + envFrom: + {{- with .Values.envFrom -}} + {{ toYaml . | nindent 12 }} + {{- end }} + {{- end }} + {{- with .Values.env }} + env: {{ toYaml . | nindent 10 }} + {{- end }} + readinessProbe: + httpGet: + {{- if index .Values.extraArgs "http.pathPrefix" }} + path: {{ trimSuffix "/" (index .Values.extraArgs "http.pathPrefix") }}/health + {{- else }} + path: /health + {{- end }} + port: http + initialDelaySeconds: 5 + periodSeconds: 15 + livenessProbe: + tcpSocket: + port: http + initialDelaySeconds: 5 + periodSeconds: 15 + timeoutSeconds: 5 + volumeMounts: + - name: tmpdata + mountPath: /tmpData + - name: config + mountPath: /config + {{- range .Values.extraHostPathMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- with .Values.extraVolumeMounts }} + {{- toYaml . | nindent 12 }} + {{- end }} + {{- include "chart.license.mount" . | nindent 12 }} + resources: + {{- toYaml .Values.resources | nindent 12 }} + {{- with .Values.extraContainers }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{ toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.topologySpreadConstraints }} + topologySpreadConstraints: + {{- range $constraint := . }} + - {{ toYaml $constraint | nindent 8 | trim }} + {{- if not $constraint.labelSelector }} + labelSelector: + matchLabels: + {{- include "chart.selectorLabels" $ | nindent 12 }} + {{- end }} + {{- end }} + {{- end }} + volumes: + - name: tmpdata + {{- if .Values.persistence.enabled }} + persistentVolumeClaim: + claimName: {{ .Values.persistence.existingClaim | default (include "chart.fullname" .) }} + {{- else }} + emptyDir: {} + {{- end }} + - name: config + configMap: + name: {{ include "chart.configname" .}} + {{- range .Values.extraHostPathMounts }} + - name: {{ .name }} + hostPath: + path: {{ .hostPath }} + {{- end }} + {{- with .Values.extraVolumes }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- include "chart.license.volume" . | nindent 8 }} + {{- if .Values.priorityClassName }} + priorityClassName: {{ .Values.priorityClassName }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/extra-objects.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/extra-objects.yaml new file mode 100644 index 000000000..a9bb3b6ba --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/extra-objects.yaml @@ -0,0 +1,4 @@ +{{ range .Values.extraObjects }} +--- +{{ tpl (toYaml .) $ }} +{{ end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/ingress.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/ingress.yaml new file mode 100644 index 000000000..88398ed87 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/ingress.yaml @@ -0,0 +1,50 @@ +{{- if .Values.ingress.enabled }} +{{- $ingressApiIsStable := eq (include "vmagent.ingress.isStable" .) "true" -}} +{{- $ingressSupportsIngressClassName := eq (include "vmagent.ingress.supportsIngressClassName" .) "true" -}} +{{- $ingressSupportsPathType := eq (include "vmagent.ingress.supportsPathType" .) "true" -}} +{{- $servicePort := .Values.service.servicePort -}} +{{- $ingressPathType := .Values.ingress.pathType -}} +apiVersion: {{ include "vmagent.ingress.apiVersion" . }} +kind: Ingress +metadata: +{{- if .Values.ingress.annotations }} + annotations: +{{ toYaml .Values.ingress.annotations | indent 4 }} +{{- end }} + labels: + {{- include "chart.labels" . | nindent 4 }} + {{ with .Values.ingress.extraLabels }} +{{ toYaml . | indent 4 }} + {{ end }} + name: {{ template "chart.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: + {{- if and $ingressSupportsIngressClassName .Values.ingress.ingressClassName }} + ingressClassName: {{ .Values.ingress.ingressClassName }} + {{- end }} + rules: + {{- $serviceName := include "chart.fullname" . }} + {{- range .Values.ingress.hosts }} + - host: {{ .name }} + http: + paths: + - path: {{ .path }} + {{- if $ingressSupportsPathType }} + pathType: {{ $ingressPathType }} + {{- end }} + backend: + {{- if $ingressApiIsStable }} + service: + name: {{ $serviceName }} + port: + number: {{ $servicePort }} + {{- else }} + serviceName: {{ $serviceName }} + servicePort: {{ .port | default "http"}} + {{- end }} + {{- end -}} +{{- if .Values.ingress.tls }} + tls: +{{ toYaml .Values.ingress.tls | indent 4 }} +{{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/pdb.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/pdb.yaml new file mode 100644 index 000000000..aa594eaf5 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/pdb.yaml @@ -0,0 +1,26 @@ +{{- if .Values.podDisruptionBudget.enabled }} +{{- if .Capabilities.APIVersions.Has "policy/v1/PodDisruptionBudget" }} +apiVersion: policy/v1 +{{- else -}} +apiVersion: policy/v1beta1 +{{- end }} +kind: PodDisruptionBudget +metadata: + name: {{ include "chart.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "chart.labels" . | nindent 4 }} + {{- with .Values.podDisruptionBudget.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: +{{- if .Values.podDisruptionBudget.minAvailable }} + minAvailable: {{ .Values.podDisruptionBudget.minAvailable }} +{{- end }} +{{- if .Values.podDisruptionBudget.maxUnavailable }} + maxUnavailable: {{ .Values.podDisruptionBudget.maxUnavailable }} +{{- end }} + selector: + matchLabels: + {{- include "chart.selectorLabels" . | nindent 6 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/podsecuritypolicy.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/podsecuritypolicy.yaml new file mode 100644 index 000000000..3964fede4 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/podsecuritypolicy.yaml @@ -0,0 +1,42 @@ +{{- if and .Values.rbac.pspEnabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} +apiVersion: policy/v1beta1 +kind: PodSecurityPolicy +metadata: + name: {{ include "chart.fullname" . }} + labels: + {{- include "chart.labels" . | nindent 4 }} +{{- with .Values.rbac.extraLabels }} +{{ toYaml . | indent 4}} +{{- end }} + annotations: + seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default' + seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' +{{- with .Values.rbac.annotations }} +{{ toYaml . | indent 4}} +{{- end }} +spec: + privileged: false + allowPrivilegeEscalation: false + requiredDropCapabilities: + # Default set from Docker, with DAC_OVERRIDE and CHOWN + - ALL + volumes: + - 'configMap' + - 'emptyDir' + - 'projected' + - 'secret' + - 'downwardAPI' + - 'persistentVolumeClaim' + hostNetwork: false + hostIPC: false + hostPID: false + runAsUser: + rule: 'RunAsAny' + seLinux: + rule: 'RunAsAny' + supplementalGroups: + rule: 'RunAsAny' + fsGroup: + rule: 'RunAsAny' + readOnlyRootFilesystem: false +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/pvc.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/pvc.yaml new file mode 100644 index 000000000..b099f68c7 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/pvc.yaml @@ -0,0 +1,32 @@ +{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) .Values.deployment.enabled }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "chart.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "chart.labels" . | nindent 4 }} + {{- with .Values.persistence.extraLabels }} + {{- toYaml . | nindent 4}} + {{- end }} + {{- with .Values.persistence.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + accessModes: + {{- range .Values.persistence.accessModes }} + - {{ . | quote }} + {{- end }} + resources: + requests: + storage: {{ .Values.persistence.size | quote }} + {{- if .Values.persistence.storageClassName }} + storageClassName: {{ .Values.persistence.storageClassName }} + {{- end -}} + {{- with .Values.persistence.matchLabels }} + selector: + matchLabels: + {{- toYaml . | nindent 6 }} + {{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/service-monitor.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/service-monitor.yaml new file mode 100644 index 000000000..bcf6463c7 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/service-monitor.yaml @@ -0,0 +1,44 @@ +{{- if .Values.serviceMonitor.enabled -}} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + {{- if .Values.serviceMonitor.annotations }} + annotations: +{{ toYaml .Values.serviceMonitor.annotations | indent 4 }} + {{- end }} + labels: + {{- include "chart.labels" . | nindent 4 }} + {{- with .Values.serviceMonitor.extraLabels -}} + {{ toYaml . | nindent 4 }} + {{- end }} + name: {{ template "chart.fullname" . }} + {{- if .Values.serviceMonitor.namespace }} + namespace: {{ .Values.serviceMonitor.namespace }} + {{- end }} +spec: + namespaceSelector: + matchNames: + - {{ .Release.Namespace }} + selector: + matchLabels: + {{- include "chart.selectorLabels" . | nindent 6 }} + endpoints: + - port: http + {{- if .Values.serviceMonitor.scheme }} + scheme: {{ .Values.serviceMonitor.scheme }} + {{- end }} + {{- if .Values.serviceMonitor.interval }} + interval: {{ .Values.serviceMonitor.interval }} + {{- end }} + {{- if .Values.serviceMonitor.scrapeTimeout }} + scrapeTimeout: {{ .Values.serviceMonitor.scrapeTimeout }} + {{- end }} + {{- with .Values.serviceMonitor.tlsConfig }} + tlsConfig: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.serviceMonitor.relabelings }} + relabelings: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/service.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/service.yaml new file mode 100644 index 000000000..10d966908 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/service.yaml @@ -0,0 +1,92 @@ +{{- if and .Values.service.enabled -}} +apiVersion: v1 +kind: Service +metadata: +{{- with .Values.service.annotations }} + annotations: +{{ toYaml . | indent 4}} +{{- end }} + labels: + {{- include "chart.labels" . | nindent 4 }} +{{- with .Values.service.extraLabels }} +{{ toYaml . | indent 4}} +{{- end }} + name: {{ template "chart.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: +{{- if .Values.service.clusterIP }} + clusterIP: {{ .Values.service.clusterIP }} +{{- end }} +{{- if .Values.service.externalIPs }} + externalIPs: +{{ toYaml .Values.service.externalIPs | indent 4 }} +{{- end }} +{{- if .Values.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.service.loadBalancerIP }} +{{- end }} +{{- if .Values.service.loadBalancerSourceRanges }} + loadBalancerSourceRanges: + {{- range $cidr := .Values.service.loadBalancerSourceRanges }} + - {{ $cidr }} + {{- end }} +{{- end }} + ports: + - name: http + port: {{ .Values.service.servicePort }} + protocol: TCP + targetPort: http + {{- with .Values.service.nodePort }} + nodePort: {{ . }} + {{- end }} +{{- if .Values.extraArgs.graphiteListenAddr }} + - name: graphite-tcp + protocol: TCP + port: {{ include "split-host-port" .Values.extraArgs.graphiteListenAddr }} + targetPort: graphite-tcp +{{- end }} +{{- if .Values.extraArgs.graphiteListenAddr }} + - name: graphite-udp + protocol: UDP + port: {{ include "split-host-port" .Values.extraArgs.graphiteListenAddr }} + targetPort: graphite-udp +{{- end }} +{{- if .Values.extraArgs.influxListenAddr }} + - name: influx-tcp + protocol: TCP + port: {{ include "split-host-port" .Values.extraArgs.influxListenAddr }} + targetPort: influx-tcp +{{- end }} +{{- if .Values.extraArgs.influxListenAddr }} + - name: influx-udp + protocol: UDP + port: {{ include "split-host-port" .Values.extraArgs.influxListenAddr }} + targetPort: influx-udp +{{- end }} +{{- if .Values.extraArgs.opentsdbHTTPListenAddr }} + - name: opentsdbhttp + port: {{ include "split-host-port" .Values.extraArgs.opentsdbHTTPListenAddr }} + targetPort: opentsdbhttp +{{- end }} +{{- if .Values.extraArgs.opentsdbListenAddr }} + - name: opentsdb-udp + protocol: UDP + port: {{ include "split-host-port" .Values.extraArgs.opentsdbListenAddr }} + targetPort: opentsdb-udp +{{- end }} +{{- if .Values.extraArgs.opentsdbListenAddr }} + - name: opentsdb-tcp + protocol: TCP + port: {{ include "split-host-port" .Values.extraArgs.opentsdbListenAddr }} + targetPort: opentsdb-tcp +{{- end }} + + selector: + {{- include "chart.selectorLabels" . | nindent 4 }} + type: "{{ .Values.service.type }}" + {{- with .Values.service.healthCheckNodePort }} + healthCheckNodePort: {{ . }} + {{- end }} + {{- with .Values.service.externalTrafficPolicy }} + externalTrafficPolicy: {{ . }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/serviceaccount.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/serviceaccount.yaml new file mode 100644 index 000000000..882ed1242 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/serviceaccount.yaml @@ -0,0 +1,13 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "chart.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "chart.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/statefulset.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/statefulset.yaml new file mode 100644 index 000000000..cddbd0531 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/statefulset.yaml @@ -0,0 +1,246 @@ +{{- if .Values.statefulset.enabled }} +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ include "chart.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "chart.labels" . | nindent 4 }} +{{- with .Values.extraLabels }} +{{ toYaml . | indent 4 }} +{{- end }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + serviceName: {{ include "chart.fullname" . }} + {{- if .Values.statefulset.updateStrategy }} + updateStrategy: + {{- toYaml .Values.statefulset.updateStrategy | nindent 4 }} + {{- end }} + selector: + matchLabels: + {{- include "chart.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "chart.selectorLabels" . | nindent 8 }} +{{- with .Values.extraLabels }} +{{ toYaml . | indent 8 }} +{{- end }} +{{- with .Values.podLabels }} +{{ toYaml . | indent 8 }} +{{- end }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + {{- range $key, $value := .Values.podAnnotations }} + {{ $key }}: {{ $value | quote }} + {{- end }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "chart.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + {{- with .Values.initContainers }} + initContainers: + {{- toYaml . | nindent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ default .Chart.AppVersion .Values.image.tag }}" + workingDir: {{ .Values.containerWorkingDir }} + args: + - -promscrape.config=/config/scrape.yml + - -remoteWrite.tmpDataPath=/tmpData + {{- if .Values.statefulset.clusterMode }} + - -promscrape.cluster.membersCount={{ .Values.replicaCount }} + - -promscrape.cluster.replicationFactor={{ .Values.statefulset.replicationFactor }} + - -promscrape.cluster.memberNum=$(POD_NAME) + {{- end }} + {{- range .Values.remoteWriteUrls }} + - -remoteWrite.url={{ . }} + {{- end }} + {{- range .Values.multiTenantUrls }} + - -remoteWrite.multitenantURL={{ . }} + {{- end }} + {{- range $key, $value := .Values.extraArgs }} + - -{{ $key }}={{ $value }} + {{- end }} + {{- with (include "chart.license.flag" .) }} + - {{ . }} + {{- end }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: 8429 + {{- if .Values.extraArgs.graphiteListenAddr }} + - name: graphite-tcp + protocol: TCP + containerPort: {{ include "split-host-port" .Values.extraArgs.graphiteListenAddr }} + {{- end }} + {{- if .Values.extraArgs.graphiteListenAddr }} + - name: graphite-udp + protocol: UDP + containerPort: {{ include "split-host-port" .Values.extraArgs.graphiteListenAddr }} + {{- end }} + {{- if .Values.extraArgs.influxListenAddr }} + - name: influx-tcp + protocol: TCP + containerPort: {{ include "split-host-port" .Values.extraArgs.influxListenAddr }} + {{- end }} + {{- if .Values.extraArgs.influxListenAddr }} + - name: influx-udp + protocol: UDP + containerPort: {{ include "split-host-port" .Values.extraArgs.influxListenAddr }} + {{- end }} + {{- if .Values.extraArgs.opentsdbHTTPListenAddr }} + - name: opentsdbhttp + protocol: TCP + containerPort: {{ include "split-host-port" .Values.extraArgs.opentsdbHTTPListenAddr }} + {{- end }} + {{- if .Values.extraArgs.opentsdbListenAddr }} + - name: opentsdb-tcp + protocol: TCP + containerPort: {{ include "split-host-port" .Values.extraArgs.opentsdbListenAddr }} + {{- end }} + {{- if .Values.extraArgs.opentsdbListenAddr }} + - name: opentsdb-udp + protocol: UDP + containerPort: {{ include "split-host-port" .Values.extraArgs.opentsdbListenAddr }} + {{- end }} + {{- if .Values.envFrom }} + envFrom: + {{- with .Values.envFrom -}} + {{ toYaml . | nindent 12 }} + {{- end }} + {{- end }} + {{- if or .Values.env .Values.statefulset.clusterMode}} + env: + {{- if .Values.statefulset.clusterMode}} + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + {{- end -}} + {{- with .Values.env }} + {{ toYaml .| nindent 12 }} + {{- end }} + {{- end }} + readinessProbe: + httpGet: + {{- if index .Values.extraArgs "http.pathPrefix" }} + path: {{ trimSuffix "/" (index .Values.extraArgs "http.pathPrefix") }}/health + {{- else }} + path: /health + {{- end }} + port: http + initialDelaySeconds: 5 + periodSeconds: 15 + livenessProbe: + tcpSocket: + port: http + initialDelaySeconds: 5 + periodSeconds: 15 + timeoutSeconds: 5 + volumeMounts: + - name: tmpdata + mountPath: /tmpData + - name: config + mountPath: /config + {{- range .Values.extraHostPathMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- with .Values.extraVolumeMounts }} + {{- toYaml . | nindent 12 }} + {{- end }} + resources: + {{- toYaml .Values.resources | nindent 12 }} + {{- with .Values.extraContainers }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{ toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.topologySpreadConstraints }} + topologySpreadConstraints: + {{- range $constraint := . }} + - {{ toYaml $constraint | nindent 8 | trim }} + {{- if not $constraint.labelSelector }} + labelSelector: + matchLabels: + {{- include "chart.selectorLabels" $ | nindent 12 }} + {{- end }} + {{- end }} + {{- end }} + volumes: + {{- if not .Values.persistence.enabled }} + - name: tmpdata + emptyDir: {} + {{- else if .Values.persistence.existingClaim }} + - name: tmpdata + persistentVolumeClaim: + claimName: {{ .Values.persistence.existingClaim }} + {{- end }} + - name: config + configMap: + name: {{ include "chart.configname" .}} + {{- range .Values.extraHostPathMounts }} + - name: {{ .name }} + hostPath: + path: {{ .hostPath }} + {{- end }} + {{- with .Values.extraVolumes }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.priorityClassName }} + priorityClassName: {{ .Values.priorityClassName }} + {{- end }} + {{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }} + volumeClaimTemplates: + - metadata: + name: tmpdata + {{- with .Values.persistence.extraLabels }} + labels: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.persistence.annotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + accessModes: + {{- range .Values.persistence.accessModes }} + - {{ . | quote }} + {{- end }} + {{- if .Values.persistence.storageClassName }} + storageClassName: {{ .Values.persistence.storageClassName }} + {{- end }} + {{- with .Values.persistence.matchLabels }} + selector: + matchLabels: + {{- toYaml . | nindent 10 }} + {{- end }} + resources: + requests: + storage: {{ .Values.persistence.size | quote }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/values.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/values.yaml new file mode 100644 index 000000000..06f656ffe --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/values.yaml @@ -0,0 +1,593 @@ +# Default values for victoria-metrics-agent. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +# ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/ +deployment: + enabled: true + # ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy + strategy: {} + # rollingUpdate: + # maxSurge: 25% + # maxUnavailable: 25% + # type: RollingUpdate + +# ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/ +statefulset: + enabled: false + # -- create cluster of vmagents. See https://docs.victoriametrics.com/vmagent.html#scraping-big-number-of-targets + # available since 1.77.2 version https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.77.2 + clusterMode: false + # -- replication factor for vmagent in cluster mode + replicationFactor: 1 + # ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies + updateStrategy: {} + # type: RollingUpdate + + +image: + repository: victoriametrics/vmagent + tag: "" # rewrites Chart.AppVersion + pullPolicy: IfNotPresent + +imagePullSecrets: [] +nameOverride: "" +fullnameOverride: "" + +containerWorkingDir: "/" + +rbac: + create: true + # Note: The PSP will only be deployed, if Kubernetes (<1.25) supports the resource. + pspEnabled: true + annotations: {} + extraLabels: {} + # -- if true and `rbac.enabled`, will deploy a Role/Rolebinding instead of a ClusterRole/ClusterRoleBinding + namespaced: false + +serviceAccount: + # Specifies whether a service account should be created + create: true + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: + +## See `kubectl explain poddisruptionbudget.spec` for more +## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/ +podDisruptionBudget: + enabled: false + # minAvailable: 1 + # maxUnavailable: 1 + labels: {} + +# WARN: need to specify at least one remote write url or one multi tenant url +remoteWriteUrls: [] +# remoteWriteUrls: +# - http://vm-insert:8480/insert/0/prometheus +# - http://prometheus:8480/insert/0/prometheus + +multiTenantUrls: [] +# multiTenantUrls: +# - http://vm-insert-az1:8480 +# - http://vm-insert-az2:8480 + +extraArgs: + envflag.enable: "true" + envflag.prefix: VM_ + loggerFormat: json + # promscrape.maxScrapeSize: "167772160" + + # Uncomment and specify the port if you want to support any of the protocols: + # https://victoriametrics.github.io/vmagent.html#features + # graphiteListenAddr: ":2003" + # influxListenAddr: ":8189" + # opentsdbHTTPListenAddr: ":4242" + # opentsdbListenAddr: ":4242" + +# -- Additional environment variables (ex.: secret tokens, flags) https://github.com/VictoriaMetrics/VictoriaMetrics#environment-variables +env: + [] + # - name: VM_remoteWrite_basicAuth_password + # valueFrom: + # secretKeyRef: + # name: auth_secret + # key: password + +envFrom: + [] + #- configMapRef: + # name: special-config + +# extra Labels for Pods, Deployment and Statefulset +extraLabels: {} + +# extra Labels for Pods only +podLabels: {} + +# Additional hostPath mounts +extraHostPathMounts: + [] + # - name: certs-dir + # mountPath: /etc/kubernetes/certs + # subPath: "" + # hostPath: /etc/kubernetes/certs + # readOnly: true + +# Extra Volumes for the pod +extraVolumes: + [] + # - name: example + # configMap: + # name: example + +# Extra Volume Mounts for the container +extraVolumeMounts: + [] + # - name: example + # mountPath: /example + +extraContainers: [] +# - name: config-reloader +# image: reloader-image + +initContainers: + [] + # - name: example + # image: example-image + +podSecurityContext: + {} + # fsGroup: 2000 + +securityContext: + {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + enabled: false + annotations: {} + extraLabels: {} + clusterIP: "" + ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips + ## + externalIPs: [] + loadBalancerIP: "" + loadBalancerSourceRanges: [] + servicePort: 8429 + # nodePort: 30000 + type: ClusterIP + # Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + # externalTrafficPolicy: "local" + # healthCheckNodePort: 0 +ingress: + enabled: false + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: 'true' + + extraLabels: {} + hosts: [] + # - name: vmagent.local + # path: / + # port: http + tls: [] + # - secretName: vmagent-ingress-tls + # hosts: + # - vmagent.local + # For Kubernetes >= 1.18 you should specify the ingress-controller via the field ingressClassName + # See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#specifying-the-class-of-an-ingress + # ingressClassName: nginx + # -- pathType is only for k8s >= 1.1= + pathType: Prefix +resources: + {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +# Annotations to be added to the deployment +annotations: {} + +# Annotations to be added to pod +podAnnotations: {} + +nodeSelector: {} + +tolerations: [] + +topologySpreadConstraints: [] + # - maxSkew: 1 + # topologyKey: topology.kubernetes.io/zone + # whenUnsatisfiable: DoNotSchedule + +affinity: {} + +# vmagent scraping configuration: +# https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/docs/vmagent.md#how-to-collect-metrics-in-prometheus-format + +# use existing configmap if specified +# otherwise .config values will be used +configMap: "" + +# -- priority class to be assigned to the pod(s) +priorityClassName: "" + +serviceMonitor: + enabled: false + extraLabels: {} + annotations: {} + relabelings: [] +# interval: 15s +# scrapeTimeout: 5s + # -- Commented. HTTP scheme to use for scraping. +# scheme: https + # -- Commented. TLS configuration to use when scraping the endpoint +# tlsConfig: +# insecureSkipVerify: true + +persistence: + enabled: false + # storageClassName: default + accessModes: + - ReadWriteOnce + size: 10Gi + annotations: {} + extraLabels: {} + existingClaim: "" + # -- Bind Persistent Volume by labels. Must match all labels of targeted PV. + matchLabels: {} + +config: + global: + scrape_interval: 10s + + # scrape self by default + scrape_configs: + - job_name: vmagent + static_configs: + - targets: ["localhost:8429"] + + ## COPY from Prometheus helm chart https://github.com/helm/charts/blob/master/stable/prometheus/values.yaml + + # Scrape config for API servers. + # + # Kubernetes exposes API servers as endpoints to the default/kubernetes + # service so this uses `endpoints` role and uses relabelling to only keep + # the endpoints associated with the default/kubernetes service using the + # default named port `https`. This works for single API server deployments as + # well as HA API server deployments. + - job_name: "kubernetes-apiservers" + kubernetes_sd_configs: + - role: endpoints + # Default to scraping over https. If required, just disable this or change to + # `http`. + scheme: https + # This TLS & bearer token file config is used to connect to the actual scrape + # endpoints for cluster components. This is separate to discovery auth + # configuration because discovery & scraping are two separate concerns in + # Prometheus. The discovery auth config is automatic if Prometheus runs inside + # the cluster. Otherwise, more config options have to be provided within the + # . + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + # If your node certificates are self-signed or use a different CA to the + # master CA, then you need to disable certificate verification. Note that + # certificate verification is an integral part of a secure infrastructure + # so this should only be disabled in a controlled environment. You can + # enable certificate verification by commenting the line below. + # + insecure_skip_verify: true + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + # Keep only the default/kubernetes service endpoints for the https port. This + # will add targets for each API server which Kubernetes adds an endpoint to + # the default/kubernetes service. + relabel_configs: + - source_labels: + [ + __meta_kubernetes_namespace, + __meta_kubernetes_service_name, + __meta_kubernetes_endpoint_port_name, + ] + action: keep + regex: default;kubernetes;https + - job_name: "kubernetes-nodes" + # Default to scraping over https. If required, just disable this or change to + # `http`. + scheme: https + # This TLS & bearer token file config is used to connect to the actual scrape + # endpoints for cluster components. This is separate to discovery auth + # configuration because discovery & scraping are two separate concerns in + # Prometheus. The discovery auth config is automatic if Prometheus runs inside + # the cluster. Otherwise, more config options have to be provided within the + # . + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + # If your node certificates are self-signed or use a different CA to the + # master CA, then you need to disable certificate verification. Note that + # certificate verification is an integral part of a secure infrastructure + # so this should only be disabled in a controlled environment. You can + # enable certificate verification by commenting the line below. + # + insecure_skip_verify: true + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + kubernetes_sd_configs: + - role: node + relabel_configs: + - action: labelmap + regex: __meta_kubernetes_node_label_(.+) + - target_label: __address__ + replacement: kubernetes.default.svc:443 + - source_labels: [__meta_kubernetes_node_name] + regex: (.+) + target_label: __metrics_path__ + replacement: /api/v1/nodes/$1/proxy/metrics + - job_name: "kubernetes-nodes-cadvisor" + # Default to scraping over https. If required, just disable this or change to + # `http`. + scheme: https + # This TLS & bearer token file config is used to connect to the actual scrape + # endpoints for cluster components. This is separate to discovery auth + # configuration because discovery & scraping are two separate concerns in + # Prometheus. The discovery auth config is automatic if Prometheus runs inside + # the cluster. Otherwise, more config options have to be provided within the + # . + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + # If your node certificates are self-signed or use a different CA to the + # master CA, then you need to disable certificate verification. Note that + # certificate verification is an integral part of a secure infrastructure + # so this should only be disabled in a controlled environment. You can + # enable certificate verification by commenting the line below. + # + insecure_skip_verify: true + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + kubernetes_sd_configs: + - role: node + # This configuration will work only on kubelet 1.7.3+ + # As the scrape endpoints for cAdvisor have changed + # if you are using older version you need to change the replacement to + # replacement: /api/v1/nodes/$1:4194/proxy/metrics + # more info here https://github.com/coreos/prometheus-operator/issues/633 + relabel_configs: + - action: labelmap + regex: __meta_kubernetes_node_label_(.+) + - target_label: __address__ + replacement: kubernetes.default.svc:443 + - source_labels: [__meta_kubernetes_node_name] + regex: (.+) + target_label: __metrics_path__ + replacement: /api/v1/nodes/$1/proxy/metrics/cadvisor + # ignore timestamps of cadvisor's metrics by default + # more info here https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4697#issuecomment-1656540535 + honor_timestamps: false + # Scrape config for service endpoints. + # + # The relabeling allows the actual service scrape endpoint to be configured + # via the following annotations: + # + # * `prometheus.io/scrape`: Only scrape services that have a value of `true` + # * `prometheus.io/scheme`: If the metrics endpoint is secured then you will need + # to set this to `https` & most likely set the `tls_config` of the scrape config. + # * `prometheus.io/path`: If the metrics path is not `/metrics` override this. + # * `prometheus.io/port`: If the metrics are exposed on a different port to the + # service then set this appropriately. + - job_name: "kubernetes-service-endpoints" + kubernetes_sd_configs: + - role: endpointslices + relabel_configs: + - action: drop + source_labels: [__meta_kubernetes_pod_container_init] + regex: true + - action: keep_if_equal + source_labels: [__meta_kubernetes_service_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number] + - source_labels: + [__meta_kubernetes_service_annotation_prometheus_io_scrape] + action: keep + regex: true + - source_labels: + [__meta_kubernetes_service_annotation_prometheus_io_scheme] + action: replace + target_label: __scheme__ + regex: (https?) + - source_labels: + [__meta_kubernetes_service_annotation_prometheus_io_path] + action: replace + target_label: __metrics_path__ + regex: (.+) + - source_labels: + [ + __address__, + __meta_kubernetes_service_annotation_prometheus_io_port, + ] + action: replace + target_label: __address__ + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - source_labels: [__meta_kubernetes_pod_name] + target_label: pod + - source_labels: [__meta_kubernetes_pod_container_name] + target_label: container + - source_labels: [__meta_kubernetes_namespace] + target_label: namespace + - source_labels: [__meta_kubernetes_service_name] + target_label: service + - source_labels: [__meta_kubernetes_service_name] + target_label: job + replacement: ${1} + - source_labels: [__meta_kubernetes_pod_node_name] + action: replace + target_label: node + # Scrape config for slow service endpoints; same as above, but with a larger + # timeout and a larger interval + # + # The relabeling allows the actual service scrape endpoint to be configured + # via the following annotations: + # + # * `prometheus.io/scrape-slow`: Only scrape services that have a value of `true` + # * `prometheus.io/scheme`: If the metrics endpoint is secured then you will need + # to set this to `https` & most likely set the `tls_config` of the scrape config. + # * `prometheus.io/path`: If the metrics path is not `/metrics` override this. + # * `prometheus.io/port`: If the metrics are exposed on a different port to the + # service then set this appropriately. + - job_name: "kubernetes-service-endpoints-slow" + scrape_interval: 5m + scrape_timeout: 30s + kubernetes_sd_configs: + - role: endpointslices + relabel_configs: + - action: drop + source_labels: [__meta_kubernetes_pod_container_init] + regex: true + - action: keep_if_equal + source_labels: [__meta_kubernetes_service_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number] + - source_labels: + [__meta_kubernetes_service_annotation_prometheus_io_scrape_slow] + action: keep + regex: true + - source_labels: + [__meta_kubernetes_service_annotation_prometheus_io_scheme] + action: replace + target_label: __scheme__ + regex: (https?) + - source_labels: + [__meta_kubernetes_service_annotation_prometheus_io_path] + action: replace + target_label: __metrics_path__ + regex: (.+) + - source_labels: + [ + __address__, + __meta_kubernetes_service_annotation_prometheus_io_port, + ] + action: replace + target_label: __address__ + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - source_labels: [__meta_kubernetes_pod_name] + target_label: pod + - source_labels: [__meta_kubernetes_pod_container_name] + target_label: container + - source_labels: [__meta_kubernetes_namespace] + target_label: namespace + - source_labels: [__meta_kubernetes_service_name] + target_label: service + - source_labels: [__meta_kubernetes_service_name] + target_label: job + replacement: ${1} + - source_labels: [__meta_kubernetes_pod_node_name] + action: replace + target_label: node + # Example scrape config for probing services via the Blackbox Exporter. + # + # The relabeling allows the actual service scrape endpoint to be configured + # via the following annotations: + # + # * `prometheus.io/probe`: Only probe services that have a value of `true` + - job_name: "kubernetes-services" + metrics_path: /probe + params: + module: [http_2xx] + kubernetes_sd_configs: + - role: service + relabel_configs: + - source_labels: + [__meta_kubernetes_service_annotation_prometheus_io_probe] + action: keep + regex: true + - source_labels: [__address__] + target_label: __param_target + - target_label: __address__ + replacement: blackbox + - source_labels: [__param_target] + target_label: instance + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - source_labels: [__meta_kubernetes_namespace] + target_label: namespace + - source_labels: [__meta_kubernetes_service_name] + target_label: service + # Example scrape config for pods + # + # The relabeling allows the actual pod scrape endpoint to be configured via the + # following annotations: + # + # * `prometheus.io/scrape`: Only scrape pods that have a value of `true` + # * `prometheus.io/path`: If the metrics path is not `/metrics` override this. + # * `prometheus.io/port`: Scrape the pod on the indicated port instead of the default of `9102`. + - job_name: "kubernetes-pods" + kubernetes_sd_configs: + - role: pod + relabel_configs: + - action: drop + source_labels: [__meta_kubernetes_pod_container_init] + regex: true + - action: keep_if_equal + source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number] + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] + action: keep + regex: true + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] + action: replace + target_label: __metrics_path__ + regex: (.+) + - source_labels: + [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] + action: replace + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + target_label: __address__ + - action: labelmap + regex: __meta_kubernetes_pod_label_(.+) + - source_labels: [__meta_kubernetes_pod_name] + target_label: pod + - source_labels: [__meta_kubernetes_pod_container_name] + target_label: container + - source_labels: [__meta_kubernetes_namespace] + target_label: namespace + - source_labels: [__meta_kubernetes_pod_node_name] + action: replace + target_label: node + ## End of COPY + +# -- Extra scrape configs that will be appended to `config` +extraScrapeConfigs: [] + +# Add extra specs dynamically to this chart +extraObjects: [] + +# -- Enterprise license key configuration for VictoriaMetrics enterprise. +# Required only for VictoriaMetrics enterprise. +# Documentation - https://docs.victoriametrics.com/enterprise.html, +# for more information, visit https://victoriametrics.com/products/enterprise/ . +# To request a trial license, go to https://victoriametrics.com/products/enterprise/trial/ +# Supported starting from VictoriaMetrics v1.94.0 +license: + # -- License key + key: "" + + # -- Use existing secret with license key + secret: + # -- Existing secret name + name: "" + # -- Key in secret with license key + key: "" diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/.helmignore b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/.helmignore new file mode 100644 index 000000000..50af03172 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/.helmignore @@ -0,0 +1,22 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/CHANGELOG.md b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/CHANGELOG.md new file mode 100644 index 000000000..2f7360169 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/CHANGELOG.md @@ -0,0 +1,154 @@ +# CHANGELOG for `victoria-metrics-single` helm-chart + +## Next release + +- TODO + +## 0.9.15 + +**Release date:** 2024-02-01 + +![AppVersion: v1.97.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.97.1&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- bump version of VM components to [v1.97.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.97.1) + +## 0.9.14 + +**Release date:** 2023-12-13 + +![AppVersion: v1.96.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.96.0&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- Fix configuration of volume mount for license key referenced by using secret. + +## 0.9.13 + +**Release date:** 2023-12-12 + +![AppVersion: v1.96.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.96.0&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- bump version of VM components to [v1.96.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.96.0) + +## 0.9.12 + +**Release date:** 2023-11-16 + +![AppVersion: v1.95.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.95.1&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- bump version of VM components to [v1.95.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.95.1) + +## 0.9.11 + +**Release date:** 2023-11-15 + +![AppVersion: v1.95.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.95.0&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- bump version of VM components to [v1.95.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.95.0) + +## 0.9.10 + +**Release date:** 2023-10-12 + +![AppVersion: v1.94.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.94.0&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- Add license enforcement for vmbackupmanager in order to avoid running it without enterprise license key. See [these docs](https://docs.victoriametrics.com/enterprise.html) for details. +- Fix license flags not being passed to vmsingle when using StatefulSet. + +## 0.9.9 + +**Release date:** 2023-10-04 + +![AppVersion: v1.94.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.94.0&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- bump version of VM components to [v1.94.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.94.0) +- Add support of providing enterprise license key for VictoriaMetrics enterprise. See [these docs](https://docs.victoriametrics.com/enterprise.html) for details. + +## 0.9.8 + +**Release date:** 2023-09-21 + +![AppVersion: v1.93.5](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.5&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- Bump version of VM components to [v1.93.5](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.93.5) + +## 0.9.7 + +**Release date:** 2023-09-11 + +![AppVersion: v1.93.4](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.4&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- Bump version of VM components to [v1.93.4](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.93.4) + +## 0.9.6 + +**Release date:** 2023-09-04 + +![AppVersion: v1.93.3](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.3&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- Bump version of Victoria Metrics to `v1.93.3` +- Fixed `kubeVersion` in `Chart.yaml` + +## 0.9.5 + +**Release date:** 2023-08-30 + +![AppVersion: v1.93.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.1&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +* Disable `honorTimestamps` for cadvisor scrape job by default (#617) + +## 0.9.4 + +**Release date:** 2023-08-23 + +![AppVersion: v1.93.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.0&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +* Update VictoriaMetrics components from v1.93.0 to v1.93.1 + +## 0.9.3 + +**Release date:** 2023-08-12 + +![AppVersion: v1.93.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.0&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +* Update VictoriaMetrics components from v1.92.1 to v1.93.0 + +## 0.9.2 + +**Release date:** 2023-07-28 + +![AppVersion: v1.92.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.92.1&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +* Update VictoriaMetrics components from v1.92.0 to v1.92.1 (#599) + +## 0.9.1 + +**Release date:** 2023-07-27 + +![AppVersion: v1.92.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.92.0&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +* Update VictoriaMetrics components from v1.91.3 to v1.92.0 +* fix misused securityContext and podSecurityContext (#592) + +## 0.9.0 + +**Release date:** 2023-07-13 + +![AppVersion: v1.91.3](https://img.shields.io/static/v1?label=AppVersion&message=v1.91.3&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +* bump version of agent, alert, auth, cluster, single +* feat(vmsingle): Add ability to deploy extra manifests (#587) diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/Chart.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/Chart.yaml new file mode 100644 index 000000000..2d3a07172 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/Chart.yaml @@ -0,0 +1,31 @@ +annotations: + artifacthub.io/category: monitoring-logging + artifacthub.io/changes: '- bump version of VM components to [v1.97.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.97.1)' + artifacthub.io/license: Apache-2.0 + artifacthub.io/links: | + - name: Sources + url: https://github.com/VictoriaMetrics/helm-charts + - name: Charts repo + url: https://victoriametrics.github.io/helm-charts/ + - name: Docs + url: https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html +apiVersion: v1 +appVersion: v1.97.1 +description: Victoria Metrics Single version - high-performance, cost-effective and + scalable TSDB, long-term remote storage for Prometheus +keywords: +- victoriametrics +- vmsingle +- single +- monitoring +- kubernetes +- observability +- tsdb +- metrics +- metricsql +- timeseries +kubeVersion: '>=1.23.0-0' +name: victoria-metrics-single +sources: +- https://github.com/VictoriaMetrics/helm-charts +version: 0.9.15 diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/README.md b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/README.md new file mode 100644 index 000000000..8828b7b65 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/README.md @@ -0,0 +1,240 @@ +# Victoria Metrics Helm Chart for Single Version + + ![Version: 0.9.15](https://img.shields.io/badge/Version-0.9.15-informational?style=flat-square) +[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/victoriametrics)](https://artifacthub.io/packages/helm/victoriametrics/victoria-metrics-single) + +Victoria Metrics Single version - high-performance, cost-effective and scalable TSDB, long-term remote storage for Prometheus + +## Prerequisites + +* Install the follow packages: ``git``, ``kubectl``, ``helm``, ``helm-docs``. See this [tutorial](../../REQUIREMENTS.md). +* PV support on underlying infrastructure. + +## Chart Details + +This chart will do the following: + +* Rollout Victoria Metrics Single. + +## How to install + +Access a Kubernetes cluster. + +Add a chart helm repository with follow commands: + +```console +helm repo add vm https://victoriametrics.github.io/helm-charts/ + +helm repo update +``` + +List versions of ``vm/victoria-metrics-single`` chart available to installation: + +```console +helm search repo vm/victoria-metrics-single -l +``` + +Export default values of ``victoria-metrics-single`` chart to file ``values.yaml``: + +```console +helm show values vm/victoria-metrics-single > values.yaml +``` + +Change the values according to the need of the environment in ``values.yaml`` file. + +Test the installation with command: + +```console +helm install vmsingle vm/victoria-metrics-single -f values.yaml -n NAMESPACE --debug --dry-run +``` + +Install chart with command: + +```console +helm install vmsingle vm/victoria-metrics-single -f values.yaml -n NAMESPACE +``` + +Get the pods lists by running this commands: + +```console +kubectl get pods -A | grep 'single' +``` + +Get the application by running this command: + +```console +helm list -f vmsingle -n NAMESPACE +``` + +See the history of versions of ``vmsingle`` application with command. + +```console +helm history vmsingle -n NAMESPACE +``` + +## How to uninstall + +Remove application with command. + +```console +helm uninstall vmsingle -n NAMESPACE +``` + +## Documentation of Helm Chart + +Install ``helm-docs`` following the instructions on this [tutorial](../../REQUIREMENTS.md). + +Generate docs with ``helm-docs`` command. + +```bash +cd charts/victoria-metrics-single + +helm-docs +``` + +The markdown generation is entirely go template driven. The tool parses metadata from charts and generates a number of sub-templates that can be referenced in a template file (by default ``README.md.gotmpl``). If no template file is provided, the tool has a default internal template that will generate a reasonably formatted README. + +## Parameters + +The following tables lists the configurable parameters of the chart and their default values. + +Change the values according to the need of the environment in ``victoria-metrics-single/values.yaml`` file. + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| automountServiceAccountToken | bool | `true` | | +| extraObjects | list | `[]` | Add extra specs dynamically to this chart | +| license | object | `{"key":"","secret":{"key":"","name":""}}` | Enterprise license key configuration for VictoriaMetrics enterprise. Required only for VictoriaMetrics enterprise. Documentation - https://docs.victoriametrics.com/enterprise.html, for more information, visit https://victoriametrics.com/products/enterprise/ . To request a trial license, go to https://victoriametrics.com/products/enterprise/trial/ Supported starting from VictoriaMetrics v1.94.0 | +| license.key | string | `""` | License key | +| license.secret | object | `{"key":"","name":""}` | Use existing secret with license key | +| license.secret.key | string | `""` | Key in secret with license key | +| license.secret.name | string | `""` | Existing secret name | +| podDisruptionBudget.enabled | bool | `false` | See `kubectl explain poddisruptionbudget.spec` for more. Ref: [https://kubernetes.io/docs/tasks/run-application/configure-pdb/](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) | +| podDisruptionBudget.extraLabels | object | `{}` | | +| printNotes | bool | `true` | Print chart notes | +| rbac.create | bool | `true` | | +| rbac.extraLabels | object | `{}` | | +| rbac.namespaced | bool | `false` | | +| rbac.pspEnabled | bool | `true` | | +| server.affinity | object | `{}` | Pod affinity | +| server.containerWorkingDir | string | `""` | Container workdir | +| server.enabled | bool | `true` | Enable deployment of server component. Deployed as StatefulSet | +| server.env | list | `[]` | Additional environment variables (ex.: secret tokens, flags) https://github.com/VictoriaMetrics/VictoriaMetrics#environment-variables | +| server.envFrom | list | `[]` | | +| server.extraArgs."envflag.enable" | string | `"true"` | | +| server.extraArgs."envflag.prefix" | string | `"VM_"` | | +| server.extraArgs.loggerFormat | string | `"json"` | | +| server.extraContainers | list | `[]` | | +| server.extraHostPathMounts | list | `[]` | | +| server.extraLabels | object | `{}` | Sts/Deploy additional labels | +| server.extraVolumeMounts | list | `[]` | | +| server.extraVolumes | list | `[]` | | +| server.fullnameOverride | string | `nil` | Overrides the full name of server component | +| server.image.pullPolicy | string | `"IfNotPresent"` | Image pull policy | +| server.image.repository | string | `"victoriametrics/victoria-metrics"` | Image repository | +| server.image.tag | string | `"v1.97.1"` | Image tag | +| server.ingress.annotations | object | `{}` | Ingress annotations | +| server.ingress.enabled | bool | `false` | Enable deployment of ingress for server component | +| server.ingress.extraLabels | object | `{}` | Ingress extra labels | +| server.ingress.hosts | list | `[]` | Array of host objects | +| server.ingress.pathType | string | `"Prefix"` | pathType is only for k8s >= 1.1= | +| server.ingress.tls | list | `[]` | Array of TLS objects | +| server.initContainers | list | `[]` | | +| server.livenessProbe.failureThreshold | int | `10` | | +| server.livenessProbe.httpGet.path | string | `"/health"` | | +| server.livenessProbe.httpGet.port | int | `8428` | | +| server.livenessProbe.httpGet.scheme | string | `"HTTP"` | | +| server.livenessProbe.initialDelaySeconds | int | `30` | | +| server.livenessProbe.periodSeconds | int | `30` | | +| server.livenessProbe.timeoutSeconds | int | `5` | | +| server.name | string | `"server"` | Server container name | +| server.nodeSelector | object | `{}` | Pod's node selector. Ref: [https://kubernetes.io/docs/user-guide/node-selection/](https://kubernetes.io/docs/user-guide/node-selection/) | +| server.persistentVolume.accessModes | list | `["ReadWriteOnce"]` | Array of access modes. Must match those of existing PV or dynamic provisioner. Ref: [http://kubernetes.io/docs/user-guide/persistent-volumes/](http://kubernetes.io/docs/user-guide/persistent-volumes/) | +| server.persistentVolume.annotations | object | `{}` | Persistant volume annotations | +| server.persistentVolume.enabled | bool | `true` | Create/use Persistent Volume Claim for server component. Empty dir if false | +| server.persistentVolume.existingClaim | string | `""` | Existing Claim name. If defined, PVC must be created manually before volume will be bound | +| server.persistentVolume.matchLabels | object | `{}` | Bind Persistent Volume by labels. Must match all labels of targeted PV. | +| server.persistentVolume.mountPath | string | `"/storage"` | Mount path. Server data Persistent Volume mount root path. | +| server.persistentVolume.size | string | `"16Gi"` | Size of the volume. Should be calculated based on the metrics you send and retention policy you set. | +| server.persistentVolume.storageClass | string | `""` | StorageClass to use for persistent volume. Requires server.persistentVolume.enabled: true. If defined, PVC created automatically | +| server.persistentVolume.subPath | string | `""` | Mount subpath | +| server.podAnnotations | object | `{}` | Pod's annotations | +| server.podLabels | object | `{}` | Pod's additional labels | +| server.podManagementPolicy | string | `"OrderedReady"` | Pod's management policy | +| server.podSecurityContext | object | `{}` | Pod's security context. Ref: [https://kubernetes.io/docs/tasks/configure-pod-container/security-context/](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) | +| server.priorityClassName | string | `""` | Name of Priority Class | +| server.readinessProbe.failureThreshold | int | `3` | | +| server.readinessProbe.httpGet.path | string | `"/health"` | | +| server.readinessProbe.httpGet.port | string | `"http"` | | +| server.readinessProbe.initialDelaySeconds | int | `5` | | +| server.readinessProbe.periodSeconds | int | `15` | | +| server.readinessProbe.timeoutSeconds | int | `5` | | +| server.resources | object | `{}` | Resource object. Ref: [http://kubernetes.io/docs/user-guide/compute-resources/](http://kubernetes.io/docs/user-guide/compute-resources/ | +| server.retentionPeriod | int | `1` | Data retention period in month | +| server.scrape | object | `{"config":{"global":{"scrape_interval":"15s"},"scrape_configs":[{"job_name":"victoriametrics","static_configs":[{"targets":["localhost:8428"]}]},{"bearer_token_file":"/var/run/secrets/kubernetes.io/serviceaccount/token","job_name":"kubernetes-apiservers","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"keep","regex":"default;kubernetes;https","source_labels":["__meta_kubernetes_namespace","__meta_kubernetes_service_name","__meta_kubernetes_endpoint_port_name"]}],"scheme":"https","tls_config":{"ca_file":"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt","insecure_skip_verify":true}},{"bearer_token_file":"/var/run/secrets/kubernetes.io/serviceaccount/token","job_name":"kubernetes-nodes","kubernetes_sd_configs":[{"role":"node"}],"relabel_configs":[{"action":"labelmap","regex":"__meta_kubernetes_node_label_(.+)"},{"replacement":"kubernetes.default.svc:443","target_label":"__address__"},{"regex":"(.+)","replacement":"/api/v1/nodes/$1/proxy/metrics","source_labels":["__meta_kubernetes_node_name"],"target_label":"__metrics_path__"}],"scheme":"https","tls_config":{"ca_file":"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt","insecure_skip_verify":true}},{"bearer_token_file":"/var/run/secrets/kubernetes.io/serviceaccount/token","honor_timestamps":false,"job_name":"kubernetes-nodes-cadvisor","kubernetes_sd_configs":[{"role":"node"}],"relabel_configs":[{"action":"labelmap","regex":"__meta_kubernetes_node_label_(.+)"},{"replacement":"kubernetes.default.svc:443","target_label":"__address__"},{"regex":"(.+)","replacement":"/api/v1/nodes/$1/proxy/metrics/cadvisor","source_labels":["__meta_kubernetes_node_name"],"target_label":"__metrics_path__"}],"scheme":"https","tls_config":{"ca_file":"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt","insecure_skip_verify":true}},{"job_name":"kubernetes-service-endpoints","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scrape"]},{"action":"replace","regex":"(https?)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scheme"],"target_label":"__scheme__"},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_service_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"},{"action":"replace","source_labels":["__meta_kubernetes_pod_node_name"],"target_label":"kubernetes_node"}]},{"job_name":"kubernetes-service-endpoints-slow","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scrape_slow"]},{"action":"replace","regex":"(https?)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scheme"],"target_label":"__scheme__"},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_service_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"},{"action":"replace","source_labels":["__meta_kubernetes_pod_node_name"],"target_label":"kubernetes_node"}],"scrape_interval":"5m","scrape_timeout":"30s"},{"job_name":"kubernetes-services","kubernetes_sd_configs":[{"role":"service"}],"metrics_path":"/probe","params":{"module":["http_2xx"]},"relabel_configs":[{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_probe"]},{"source_labels":["__address__"],"target_label":"__param_target"},{"replacement":"blackbox","target_label":"__address__"},{"source_labels":["__param_target"],"target_label":"instance"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"}]},{"job_name":"kubernetes-pods","kubernetes_sd_configs":[{"role":"pod"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_scrape"]},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_pod_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_pod_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_pod_name"],"target_label":"kubernetes_pod_name"}]}]},"configMap":"","enabled":false,"extraScrapeConfigs":[]}` | Scrape configuration for victoriametrics | +| server.scrape.config | object | `{"global":{"scrape_interval":"15s"},"scrape_configs":[{"job_name":"victoriametrics","static_configs":[{"targets":["localhost:8428"]}]},{"bearer_token_file":"/var/run/secrets/kubernetes.io/serviceaccount/token","job_name":"kubernetes-apiservers","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"keep","regex":"default;kubernetes;https","source_labels":["__meta_kubernetes_namespace","__meta_kubernetes_service_name","__meta_kubernetes_endpoint_port_name"]}],"scheme":"https","tls_config":{"ca_file":"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt","insecure_skip_verify":true}},{"bearer_token_file":"/var/run/secrets/kubernetes.io/serviceaccount/token","job_name":"kubernetes-nodes","kubernetes_sd_configs":[{"role":"node"}],"relabel_configs":[{"action":"labelmap","regex":"__meta_kubernetes_node_label_(.+)"},{"replacement":"kubernetes.default.svc:443","target_label":"__address__"},{"regex":"(.+)","replacement":"/api/v1/nodes/$1/proxy/metrics","source_labels":["__meta_kubernetes_node_name"],"target_label":"__metrics_path__"}],"scheme":"https","tls_config":{"ca_file":"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt","insecure_skip_verify":true}},{"bearer_token_file":"/var/run/secrets/kubernetes.io/serviceaccount/token","honor_timestamps":false,"job_name":"kubernetes-nodes-cadvisor","kubernetes_sd_configs":[{"role":"node"}],"relabel_configs":[{"action":"labelmap","regex":"__meta_kubernetes_node_label_(.+)"},{"replacement":"kubernetes.default.svc:443","target_label":"__address__"},{"regex":"(.+)","replacement":"/api/v1/nodes/$1/proxy/metrics/cadvisor","source_labels":["__meta_kubernetes_node_name"],"target_label":"__metrics_path__"}],"scheme":"https","tls_config":{"ca_file":"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt","insecure_skip_verify":true}},{"job_name":"kubernetes-service-endpoints","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scrape"]},{"action":"replace","regex":"(https?)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scheme"],"target_label":"__scheme__"},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_service_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"},{"action":"replace","source_labels":["__meta_kubernetes_pod_node_name"],"target_label":"kubernetes_node"}]},{"job_name":"kubernetes-service-endpoints-slow","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scrape_slow"]},{"action":"replace","regex":"(https?)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scheme"],"target_label":"__scheme__"},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_service_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"},{"action":"replace","source_labels":["__meta_kubernetes_pod_node_name"],"target_label":"kubernetes_node"}],"scrape_interval":"5m","scrape_timeout":"30s"},{"job_name":"kubernetes-services","kubernetes_sd_configs":[{"role":"service"}],"metrics_path":"/probe","params":{"module":["http_2xx"]},"relabel_configs":[{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_probe"]},{"source_labels":["__address__"],"target_label":"__param_target"},{"replacement":"blackbox","target_label":"__address__"},{"source_labels":["__param_target"],"target_label":"instance"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"}]},{"job_name":"kubernetes-pods","kubernetes_sd_configs":[{"role":"pod"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_scrape"]},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_pod_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_pod_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_pod_name"],"target_label":"kubernetes_pod_name"}]}]}` | Scrape config | +| server.scrape.config.scrape_configs | list | `[{"job_name":"victoriametrics","static_configs":[{"targets":["localhost:8428"]}]},{"bearer_token_file":"/var/run/secrets/kubernetes.io/serviceaccount/token","job_name":"kubernetes-apiservers","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"keep","regex":"default;kubernetes;https","source_labels":["__meta_kubernetes_namespace","__meta_kubernetes_service_name","__meta_kubernetes_endpoint_port_name"]}],"scheme":"https","tls_config":{"ca_file":"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt","insecure_skip_verify":true}},{"bearer_token_file":"/var/run/secrets/kubernetes.io/serviceaccount/token","job_name":"kubernetes-nodes","kubernetes_sd_configs":[{"role":"node"}],"relabel_configs":[{"action":"labelmap","regex":"__meta_kubernetes_node_label_(.+)"},{"replacement":"kubernetes.default.svc:443","target_label":"__address__"},{"regex":"(.+)","replacement":"/api/v1/nodes/$1/proxy/metrics","source_labels":["__meta_kubernetes_node_name"],"target_label":"__metrics_path__"}],"scheme":"https","tls_config":{"ca_file":"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt","insecure_skip_verify":true}},{"bearer_token_file":"/var/run/secrets/kubernetes.io/serviceaccount/token","honor_timestamps":false,"job_name":"kubernetes-nodes-cadvisor","kubernetes_sd_configs":[{"role":"node"}],"relabel_configs":[{"action":"labelmap","regex":"__meta_kubernetes_node_label_(.+)"},{"replacement":"kubernetes.default.svc:443","target_label":"__address__"},{"regex":"(.+)","replacement":"/api/v1/nodes/$1/proxy/metrics/cadvisor","source_labels":["__meta_kubernetes_node_name"],"target_label":"__metrics_path__"}],"scheme":"https","tls_config":{"ca_file":"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt","insecure_skip_verify":true}},{"job_name":"kubernetes-service-endpoints","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scrape"]},{"action":"replace","regex":"(https?)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scheme"],"target_label":"__scheme__"},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_service_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"},{"action":"replace","source_labels":["__meta_kubernetes_pod_node_name"],"target_label":"kubernetes_node"}]},{"job_name":"kubernetes-service-endpoints-slow","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scrape_slow"]},{"action":"replace","regex":"(https?)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scheme"],"target_label":"__scheme__"},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_service_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"},{"action":"replace","source_labels":["__meta_kubernetes_pod_node_name"],"target_label":"kubernetes_node"}],"scrape_interval":"5m","scrape_timeout":"30s"},{"job_name":"kubernetes-services","kubernetes_sd_configs":[{"role":"service"}],"metrics_path":"/probe","params":{"module":["http_2xx"]},"relabel_configs":[{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_probe"]},{"source_labels":["__address__"],"target_label":"__param_target"},{"replacement":"blackbox","target_label":"__address__"},{"source_labels":["__param_target"],"target_label":"instance"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"}]},{"job_name":"kubernetes-pods","kubernetes_sd_configs":[{"role":"pod"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_scrape"]},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_pod_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_pod_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_pod_name"],"target_label":"kubernetes_pod_name"}]}]` | Scrape targets | +| server.scrape.config.scrape_configs[0] | object | `{"job_name":"victoriametrics","static_configs":[{"targets":["localhost:8428"]}]}` | Scrape rule for scrape victoriametrics | +| server.scrape.config.scrape_configs[4] | object | `{"job_name":"kubernetes-service-endpoints","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scrape"]},{"action":"replace","regex":"(https?)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scheme"],"target_label":"__scheme__"},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_service_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"},{"action":"replace","source_labels":["__meta_kubernetes_pod_node_name"],"target_label":"kubernetes_node"}]}` | Scrape rule using kubernetes service discovery for endpoints | +| server.scrape.config.scrape_configs[5] | object | `{"job_name":"kubernetes-service-endpoints-slow","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scrape_slow"]},{"action":"replace","regex":"(https?)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scheme"],"target_label":"__scheme__"},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_service_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"},{"action":"replace","source_labels":["__meta_kubernetes_pod_node_name"],"target_label":"kubernetes_node"}],"scrape_interval":"5m","scrape_timeout":"30s"}` | Scrape config for slow service endpoints; same as above, but with a larger timeout and a larger interval The relabeling allows the actual service scrape endpoint to be configured via the following annotations: * `prometheus.io/scrape-slow`: Only scrape services that have a value of `true` * `prometheus.io/scheme`: If the metrics endpoint is secured then you will need to set this to `https` & most likely set the `tls_config` of the scrape config. * `prometheus.io/path`: If the metrics path is not `/metrics` override this. * `prometheus.io/port`: If the metrics are exposed on a different port to the service then set this appropriately. | +| server.scrape.config.scrape_configs[6] | object | `{"job_name":"kubernetes-services","kubernetes_sd_configs":[{"role":"service"}],"metrics_path":"/probe","params":{"module":["http_2xx"]},"relabel_configs":[{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_probe"]},{"source_labels":["__address__"],"target_label":"__param_target"},{"replacement":"blackbox","target_label":"__address__"},{"source_labels":["__param_target"],"target_label":"instance"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"}]}` | Example scrape config for probing services via the Blackbox Exporter. The relabeling allows the actual service scrape endpoint to be configured via the following annotations: * `prometheus.io/probe`: Only probe services that have a value of `true` | +| server.scrape.config.scrape_configs[7] | object | `{"job_name":"kubernetes-pods","kubernetes_sd_configs":[{"role":"pod"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_scrape"]},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_pod_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_pod_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_pod_name"],"target_label":"kubernetes_pod_name"}]}` | Example scrape config for pods The relabeling allows the actual pod scrape endpoint to be configured via the following annotations: * `prometheus.io/scrape`: Only scrape pods that have a value of `true` * `prometheus.io/path`: If the metrics path is not `/metrics` override this. * `prometheus.io/port`: Scrape the pod on the indicated port instead of the default of `9102`. | +| server.scrape.configMap | string | `""` | Use existing configmap if specified otherwise .config values will be used | +| server.scrape.enabled | bool | `false` | If true scrapes targets, creates config map or use specified one with scrape targets | +| server.scrape.extraScrapeConfigs | list | `[]` | Extra scrape configs that will be appended to `server.scrape.config` | +| server.securityContext | object | `{}` | Security context to be added to server pods | +| server.service.annotations | object | `{}` | Service annotations | +| server.service.clusterIP | string | `""` | Service ClusterIP | +| server.service.externalIPs | list | `[]` | Service External IPs. Ref: [https://kubernetes.io/docs/user-guide/services/#external-ips]( https://kubernetes.io/docs/user-guide/services/#external-ips) | +| server.service.labels | object | `{}` | Service labels | +| server.service.loadBalancerIP | string | `""` | Service load balacner IP | +| server.service.loadBalancerSourceRanges | list | `[]` | Load balancer source range | +| server.service.servicePort | int | `8428` | Service port | +| server.service.type | string | `"ClusterIP"` | Service type | +| server.serviceMonitor.annotations | object | `{}` | Service Monitor annotations | +| server.serviceMonitor.enabled | bool | `false` | Enable deployment of Service Monitor for server component. This is Prometheus operator object | +| server.serviceMonitor.extraLabels | object | `{}` | Service Monitor labels | +| server.serviceMonitor.relabelings | list | `[]` | Service Monitor relabelings | +| server.startupProbe | object | `{}` | | +| server.statefulSet.enabled | bool | `true` | Creates statefulset instead of deployment, useful when you want to keep the cache | +| server.statefulSet.podManagementPolicy | string | `"OrderedReady"` | Deploy order policy for StatefulSet pods | +| server.statefulSet.service.annotations | object | `{}` | Headless service annotations | +| server.statefulSet.service.labels | object | `{}` | Headless service labels | +| server.statefulSet.service.servicePort | int | `8428` | Headless service port | +| server.terminationGracePeriodSeconds | int | `60` | Pod's termination grace period in seconds | +| server.tolerations | list | `[]` | Node tolerations for server scheduling to nodes with taints. Ref: [https://kubernetes.io/docs/concepts/configuration/assign-pod-node/](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/) | +| server.vmbackupmanager.destination | string | `""` | backup destination at S3, GCS or local filesystem. Release name will be included to path! | +| server.vmbackupmanager.disableDaily | bool | `false` | disable daily backups | +| server.vmbackupmanager.disableHourly | bool | `false` | disable hourly backups | +| server.vmbackupmanager.disableMonthly | bool | `false` | disable monthly backups | +| server.vmbackupmanager.disableWeekly | bool | `false` | disable weekly backups | +| server.vmbackupmanager.enable | bool | `false` | enable automatic creation of backup via vmbackupmanager. vmbackupmanager is part of Enterprise packages | +| server.vmbackupmanager.env | list | `[]` | Additional environment variables (ex.: secret tokens, flags) https://github.com/VictoriaMetrics/VictoriaMetrics#environment-variables | +| server.vmbackupmanager.eula | bool | `false` | should be true and means that you have the legal right to run a backup manager that can either be a signed contract or an email with confirmation to run the service in a trial period # https://victoriametrics.com/legal/esa/ | +| server.vmbackupmanager.extraArgs."envflag.enable" | string | `"true"` | | +| server.vmbackupmanager.extraArgs."envflag.prefix" | string | `"VM_"` | | +| server.vmbackupmanager.extraArgs.loggerFormat | string | `"json"` | | +| server.vmbackupmanager.extraVolumeMounts | list | `[]` | | +| server.vmbackupmanager.image.repository | string | `"victoriametrics/vmbackupmanager"` | vmbackupmanager image repository | +| server.vmbackupmanager.image.tag | string | `"v1.97.1-enterprise"` | vmbackupmanager image tag | +| server.vmbackupmanager.livenessProbe.failureThreshold | int | `10` | | +| server.vmbackupmanager.livenessProbe.initialDelaySeconds | int | `30` | | +| server.vmbackupmanager.livenessProbe.periodSeconds | int | `30` | | +| server.vmbackupmanager.livenessProbe.tcpSocket.port | string | `"manager-http"` | | +| server.vmbackupmanager.livenessProbe.timeoutSeconds | int | `5` | | +| server.vmbackupmanager.readinessProbe.failureThreshold | int | `3` | | +| server.vmbackupmanager.readinessProbe.httpGet.path | string | `"/health"` | | +| server.vmbackupmanager.readinessProbe.httpGet.port | string | `"manager-http"` | | +| server.vmbackupmanager.readinessProbe.initialDelaySeconds | int | `5` | | +| server.vmbackupmanager.readinessProbe.periodSeconds | int | `15` | | +| server.vmbackupmanager.readinessProbe.timeoutSeconds | int | `5` | | +| server.vmbackupmanager.resources | object | `{}` | | +| server.vmbackupmanager.restore | object | `{"onStart":{"enabled":false}}` | Allows to enable restore options for pod. Read more: https://docs.victoriametrics.com/vmbackupmanager.html#restore-commands | +| server.vmbackupmanager.retention | object | `{"keepLastDaily":2,"keepLastHourly":2,"keepLastMonthly":2,"keepLastWeekly":2}` | backups' retention settings | +| server.vmbackupmanager.retention.keepLastDaily | int | `2` | keep last N daily backups. 0 means delete all existing daily backups. Specify -1 to turn off | +| server.vmbackupmanager.retention.keepLastHourly | int | `2` | keep last N hourly backups. 0 means delete all existing hourly backups. Specify -1 to turn off | +| server.vmbackupmanager.retention.keepLastMonthly | int | `2` | keep last N monthly backups. 0 means delete all existing monthly backups. Specify -1 to turn off | +| server.vmbackupmanager.retention.keepLastWeekly | int | `2` | keep last N weekly backups. 0 means delete all existing weekly backups. Specify -1 to turn off | +| serviceAccount.automountToken | bool | `true` | Mount API token to pod directly | +| serviceAccount.create | bool | `true` | Create service account. | +| serviceAccount.extraLabels | object | `{}` | | \ No newline at end of file diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/README.md.gotmpl b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/README.md.gotmpl new file mode 100644 index 000000000..6e221d559 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/README.md.gotmpl @@ -0,0 +1,103 @@ +# Victoria Metrics Helm Chart for Single Version + +{{ template "chart.typeBadge" . }} {{ template "chart.versionBadge" . }} +[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/victoriametrics)](https://artifacthub.io/packages/helm/victoriametrics/victoria-metrics-single) + +{{ template "chart.description" . }} + +## Prerequisites + +* Install the follow packages: ``git``, ``kubectl``, ``helm``, ``helm-docs``. See this [tutorial](../../REQUIREMENTS.md). +* PV support on underlying infrastructure. + +## Chart Details + +This chart will do the following: + +* Rollout Victoria Metrics Single. + +## How to install + +Access a Kubernetes cluster. + +Add a chart helm repository with follow commands: + +```console +helm repo add vm https://victoriametrics.github.io/helm-charts/ + +helm repo update +``` + +List versions of ``vm/victoria-metrics-single`` chart available to installation: + +```console +helm search repo vm/victoria-metrics-single -l +``` + +Export default values of ``victoria-metrics-single`` chart to file ``values.yaml``: + +```console +helm show values vm/victoria-metrics-single > values.yaml +``` + +Change the values according to the need of the environment in ``values.yaml`` file. + +Test the installation with command: + +```console +helm install vmsingle vm/victoria-metrics-single -f values.yaml -n NAMESPACE --debug --dry-run +``` + +Install chart with command: + +```console +helm install vmsingle vm/victoria-metrics-single -f values.yaml -n NAMESPACE +``` + +Get the pods lists by running this commands: + +```console +kubectl get pods -A | grep 'single' +``` + +Get the application by running this command: + +```console +helm list -f vmsingle -n NAMESPACE +``` + +See the history of versions of ``vmsingle`` application with command. + +```console +helm history vmsingle -n NAMESPACE +``` + +## How to uninstall + +Remove application with command. + +```console +helm uninstall vmsingle -n NAMESPACE +``` + +## Documentation of Helm Chart + +Install ``helm-docs`` following the instructions on this [tutorial](../../REQUIREMENTS.md). + +Generate docs with ``helm-docs`` command. + +```bash +cd charts/victoria-metrics-single + +helm-docs +``` + +The markdown generation is entirely go template driven. The tool parses metadata from charts and generates a number of sub-templates that can be referenced in a template file (by default ``README.md.gotmpl``). If no template file is provided, the tool has a default internal template that will generate a reasonably formatted README. + +## Parameters + +The following tables lists the configurable parameters of the chart and their default values. + +Change the values according to the need of the environment in ``victoria-metrics-single/values.yaml`` file. + +{{ template "chart.valuesTable" . }} \ No newline at end of file diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/RELEASE_NOTES.md b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/RELEASE_NOTES.md new file mode 100644 index 000000000..4d13f3404 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/RELEASE_NOTES.md @@ -0,0 +1,9 @@ +# Release notes for version 0.9.15 + +**Release date:** 2024-02-01 + +![AppVersion: v1.97.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.97.1&color=success&logo=) +![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) + +- bump version of VM components to [v1.97.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.97.1) + diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/NOTES.txt b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/NOTES.txt new file mode 100644 index 000000000..6c357c127 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/NOTES.txt @@ -0,0 +1,51 @@ +{{- if .Values.printNotes }} +{{- if .Values.server.enabled }} +The VictoriaMetrics write api can be accessed via port {{ .Values.server.service.servicePort }} on the following DNS name from within your cluster: + {{ template "victoria-metrics.server.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local + + +Metrics Ingestion: + Get the Victoria Metrics service URL by running these commands in the same shell: + +{{- if contains "NodePort" .Values.server.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "victoria-metrics.server.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.server.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "victoria-metrics.server.fullname" . }}' + + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "victoria-metrics.server.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') + echo http://$SERVICE_IP:{{ .Values.server.service.servicePort }} +{{- else if contains "ClusterIP" .Values.server.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ .Values.server.name }}" -o jsonpath="{.items[0].metadata.name}") + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME {{ .Values.server.service.servicePort }} +{{- end }} + + Write url inside the kubernetes cluster: + http://{{ template "victoria-metrics.server.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local:{{ .Values.server.service.servicePort }}/api/v1/write + +{{- if .Values.server.scrape.enabled }} + +Metrics Scrape: + Pull-based scrapes are enabled + Scrape config can be displayed by running this command:: + {{- if eq .Values.server.scrape.configMap "" }} + kubectl get cm {{ template "victoria-metrics.server.fullname" . }}-scrapeconfig -n {{ .Release.Namespace }} + {{- else }} + kubectl get cm .Values.server.scrape.configMap -n {{ .Release.Namespace }} + {{- end }} + + The target’s information is accessible via api: + Inside cluster: + http://{{ template "victoria-metrics.server.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local:{{ .Values.server.service.servicePort }}/targets + Outside cluster: + You need to port-forward service (see instructions above) and call + http:///targets +{{- end }} + +Read Data: + The following url can be used as the datasource url in Grafana:: + http://{{ template "victoria-metrics.server.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local:{{ .Values.server.service.servicePort }} +{{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/_helpers.tpl b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/_helpers.tpl new file mode 100644 index 000000000..072d81d07 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/_helpers.tpl @@ -0,0 +1,227 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "victoria-metrics.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "victoria-metrics.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "victoria-metrics.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create the name of the service account +*/}} +{{- define "victoria-metrics.serviceAccountName" -}} +{{- if .Values.serviceAccount.create -}} + {{ default (include "victoria-metrics.fullname" .) .Values.serviceAccount.name }} +{{- else -}} + {{ default "default" .Values.serviceAccount.name }} +{{- end -}} +{{- end -}} + +{{/* +Create unified labels for victoria-metrics components +*/}} +{{- define "victoria-metrics.common.matchLabels" -}} +app.kubernetes.io/name: {{ include "victoria-metrics.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} + +{{- define "victoria-metrics.common.metaLabels" -}} +helm.sh/chart: {{ include "victoria-metrics.chart" . }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{- define "victoria-metrics.server.labels" -}} +{{ include "victoria-metrics.server.matchLabels" . }} +{{ include "victoria-metrics.common.metaLabels" . }} +{{- end -}} + +{{- define "victoria-metrics.server.matchLabels" -}} +app: {{ .Values.server.name }} +{{ include "victoria-metrics.common.matchLabels" . }} +{{- end -}} + +{{/* +Create a fully qualified server name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "victoria-metrics.server.fullname" -}} +{{- if .Values.server.fullnameOverride -}} +{{- .Values.server.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- printf "%s-%s" .Release.Name .Values.server.name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s-%s" .Release.Name $name .Values.server.name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + + +{{- define "split-host-port" -}} +{{- $hp := split ":" . -}} +{{- printf "%s" $hp._1 -}} +{{- end -}} + +{{/* +Defines the name of scrape configuration map +*/}} +{{- define "victoria-metrics.server.scrape.configname" -}} +{{- if .Values.server.scrape.configMap -}} +{{- .Values.server.scrape.configMap -}} +{{- else -}} +{{- include "victoria-metrics.server.fullname" . -}}-scrapeconfig +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for ingress. +*/}} +{{- define "victoria-metrics.ingress.apiVersion" -}} + {{- if and (.Capabilities.APIVersions.Has "networking.k8s.io/v1") -}} + {{- print "networking.k8s.io/v1" -}} + {{- else if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" -}} + {{- print "networking.k8s.io/v1beta1" -}} + {{- else -}} + {{- print "extensions/v1beta1" -}} + {{- end -}} +{{- end -}} + +{{/* +Return if ingress is stable. +*/}} +{{- define "victoria-metrics.ingress.isStable" -}} + {{- eq (include "victoria-metrics.ingress.apiVersion" .) "networking.k8s.io/v1" -}} +{{- end -}} + +{{/* +Return if ingress supports ingressClassName. +*/}} +{{- define "victoria-metrics.ingress.supportsIngressClassName" -}} + {{- or (eq (include "victoria-metrics.ingress.isStable" .) "true") (and (eq (include "victoria-metrics.ingress.apiVersion" .) "networking.k8s.io/v1beta1")) -}} +{{- end -}} + +{{/* +Return if ingress supports pathType. +*/}} +{{- define "victoria-metrics.ingress.supportsPathType" -}} + {{- or (eq (include "victoria-metrics.ingress.isStable" .) "true") (and (eq (include "victoria-metrics.ingress.apiVersion" .) "networking.k8s.io/v1beta1")) -}} +{{- end -}} + +{{- define "victoria-metrics.hasInitContainer" -}} + {{- or (gt (len .Values.server.initContainers) 0) .Values.server.vmbackupmanager.restore.onStart.enabled -}} +{{- end -}} + +{{- define "victoria-metrics.initContiners" -}} +{{- if eq (include "victoria-metrics.hasInitContainer" . ) "true" -}} +{{- with .Values.server.initContainers -}} +{{ toYaml . }} +{{- end -}} +{{- if .Values.server.vmbackupmanager.restore.onStart.enabled }} +- name: {{ template "victoria-metrics.name" . }}-vmbackupmanager-restore + image: "{{ .Values.server.vmbackupmanager.image.repository }}:{{ .Values.server.vmbackupmanager.image.tag }}" + imagePullPolicy: "{{ .Values.server.image.pullPolicy }}" + args: + - restore + - {{ printf "%s=%t" "--eula" .Values.server.vmbackupmanager.eula | quote}} + - {{ printf "%s=%s" "--storageDataPath" .Values.server.persistentVolume.mountPath | quote}} + {{- range $key, $value := .Values.server.vmbackupmanager.extraArgs }} + - --{{ $key }}={{ $value }} + {{- end }} + {{- with .Values.server.securityContext }} + securityContext: {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.server.vmbackupmanager.resources }} + resources: {{ toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.server.vmbackupmanager.env }} + env: {{ toYaml . | nindent 4 }} + {{- end }} + ports: + - name: manager-http + containerPort: 8300 + volumeMounts: + - name: server-volume + mountPath: {{ .Values.server.persistentVolume.mountPath }} + subPath: {{ .Values.server.persistentVolume.subPath }} + {{- with .Values.server.vmbackupmanager.extraVolumeMounts }} + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end -}} +{{- else -}} +[] +{{- end -}} +{{- end -}} + +{{/* +Return license flag if necessary. +*/}} +{{- define "victoria-metrics.license.flag" -}} +{{- if .Values.license.key -}} +-license={{ .Values.license.key }} +{{- end }} +{{- if and .Values.license.secret.name .Values.license.secret.key -}} +-licenseFile=/etc/vm-license-key/{{ .Values.license.secret.key }} +{{- end -}} +{{- end -}} + + +{{/* +Return license volume mount +*/}} +{{- define "victoria-metrics.license.volume" -}} +{{- if and .Values.license.secret.name .Values.license.secret.key -}} +- name: license-key + secret: + secretName: {{ .Values.license.secret.name }} +{{- end -}} +{{- end -}} + +{{/* +Return license volume mount for container +*/}} +{{- define "victoria-metrics.license.mount" -}} +{{- if and .Values.license.secret.name .Values.license.secret.key -}} +- name: license-key + mountPath: /etc/vm-license-key + readOnly: true +{{- end -}} +{{- end -}} + +{{/* +Enforce license for vmbackupmanager +*/}} +{{- define "victoria-metrics.vmbackupmanager.enforce_license" -}} +{{ if and .Values.server.vmbackupmanager.enable (not (or .Values.server.vmbackupmanager.eula .Values.license.key .Values.license.secret.name)) }} +{{ fail `Pass -eula command-line flag or valid license at .Values.license if you have an enterprise license for running this software. + See https://victoriametrics.com/legal/esa/ for details. + Documentation - https://docs.victoriametrics.com/enterprise.html + for more information, visit https://victoriametrics.com/products/enterprise/ + To request a trial license, go to https://victoriametrics.com/products/enterprise/trial/`}} +{{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/clusterrole.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/clusterrole.yaml new file mode 100644 index 000000000..44a86553a --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/clusterrole.yaml @@ -0,0 +1,50 @@ +{{- if and .Values.rbac.create (not .Values.rbac.namespaced) }} +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ template "victoria-metrics.fullname" . }}-clusterrole + labels: + {{- include "victoria-metrics.common.metaLabels" . | nindent 4 }} + {{- if .Values.rbac.extraLabels }} +{{ toYaml .Values.rbac.extraLabels | indent 4}} + {{- end }} +{{- with .Values.rbac.annotations }} + annotations: +{{ toYaml . | indent 4 }} +{{- end }} +{{- if or .Values.rbac.pspEnabled .Values.server.scrape.enabled }} +rules: + {{- if .Values.server.scrape.enabled }} + - apiGroups: + - discovery.k8s.io + resources: + - endpointslices + verbs: ["get", "list", "watch"] + - apiGroups: [ "" ] + resources: + - nodes + - nodes/proxy + - nodes/metrics + - services + - endpoints + - pods + verbs: [ "get", "list", "watch" ] + - apiGroups: + - extensions + - networking.k8s.io + resources: + - ingresses + verbs: [ "get", "list", "watch" ] + - nonResourceURLs: [ "/metrics" ] + verbs: [ "get" ] + {{- end }} + {{- if and .Values.rbac.pspEnabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} + - apiGroups: ['extensions'] + resources: ['podsecuritypolicies'] + verbs: ['use'] + resourceNames: [{{ template "victoria-metrics.fullname" . }}] + {{- end }} +{{- else }} +rules: [] +{{- end }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/clusterrolebinding.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/clusterrolebinding.yaml new file mode 100644 index 000000000..bee3ea1d1 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/clusterrolebinding.yaml @@ -0,0 +1,23 @@ +{{- if and .Values.rbac.create (not .Values.rbac.namespaced) }} +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ template "victoria-metrics.fullname" . }}-clusterrolebinding + labels: + {{- include "victoria-metrics.common.metaLabels" . | nindent 4 }} + {{- if .Values.rbac.extraLabels }} +{{ toYaml .Values.rbac.extraLabels | indent 4}} + {{- end }} +{{- with .Values.rbac.annotations }} + annotations: +{{ toYaml . | indent 4 }} +{{- end }} +subjects: + - kind: ServiceAccount + name: {{ template "victoria-metrics.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} +roleRef: + kind: ClusterRole + name: {{ template "victoria-metrics.fullname" . }}-clusterrole + apiGroup: rbac.authorization.k8s.io +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/extra-objects.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/extra-objects.yaml new file mode 100644 index 000000000..a9bb3b6ba --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/extra-objects.yaml @@ -0,0 +1,4 @@ +{{ range .Values.extraObjects }} +--- +{{ tpl (toYaml .) $ }} +{{ end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/pdb.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/pdb.yaml new file mode 100644 index 000000000..acdb390a3 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/pdb.yaml @@ -0,0 +1,26 @@ +{{- if .Values.podDisruptionBudget.enabled }} +{{- if .Capabilities.APIVersions.Has "policy/v1/PodDisruptionBudget" }} +apiVersion: policy/v1 +{{- else -}} +apiVersion: policy/v1beta1 +{{- end }} +kind: PodDisruptionBudget +metadata: + name: {{ template "victoria-metrics.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "victoria-metrics.common.metaLabels" . | nindent 4 }} + {{- if .Values.podDisruptionBudget.extraLabels }} +{{ toYaml .Values.podDisruptionBudget.extraLabels | indent 4}} + {{- end }} +spec: +{{- if .Values.podDisruptionBudget.minAvailable }} + minAvailable: {{ .Values.podDisruptionBudget.minAvailable }} +{{- end }} +{{- if .Values.podDisruptionBudget.maxUnavailable }} + maxUnavailable: {{ .Values.podDisruptionBudget.maxUnavailable }} +{{- end }} + selector: + matchLabels: + {{- include "victoria-metrics.server.matchLabels" . | nindent 6 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/podsecuritypolicy.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/podsecuritypolicy.yaml new file mode 100644 index 000000000..27affe23d --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/podsecuritypolicy.yaml @@ -0,0 +1,42 @@ +{{- if and .Values.rbac.pspEnabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} +apiVersion: policy/v1beta1 +kind: PodSecurityPolicy +metadata: + name: {{ template "victoria-metrics.fullname" . }} + labels: + {{- include "victoria-metrics.common.metaLabels" . | nindent 4 }} + {{- if .Values.rbac.extraLabels }} +{{ toYaml .Values.rbac.extraLabels | indent 4}} + {{- end }} + annotations: + seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default' + seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' + {{- if .Values.rbac.annotations }} + {{ toYaml .Values.rbac.annotations | indent 4}} + {{- end }} +spec: + privileged: false + allowPrivilegeEscalation: false + requiredDropCapabilities: + # Default set from Docker, with DAC_OVERRIDE and CHOWN + - ALL + volumes: + - 'configMap' + - 'emptyDir' + - 'projected' + - 'secret' + - 'downwardAPI' + - 'persistentVolumeClaim' + hostNetwork: false + hostIPC: false + hostPID: false + runAsUser: + rule: 'RunAsAny' + seLinux: + rule: 'RunAsAny' + supplementalGroups: + rule: 'RunAsAny' + fsGroup: + rule: 'RunAsAny' + readOnlyRootFilesystem: false +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/role.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/role.yaml new file mode 100644 index 000000000..27fd2b8e0 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/role.yaml @@ -0,0 +1,23 @@ +{{- if and .Values.rbac.pspEnabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} +{{- if .Values.rbac.create -}} +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: {{ template "victoria-metrics.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "victoria-metrics.common.metaLabels" . | nindent 4 }} + {{- if .Values.rbac.extraLabels }} +{{ toYaml .Values.rbac.extraLabels | indent 4}} + {{- end }} +{{- with .Values.rbac.annotations }} + annotations: +{{ toYaml . | indent 4 }} +{{- end }} +rules: +- apiGroups: ['extensions'] + resources: ['podsecuritypolicies'] + verbs: ['use'] + resourceNames: [{{ template "victoria-metrics.fullname" . }}] +{{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/rolebinding.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/rolebinding.yaml new file mode 100644 index 000000000..df9d185bb --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/rolebinding.yaml @@ -0,0 +1,26 @@ +{{- if and .Values.rbac.pspEnabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} +{{- if .Values.rbac.create -}} +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: {{ template "victoria-metrics.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "victoria-metrics.common.metaLabels" . | nindent 4 }} + {{- if .Values.rbac.extraLabels }} +{{ toYaml .Values.rbac.extraLabels | indent 4}} + {{- end }} +{{- with .Values.rbac.annotations }} + annotations: +{{ toYaml . | indent 4 }} +{{- end }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: {{ template "victoria-metrics.fullname" . }} +subjects: +- kind: ServiceAccount + name: {{ template "victoria-metrics.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} +{{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/scrape-configmap.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/scrape-configmap.yaml new file mode 100644 index 000000000..7d09eae64 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/scrape-configmap.yaml @@ -0,0 +1,17 @@ +{{- if and .Values.server.scrape.enabled (eq .Values.server.scrape.configMap "") }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ template "victoria-metrics.server.fullname" . }}-scrapeconfig + namespace: {{ .Release.Namespace }} + labels: {{- include "victoria-metrics.server.labels" . | nindent 4 }} +data: + scrape.yml: | + {{- range $k, $v := .Values.server.scrape.config }} + {{- if and (eq $k "scrape_configs") ($.Values.server.scrape.extraScrapeConfigs) }} + {{ dict $k (concat $v $.Values.server.scrape.extraScrapeConfigs) | toYaml | nindent 4 }} + {{- else }} + {{ dict $k $v | toYaml | nindent 4 }} + {{- end }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-deployment.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-deployment.yaml new file mode 100644 index 000000000..3524e2593 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-deployment.yaml @@ -0,0 +1,251 @@ +{{- if and .Values.server.enabled (not .Values.server.statefulSet.enabled) -}} +{{ include "victoria-metrics.vmbackupmanager.enforce_license" . }} +apiVersion: apps/v1 +kind: Deployment +metadata: +{{- if .Values.server.annotations }} + annotations: +{{ toYaml .Values.server.annotations | indent 4 }} +{{- end }} + labels: + {{- include "victoria-metrics.server.labels" . | nindent 4 }} + {{- with .Values.server.extraLabels }} + {{ toYaml .}} + {{- end }} + name: {{ template "victoria-metrics.server.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: + selector: + matchLabels: + {{- include "victoria-metrics.server.matchLabels" . | nindent 6 }} + replicas: 1 +{{- if .Values.server.persistentVolume.enabled }} + strategy: + # Must be "Recreate" when we have a persistent volume + type: Recreate +{{- end }} + template: + metadata: + {{- if .Values.server.podAnnotations }} + annotations: +{{ toYaml .Values.server.podAnnotations | indent 8 }} + {{- end }} + labels: + {{- include "victoria-metrics.server.labels" . | nindent 8 }} + {{- range $key, $value := .Values.server.podLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + spec: +{{- if .Values.server.priorityClassName }} + priorityClassName: "{{ .Values.server.priorityClassName }}" +{{- end }} +{{- if .Values.server.schedulerName }} + schedulerName: "{{ .Values.server.schedulerName }}" +{{- end }} + automountServiceAccountToken: {{ .Values.serviceAccount.automountToken }} + {{- if eq (include "victoria-metrics.hasInitContainer" . ) "true" -}} + initContainers: + {{- include "victoria-metrics.initContiners" . | nindent 8 }} + {{- end }} + containers: + - name: {{ template "victoria-metrics.name" . }}-{{ .Values.server.name }} + securityContext: + {{- toYaml .Values.server.securityContext | nindent 12 }} + image: "{{ .Values.server.image.repository }}:{{ .Values.server.image.tag }}" + imagePullPolicy: "{{ .Values.server.image.pullPolicy }}" + {{- if .Values.server.containerWorkingDir }} + workingDir: {{ .Values.server.containerWorkingDir }} + {{- end }} + args: + - {{ printf "%s=%s" "--retentionPeriod" (toString .Values.server.retentionPeriod) | quote}} + - {{ printf "%s=%s" "--storageDataPath" .Values.server.persistentVolume.mountPath | quote}} + {{- if .Values.server.scrape.enabled }} + - -promscrape.config=/scrapeconfig/scrape.yml + {{- end }} + {{- range $key, $value := .Values.server.extraArgs }} + - --{{ $key }}={{ $value }} + {{- end }} + {{- with (include "victoria-metrics.license.flag" .) }} + - {{ . }} + {{- end }} + {{- if .Values.server.envFrom }} + envFrom: + {{- with .Values.server.envFrom -}} + {{ toYaml . | nindent 12 }} + {{- end }} + {{- end }} + {{- with .Values.server.env }} + env: {{ toYaml . | nindent 10 }} + {{- end }} + ports: + - name: http + containerPort: 8428 + {{- if .Values.server.extraArgs.graphiteListenAddr }} + - name: graphite-tcp + protocol: TCP + containerPort: {{ include "split-host-port" .Values.server.extraArgs.graphiteListenAddr }} + {{- end }} + {{- if .Values.server.extraArgs.graphiteListenAddr }} + - name: graphite-udp + protocol: UDP + containerPort: {{ include "split-host-port" .Values.server.extraArgs.graphiteListenAddr }} + {{- end }} + {{- if .Values.server.extraArgs.influxListenAddr }} + - name: influx-tcp + protocol: TCP + containerPort: {{ include "split-host-port" .Values.server.extraArgs.influxListenAddr }} + {{- end }} + {{- if .Values.server.extraArgs.influxListenAddr }} + - name: influx-udp + protocol: UDP + containerPort: {{ include "split-host-port" .Values.server.extraArgs.influxListenAddr }} + {{- end }} + {{- if .Values.server.extraArgs.opentsdbHTTPListenAddr }} + - name: opentsdbhttp + protocol: TCP + containerPort: {{ include "split-host-port" .Values.server.extraArgs.opentsdbHTTPListenAddr }} + {{- end }} + {{- if .Values.server.extraArgs.opentsdbListenAddr }} + - name: opentsdb-tcp + protocol: TCP + containerPort: {{ include "split-host-port" .Values.server.extraArgs.opentsdbListenAddr }} + {{- end }} + {{- if .Values.server.extraArgs.opentsdbListenAddr }} + - name: opentsdb-udp + protocol: UDP + containerPort: {{ include "split-host-port" .Values.server.extraArgs.opentsdbListenAddr }} + {{- end }} + {{- with $.Values.server.livenessProbe }} + livenessProbe: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with $.Values.server.readinessProbe }} + readinessProbe: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with $.Values.server.startupProbe }} + startupProbe: + {{- toYaml . | nindent 12 }} + {{- end }} + resources: +{{ toYaml .Values.server.resources | indent 12 }} + volumeMounts: + - name: server-volume + mountPath: {{ .Values.server.persistentVolume.mountPath }} + subPath: {{ .Values.server.persistentVolume.subPath }} + {{- if .Values.server.scrape.enabled }} + - name: scrapeconfig + mountPath: /scrapeconfig + {{- end }} + {{- range .Values.server.extraHostPathMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- range .Values.server.extraConfigmapMounts }} + - name: {{ $.Values.server.name }}-{{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- range .Values.server.extraSecretMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- include "victoria-metrics.license.mount" . | nindent 12 }} + {{- with .Values.server.extraVolumeMounts }} + {{- toYaml . | nindent 12 }} + {{- end }} + {{- if .Values.server.vmbackupmanager.enable }} + - name: {{ template "victoria-metrics.name" . }}-vmbackupmanager + image: "{{ .Values.server.vmbackupmanager.image.repository }}:{{ .Values.server.vmbackupmanager.image.tag }}" + imagePullPolicy: "{{ .Values.server.image.pullPolicy }}" + args: + - {{ printf "%s=%t" "--eula" .Values.server.vmbackupmanager.eula | quote}} + - {{ printf "%s=%t" "--disableHourly" .Values.server.vmbackupmanager.disableHourly | quote}} + - {{ printf "%s=%t" "--disableDaily" .Values.server.vmbackupmanager.disableDaily | quote}} + - {{ printf "%s=%t" "--disableWeekly" .Values.server.vmbackupmanager.disableWeekly | quote}} + - {{ printf "%s=%t" "--disableMonthly" .Values.server.vmbackupmanager.disableMonthly | quote}} + - {{ printf "%s=%d" "--keepLastHourly" (int .Values.server.vmbackupmanager.retention.keepLastHourly) | quote}} + - {{ printf "%s=%d" "--keepLastDaily" (int .Values.server.vmbackupmanager.retention.keepLastDaily) | quote}} + - {{ printf "%s=%d" "--keepLastWeekly" (int .Values.server.vmbackupmanager.retention.keepLastWeekly) | quote}} + - {{ printf "%s=%d" "--keepLastMonthly" (int .Values.server.vmbackupmanager.retention.keepLastMonthly) | quote}} + - {{ printf "%s=%s" "--dst" (printf "%s/%s" .Values.server.vmbackupmanager.destination (include "victoria-metrics.name" .) ) | quote}} + - {{ printf "%s=%s" "--storageDataPath" .Values.server.persistentVolume.mountPath | quote}} + - "--snapshot.createURL=http://localhost:8428/snapshot/create" + - "--snapshot.deleteURL=http://localhost:8428/snapshot/delete" + {{- range $key, $value := .Values.server.vmbackupmanager.extraArgs }} + - --{{ $key }}={{ $value }} + {{- end }} + {{- with (include "victoria-metrics.license.flag" .) }} + - {{ . }} + {{- end }} + {{- with .Values.server.vmbackupmanager.resources }} + resources: {{ toYaml . | nindent 12 }} + {{- end }} + {{- with $.Values.server.vmbackupmanager.livenessProbe }} + livenessProbe: {{- toYaml . | nindent 12 }} + {{- end }} + {{- with $.Values.server.vmbackupmanager.readinessProbe }} + readinessProbe: {{- toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.server.vmbackupmanager.env }} + env: {{ toYaml . | nindent 12 }} + {{- end }} + ports: + - name: manager-http + containerPort: 8300 + volumeMounts: + - name: server-volume + mountPath: {{ .Values.server.persistentVolume.mountPath }} + subPath: {{ .Values.server.persistentVolume.subPath }} + {{- with .Values.server.vmbackupmanager.extraVolumeMounts }} + {{- toYaml . | nindent 12 }} + {{- end }} + {{- include "victoria-metrics.license.mount" . | nindent 12 }} + {{- end }} + {{- with .Values.server.extraContainers }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.imagePullSecrets }} + imagePullSecrets: + {{ toYaml .Values.imagePullSecrets | indent 2 }} + {{- end }} + {{- if .Values.server.nodeSelector }} + nodeSelector: +{{ toYaml .Values.server.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.server.podSecurityContext }} + securityContext: +{{ toYaml .Values.server.podSecurityContext | indent 8 }} + {{- end }} + serviceAccountName: {{ template "victoria-metrics.serviceAccountName" . }} + {{- if .Values.server.tolerations }} + tolerations: +{{ toYaml .Values.server.tolerations | indent 8 }} + {{- end }} + {{- with .Values.server.affinity }} + affinity: {{ toYaml . | nindent 8 }} + {{- end }} + terminationGracePeriodSeconds: {{ .Values.server.terminationGracePeriodSeconds }} + volumes: + {{- if .Values.server.scrape.enabled }} + - name: scrapeconfig + configMap: + name: {{ include "victoria-metrics.server.scrape.configname" . }} + {{- end }} + {{- with .Values.server.extraVolumes }} + {{- toYaml . | nindent 6 }} + {{- end }} + - name: server-volume +{{- if .Values.server.persistentVolume.enabled }} + persistentVolumeClaim: + claimName: {{ if .Values.server.persistentVolume.existingClaim }}{{ .Values.server.persistentVolume.existingClaim }}{{- else }}{{ template "victoria-metrics.server.fullname" . }}{{- end }} +{{- else }} + emptyDir: {} +{{- end }} + {{- include "victoria-metrics.license.volume" . | nindent 8 }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-ingress.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-ingress.yaml new file mode 100644 index 000000000..e353b9e53 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-ingress.yaml @@ -0,0 +1,50 @@ +{{- if and .Values.server.enabled .Values.server.ingress.enabled }} +{{- $ingressApiIsStable := eq (include "victoria-metrics.ingress.isStable" .) "true" -}} +{{- $ingressSupportsIngressClassName := eq (include "victoria-metrics.ingress.supportsIngressClassName" .) "true" -}} +{{- $ingressSupportsPathType := eq (include "victoria-metrics.ingress.supportsPathType" .) "true" -}} +{{- $servicePort := .Values.server.service.servicePort -}} +{{- $ingressPathType := .Values.server.ingress.pathType -}} +apiVersion: {{ include "victoria-metrics.ingress.apiVersion" . }} +kind: Ingress +metadata: +{{- if .Values.server.ingress.annotations }} + annotations: +{{ toYaml .Values.server.ingress.annotations | indent 4 }} +{{- end }} + labels: + {{- include "victoria-metrics.server.labels" . | nindent 4 }} + {{ if .Values.server.ingress.extraLabels }} +{{ toYaml .Values.server.ingress.extraLabels | indent 4 }} + {{ end }} + name: {{ template "victoria-metrics.server.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: + {{- if and $ingressSupportsIngressClassName .Values.server.ingress.ingressClassName }} + ingressClassName: {{ .Values.server.ingress.ingressClassName }} + {{- end }} + rules: + {{- $serviceName := include "victoria-metrics.server.fullname" . }} + {{- range .Values.server.ingress.hosts }} + - host: {{ .name }} + http: + paths: + - path: {{ .path }} + {{- if $ingressSupportsPathType }} + pathType: {{ $ingressPathType }} + {{- end }} + backend: + {{- if $ingressApiIsStable }} + service: + name: {{ $serviceName }} + port: + number: {{ $servicePort }} + {{- else }} + serviceName: {{ $serviceName }} + servicePort: {{ .port | default "http"}} + {{- end }} + {{- end -}} +{{- if .Values.server.ingress.tls }} + tls: +{{ toYaml .Values.server.ingress.tls | indent 4 }} +{{- end -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-pvc.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-pvc.yaml new file mode 100644 index 000000000..35b3204b3 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-pvc.yaml @@ -0,0 +1,33 @@ +{{- if .Values.server.persistentVolume.enabled -}} +{{- if not .Values.server.statefulSet.enabled -}} +{{- if not .Values.server.persistentVolume.existingClaim -}} +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: {{ template "victoria-metrics.server.fullname" . }} + namespace: {{ .Release.Namespace }} +{{- with .Values.server.persistentVolume.annotations }} + annotations: +{{ toYaml . | indent 4 }} +{{- end }} + labels: +{{- include "victoria-metrics.server.labels" . | nindent 4 }} +spec: +{{- with .Values.server.persistentVolume.accessModes }} + accessModes: +{{ toYaml . | indent 4 }} +{{- end }} + resources: + requests: + storage: {{ .Values.server.persistentVolume.size | quote }} +{{- if .Values.server.persistentVolume.storageClass }} + storageClassName: {{ .Values.server.persistentVolume.storageClass | quote }} +{{- end }} +{{- with .Values.server.persistentVolume.matchLabels }} + selector: + matchLabels: + {{- toYaml . | nindent 6 }} +{{- end }} +{{- end }} +{{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service-headless.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service-headless.yaml new file mode 100644 index 000000000..9d6f22221 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service-headless.yaml @@ -0,0 +1,72 @@ +{{- if and .Values.server.enabled .Values.server.statefulSet.enabled -}} +apiVersion: v1 +kind: Service +metadata: + namespace: {{ .Release.Namespace }} +{{- if .Values.server.statefulSet.service.annotations }} + annotations: +{{ toYaml .Values.server.statefulSet.service.annotations | indent 4}} +{{- end }} + labels: + {{- include "victoria-metrics.server.labels" . | nindent 4 }} +{{- if .Values.server.statefulSet.service.labels }} +{{ toYaml .Values.server.statefulSet.service.labels | indent 4}} +{{- end }} + name: {{ template "victoria-metrics.server.fullname" . }} +spec: + clusterIP: None + {{- with .Values.server.statefulSet.service.healthCheckNodePort }} + healthCheckNodePort: {{ . }} + {{- end }} + {{- with .Values.server.statefulSet.service.externalTrafficPolicy }} + externalTrafficPolicy: {{ . }} + {{- end }} + ports: + - name: http + port: {{ .Values.server.statefulSet.service.servicePort }} + protocol: TCP + targetPort: http +{{- if .Values.server.extraArgs.graphiteListenAddr }} + - name: graphite-tcp + protocol: TCP + port: {{ include "split-host-port" .Values.server.extraArgs.graphiteListenAddr }} + targetPort: graphite-tcp +{{- end }} +{{- if .Values.server.extraArgs.graphiteListenAddr }} + - name: graphite-udp + protocol: UDP + port: {{ include "split-host-port" .Values.server.extraArgs.graphiteListenAddr }} + targetPort: graphite-udp +{{- end }} +{{- if .Values.server.extraArgs.influxListenAddr }} + - name: influx-tcp + protocol: TCP + port: {{ include "split-host-port" .Values.server.extraArgs.influxListenAddr }} + targetPort: influx-tcp +{{- end }} +{{- if .Values.server.extraArgs.influxListenAddr }} + - name: influx-udp + protocol: UDP + port: {{ include "split-host-port" .Values.server.extraArgs.influxListenAddr }} + targetPort: influx-udp +{{- end }} +{{- if .Values.server.extraArgs.opentsdbHTTPListenAddr }} + - name: opentsdbhttp + port: {{ include "split-host-port" .Values.server.extraArgs.opentsdbHTTPListenAddr }} + targetPort: opentsdbhttp +{{- end }} +{{- if .Values.server.extraArgs.opentsdbListenAddr }} + - name: opentsdb-udp + protocol: UDP + port: {{ include "split-host-port" .Values.server.extraArgs.opentsdbListenAddr }} + targetPort: opentsdb-udp +{{- end }} +{{- if .Values.server.extraArgs.opentsdbListenAddr }} + - name: opentsdb-tcp + protocol: TCP + port: {{ include "split-host-port" .Values.server.extraArgs.opentsdbListenAddr }} + targetPort: opentsdb-tcp +{{- end }} + selector: + {{- include "victoria-metrics.server.matchLabels" . | nindent 4 }} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service-monitor.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service-monitor.yaml new file mode 100644 index 000000000..8adfd9be5 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service-monitor.yaml @@ -0,0 +1,44 @@ +{{- if and .Values.server.enabled .Values.server.serviceMonitor.enabled -}} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + {{- if .Values.server.serviceMonitor.annotations }} + annotations: +{{ toYaml .Values.server.serviceMonitor.annotations | indent 4 }} + {{- end }} + labels: + {{- include "victoria-metrics.server.labels" . | nindent 4 }} + {{- if .Values.server.serviceMonitor.extraLabels }} +{{ toYaml .Values.server.serviceMonitor.extraLabels | indent 4 }} + {{- end }} + name: {{ template "victoria-metrics.server.fullname" . }} + {{- if .Values.server.serviceMonitor.namespace }} + namespace: {{ .Values.server.serviceMonitor.namespace }} + {{- end }} +spec: + namespaceSelector: + matchNames: + - {{ .Release.Namespace }} + selector: + matchLabels: + {{- include "victoria-metrics.server.matchLabels" . | nindent 6 }} + endpoints: + - port: http + {{- if .Values.server.serviceMonitor.scheme }} + scheme: {{ .Values.server.serviceMonitor.scheme }} + {{- end }} + {{- if .Values.server.serviceMonitor.interval }} + interval: {{ .Values.server.serviceMonitor.interval }} + {{- end }} + {{- if .Values.server.serviceMonitor.scrapeTimeout }} + scrapeTimeout: {{ .Values.server.serviceMonitor.scrapeTimeout }} + {{- end }} + {{- with .Values.server.serviceMonitor.tlsConfig }} + tlsConfig: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.server.serviceMonitor.relabelings }} + relabelings: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service.yaml new file mode 100644 index 000000000..b58e7dfc2 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service.yaml @@ -0,0 +1,91 @@ +{{- if and .Values.server.enabled (not .Values.server.statefulSet.enabled) -}} +apiVersion: v1 +kind: Service +metadata: + namespace: {{ .Release.Namespace }} +{{- if .Values.server.service.annotations }} + annotations: +{{ toYaml .Values.server.service.annotations | indent 4}} +{{- end }} + labels: + {{- include "victoria-metrics.server.labels" . | nindent 4 }} +{{- if .Values.server.service.labels }} +{{ toYaml .Values.server.service.labels | indent 4}} +{{- end }} + name: {{ template "victoria-metrics.server.fullname" . }} +spec: +{{- if .Values.server.service.clusterIP }} + clusterIP: {{ .Values.server.service.clusterIP }} +{{- end }} +{{- if .Values.server.service.externalIPs }} + externalIPs: +{{ toYaml .Values.server.service.externalIPs | indent 4 }} +{{- end }} +{{- if .Values.server.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.server.service.loadBalancerIP }} +{{- end }} +{{- if .Values.server.service.loadBalancerSourceRanges }} + loadBalancerSourceRanges: + {{- range $cidr := .Values.server.service.loadBalancerSourceRanges }} + - {{ $cidr }} + {{- end }} +{{- end }} + ports: + - name: http + port: {{ .Values.server.service.servicePort }} + protocol: TCP + targetPort: http + {{- with .Values.server.service.nodePort }} + nodePort: {{ . }} + {{- end }} +{{- if .Values.server.extraArgs.graphiteListenAddr }} + - name: graphite-tcp + protocol: TCP + port: {{ include "split-host-port" .Values.server.extraArgs.graphiteListenAddr }} + targetPort: graphite-tcp +{{- end }} +{{- if .Values.server.extraArgs.graphiteListenAddr }} + - name: graphite-udp + protocol: UDP + port: {{ include "split-host-port" .Values.server.extraArgs.graphiteListenAddr }} + targetPort: graphite-udp +{{- end }} +{{- if .Values.server.extraArgs.influxListenAddr }} + - name: influx-tcp + protocol: TCP + port: {{ include "split-host-port" .Values.server.extraArgs.influxListenAddr }} + targetPort: influx-tcp +{{- end }} +{{- if .Values.server.extraArgs.influxListenAddr }} + - name: influx-udp + protocol: UDP + port: {{ include "split-host-port" .Values.server.extraArgs.influxListenAddr }} + targetPort: influx-udp +{{- end }} +{{- if .Values.server.extraArgs.opentsdbHTTPListenAddr }} + - name: opentsdbhttp + port: {{ include "split-host-port" .Values.server.extraArgs.opentsdbHTTPListenAddr }} + targetPort: opentsdbhttp +{{- end }} +{{- if .Values.server.extraArgs.opentsdbListenAddr }} + - name: opentsdb-udp + protocol: UDP + port: {{ include "split-host-port" .Values.server.extraArgs.opentsdbListenAddr }} + targetPort: opentsdb-udp +{{- end }} +{{- if .Values.server.extraArgs.opentsdbListenAddr }} + - name: opentsdb-tcp + protocol: TCP + port: {{ include "split-host-port" .Values.server.extraArgs.opentsdbListenAddr }} + targetPort: opentsdb-tcp +{{- end }} + selector: + {{- include "victoria-metrics.server.matchLabels" . | nindent 4 }} + type: "{{ .Values.server.service.type }}" + {{- with .Values.server.service.healthCheckNodePort }} + healthCheckNodePort: {{ . }} + {{- end }} + {{- with .Values.server.service.externalTrafficPolicy }} + externalTrafficPolicy: {{ . }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-statefulset.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-statefulset.yaml new file mode 100644 index 000000000..534ee47cf --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-statefulset.yaml @@ -0,0 +1,282 @@ +{{- if and .Values.server.enabled .Values.server.statefulSet.enabled -}} +{{ include "victoria-metrics.vmbackupmanager.enforce_license" . }} +apiVersion: apps/v1 +kind: StatefulSet +metadata: + namespace: {{ .Release.Namespace }} +{{- if .Values.server.annotations }} + annotations: +{{ toYaml .Values.server.annotations | indent 4 }} +{{- end }} + labels: + {{- include "victoria-metrics.server.labels" . | nindent 4 }} + {{- with .Values.server.extraLabels }} + {{ toYaml .}} + {{- end}} + name: {{ template "victoria-metrics.server.fullname" . }} +spec: + serviceName: {{ template "victoria-metrics.server.fullname" . }} + selector: + matchLabels: + {{- include "victoria-metrics.server.matchLabels" . | nindent 6 }} + replicas: 1 + podManagementPolicy: {{ .Values.server.podManagementPolicy }} + template: + metadata: + {{- if .Values.server.podAnnotations }} + annotations: +{{ toYaml .Values.server.podAnnotations | indent 8 }} + {{- end }} + labels: + {{- include "victoria-metrics.server.labels" . | nindent 8 }} + {{- range $key, $value := .Values.server.podLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + spec: +{{- if .Values.server.priorityClassName }} + priorityClassName: "{{ .Values.server.priorityClassName }}" +{{- end }} +{{- if .Values.server.schedulerName }} + schedulerName: "{{ .Values.server.schedulerName }}" +{{- end }} + automountServiceAccountToken: {{ .Values.serviceAccount.automountToken }} + {{- if eq (include "victoria-metrics.hasInitContainer" . ) "true" }} + initContainers: + {{- include "victoria-metrics.initContiners" . | nindent 8 }} + {{- end }} + containers: + - name: {{ template "victoria-metrics.name" . }}-{{ .Values.server.name }} + {{- with .Values.server.securityContext }} + securityContext: {{- toYaml . | nindent 12 }} + {{- end }} + image: "{{ .Values.server.image.repository }}:{{ .Values.server.image.tag }}" + imagePullPolicy: "{{ .Values.server.image.pullPolicy }}" + {{- if .Values.server.containerWorkingDir }} + workingDir: {{ .Values.server.containerWorkingDir }} + {{- end }} + args: + - {{ printf "%s=%s" "--retentionPeriod" (toString .Values.server.retentionPeriod) | quote}} + - {{ printf "%s=%s" "--storageDataPath" .Values.server.persistentVolume.mountPath | quote}} + {{- if .Values.server.scrape.enabled }} + - -promscrape.config=/scrapeconfig/scrape.yml + {{- end }} + {{- range $key, $value := .Values.server.extraArgs }} + - --{{ $key }}={{ $value }} + {{- end }} + {{- with (include "victoria-metrics.license.flag" .) }} + - {{ . }} + {{- end }} + {{- if .Values.server.envFrom }} + envFrom: + {{- with .Values.server.envFrom -}} + {{ toYaml . | nindent 12 }} + {{- end }} + {{- end }} + {{- with .Values.server.env }} + env: {{ toYaml . | nindent 10 }} + {{- end }} + ports: + - name: http + containerPort: 8428 + {{- if .Values.server.extraArgs.graphiteListenAddr }} + - name: graphite-tcp + protocol: TCP + containerPort: {{ include "split-host-port" .Values.server.extraArgs.graphiteListenAddr }} + {{- end }} + {{- if .Values.server.extraArgs.graphiteListenAddr }} + - name: graphite-udp + protocol: UDP + containerPort: {{ include "split-host-port" .Values.server.extraArgs.graphiteListenAddr }} + {{- end }} + {{- if .Values.server.extraArgs.influxListenAddr }} + - name: influx-tcp + protocol: TCP + containerPort: {{ include "split-host-port" .Values.server.extraArgs.influxListenAddr }} + {{- end }} + {{- if .Values.server.extraArgs.influxListenAddr }} + - name: influx-udp + protocol: UDP + containerPort: {{ include "split-host-port" .Values.server.extraArgs.influxListenAddr }} + {{- end }} + {{- if .Values.server.extraArgs.opentsdbHTTPListenAddr }} + - name: opentsdbhttp + protocol: TCP + containerPort: {{ include "split-host-port" .Values.server.extraArgs.opentsdbHTTPListenAddr }} + {{- end }} + {{- if .Values.server.extraArgs.opentsdbListenAddr }} + - name: opentsdb-tcp + protocol: TCP + containerPort: {{ include "split-host-port" .Values.server.extraArgs.opentsdbListenAddr }} + {{- end }} + {{- if .Values.server.extraArgs.opentsdbListenAddr }} + - name: opentsdb-udp + protocol: UDP + containerPort: {{ include "split-host-port" .Values.server.extraArgs.opentsdbListenAddr }} + {{- end }} + {{- with $.Values.server.livenessProbe }} + livenessProbe: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with $.Values.server.readinessProbe }} + readinessProbe: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with $.Values.server.startupProbe }} + startupProbe: + {{- toYaml . | nindent 12 }} + {{- end }} + resources: + {{- toYaml .Values.server.resources | nindent 12 }} + volumeMounts: + - name: server-volume + mountPath: {{ .Values.server.persistentVolume.mountPath }} + subPath: {{ .Values.server.persistentVolume.subPath }} + {{- if .Values.server.scrape.enabled }} + - name: scrapeconfig + mountPath: /scrapeconfig + {{- end }} + {{- range .Values.server.extraHostPathMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- range .Values.server.extraConfigmapMounts }} + - name: {{ $.Values.server.name }}-{{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- range .Values.server.extraSecretMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- include "victoria-metrics.license.mount" . | nindent 12 }} + {{- with .Values.server.extraVolumeMounts }} + {{- toYaml . | nindent 12 }} + {{- end }} + {{- if .Values.server.vmbackupmanager.enable }} + - name: {{ template "victoria-metrics.name" . }}-vmbackupmanager + image: "{{ .Values.server.vmbackupmanager.image.repository }}:{{ .Values.server.vmbackupmanager.image.tag }}" + imagePullPolicy: "{{ .Values.server.image.pullPolicy }}" + args: + - {{ printf "%s=%t" "--eula" .Values.server.vmbackupmanager.eula | quote}} + - {{ printf "%s=%t" "--disableHourly" .Values.server.vmbackupmanager.disableHourly | quote}} + - {{ printf "%s=%t" "--disableDaily" .Values.server.vmbackupmanager.disableDaily | quote}} + - {{ printf "%s=%t" "--disableWeekly" .Values.server.vmbackupmanager.disableWeekly | quote}} + - {{ printf "%s=%t" "--disableMonthly" .Values.server.vmbackupmanager.disableMonthly | quote}} + - {{ printf "%s=%d" "--keepLastHourly" (int .Values.server.vmbackupmanager.retention.keepLastHourly) | quote}} + - {{ printf "%s=%d" "--keepLastDaily" (int .Values.server.vmbackupmanager.retention.keepLastDaily) | quote}} + - {{ printf "%s=%d" "--keepLastWeekly" (int .Values.server.vmbackupmanager.retention.keepLastWeekly) | quote}} + - {{ printf "%s=%d" "--keepLastMonthly" (int .Values.server.vmbackupmanager.retention.keepLastMonthly) | quote}} + - {{ printf "%s=%s" "--dst" (printf "%s/%s" .Values.server.vmbackupmanager.destination (include "victoria-metrics.name" .) ) | quote}} + - {{ printf "%s=%s" "--storageDataPath" .Values.server.persistentVolume.mountPath | quote}} + - "--snapshot.createURL=http://localhost:8428/snapshot/create" + - "--snapshot.deleteURL=http://localhost:8428/snapshot/delete" + {{- range $key, $value := .Values.server.vmbackupmanager.extraArgs }} + - --{{ $key }}={{ $value }} + {{- end }} + {{- with (include "victoria-metrics.license.flag" .) }} + - {{ . }} + {{- end }} + {{- with .Values.server.vmbackupmanager.resources }} + resources: {{ toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.server.securityContext }} + securityContext: {{- toYaml . | nindent 12 }} + {{- end }} + {{- with $.Values.server.vmbackupmanager.livenessProbe }} + livenessProbe: {{- toYaml . | nindent 12 }} + {{- end }} + {{- with $.Values.server.vmbackupmanager.readinessProbe }} + readinessProbe: {{- toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.server.vmbackupmanager.env }} + env: {{ toYaml . | nindent 12 }} + {{- end }} + ports: + - name: manager-http + containerPort: 8300 + volumeMounts: + - name: server-volume + mountPath: {{ .Values.server.persistentVolume.mountPath }} + subPath: {{ .Values.server.persistentVolume.subPath }} + {{- with .Values.server.vmbackupmanager.extraVolumeMounts }} + {{- toYaml . | nindent 12 }} + {{- end }} + {{- include "victoria-metrics.license.mount" . | nindent 12 }} + {{- end }} + {{- with .Values.server.extraContainers }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.imagePullSecrets }} + imagePullSecrets: + {{ toYaml .Values.imagePullSecrets | indent 2 }} + {{- end }} + {{- if .Values.server.nodeSelector }} + nodeSelector: +{{ toYaml .Values.server.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.server.podSecurityContext }} + securityContext: +{{ toYaml .Values.server.podSecurityContext | indent 8 }} + {{- end }} + serviceAccountName: {{ template "victoria-metrics.serviceAccountName" . }} + {{- if .Values.server.tolerations }} + tolerations: +{{ toYaml .Values.server.tolerations | indent 8 }} + {{- end }} + {{- with .Values.server.affinity }} + affinity: {{ toYaml . | nindent 8 }} + {{- end }} + terminationGracePeriodSeconds: {{ .Values.server.terminationGracePeriodSeconds }} + volumes: + {{- if .Values.server.scrape.enabled }} + - name: scrapeconfig + configMap: + name: {{ include "victoria-metrics.server.scrape.configname" . }} + {{- end }} + {{- if not .Values.server.persistentVolume.enabled }} + - name: server-volume + emptyDir: {} + {{- else }} + {{- if .Values.server.persistentVolume.existingClaim }} + - name: server-volume + persistentVolumeClaim: + claimName: {{ .Values.server.persistentVolume.existingClaim }} + {{- end }} + {{- end }} + {{- with .Values.server.extraVolumes }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- include "victoria-metrics.license.volume" . | nindent 8 }} + {{- if and .Values.server.persistentVolume.enabled (not .Values.server.persistentVolume.existingClaim) }} + volumeClaimTemplates: + - metadata: + name: server-volume + {{- if .Values.server.persistentVolume.annotations }} + annotations: +{{ toYaml .Values.server.persistentVolume.annotations | indent 10 }} + {{- end }} + spec: + accessModes: +{{ toYaml .Values.server.persistentVolume.accessModes | indent 10 }} + resources: + requests: + storage: "{{ .Values.server.persistentVolume.size }}" + {{- if .Values.server.persistentVolume.storageClass }} + {{- if (eq "-" .Values.server.persistentVolume.storageClass) }} + storageClassName: "" + {{- else }} + storageClassName: "{{ .Values.server.persistentVolume.storageClass }}" + {{- end }} + {{- end }} + {{- with .Values.server.persistentVolume.matchLabels }} + selector: + matchLabels: + {{- toYaml . | nindent 12 }} + {{- end }} +{{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/serviceaccount.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/serviceaccount.yaml new file mode 100644 index 000000000..ebb616800 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/serviceaccount.yaml @@ -0,0 +1,16 @@ +{{- if .Values.serviceAccount.create }} +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + {{- include "victoria-metrics.common.metaLabels" . | nindent 4 }} + {{- if .Values.serviceAccount.extraLabels }} +{{ toYaml .Values.serviceAccount.extraLabels | indent 4}} + {{- end }} +{{- with .Values.serviceAccount.annotations }} + annotations: +{{ toYaml . | indent 4 }} +{{- end }} + name: {{ template "victoria-metrics.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} +{{- end }} \ No newline at end of file diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/values.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/values.yaml new file mode 100644 index 000000000..15dbe7810 --- /dev/null +++ b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/values.yaml @@ -0,0 +1,696 @@ +# Default values for victoria-metrics. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +rbac: + create: true + # Note: The PSP will only be deployed, if Kubernetes (<1.25) supports the resource. + pspEnabled: true + namespaced: false + extraLabels: {} + # annotations: {} + +# -- Print chart notes +printNotes: true + +serviceAccount: + # -- Create service account. + create: true + # name: + extraLabels: {} + # annotations: {} + # -- Mount API token to pod directly + automountToken: true + +automountServiceAccountToken: true + +podDisruptionBudget: + # -- See `kubectl explain poddisruptionbudget.spec` for more. Ref: [https://kubernetes.io/docs/tasks/run-application/configure-pdb/](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) + enabled: false + # minAvailable: 1 + # maxUnavailable: 1 + extraLabels: {} + +server: + # -- Enable deployment of server component. Deployed as StatefulSet + enabled: true + # -- Server container name + name: server + image: + # -- Image repository + repository: victoriametrics/victoria-metrics + # -- Image tag + tag: v1.97.1 + # -- Image pull policy + pullPolicy: IfNotPresent + # -- Name of Priority Class + priorityClassName: "" + # -- Overrides the full name of server component + fullnameOverride: + # -- Data retention period in month + retentionPeriod: 1 + # Extra command line arguments for container of component + extraArgs: + envflag.enable: "true" + envflag.prefix: VM_ + loggerFormat: json + + # Additional hostPath mounts + extraHostPathMounts: + [] + #- name: certs-dir + # mountPath: /etc/kubernetes/certs + # subPath: "" + # hostPath: /etc/kubernetes/certs + # readOnly: true + + # Extra Volumes for the pod + extraVolumes: + [] + #- name: example + # configMap: + # name: example + + # Extra Volume Mounts for the container + extraVolumeMounts: + [] + # - name: example + # mountPath: /example + + extraContainers: + [] + #- name: config-reloader + # image: reloader-image + + initContainers: + [] + # - name: vmrestore + # image: victoriametrics/vmrestore:latest + # volumeMounts: + # - mountPath: /storage + # name: vmstorage-volume + # - mountPath: /etc/vm/creds + # name: secret-remote-storage-keys + # readOnly: true + # args: + # - -storageDataPath=/storage + # - -src=s3://your_bucket/folder/latest + # - -credsFilePath=/etc/vm/creds/credentials + + # -- Node tolerations for server scheduling to nodes with taints. Ref: [https://kubernetes.io/docs/concepts/configuration/assign-pod-node/](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/) + tolerations: + [] + # - key: "key" + # operator: "Equal|Exists" + # value: "value" + # effect: "NoSchedule|PreferNoSchedule" + + # -- Pod's node selector. Ref: [https://kubernetes.io/docs/user-guide/node-selection/](https://kubernetes.io/docs/user-guide/node-selection/) + nodeSelector: {} + + # -- Pod affinity + affinity: {} + + # -- Env variables + # -- Additional environment variables (ex.: secret tokens, flags) https://github.com/VictoriaMetrics/VictoriaMetrics#environment-variables + env: [] + + envFrom: [] + #- configMapRef: + # name: special-config + + # -- Container workdir + containerWorkingDir: "" + + ## Use an alternate scheduler, e.g. "stork". + ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ + ## + # schedulerName: + + persistentVolume: + # -- Create/use Persistent Volume Claim for server component. Empty dir if false + enabled: true + + # -- Array of access modes. Must match those of existing PV or dynamic provisioner. Ref: [http://kubernetes.io/docs/user-guide/persistent-volumes/](http://kubernetes.io/docs/user-guide/persistent-volumes/) + accessModes: + - ReadWriteOnce + # -- Persistant volume annotations + annotations: {} + + # -- StorageClass to use for persistent volume. Requires server.persistentVolume.enabled: true. If defined, PVC created automatically + storageClass: "" + + # -- Existing Claim name. If defined, PVC must be created manually before volume will be bound + existingClaim: "" + + # -- Bind Persistent Volume by labels. Must match all labels of targeted PV. + matchLabels: {} + + # -- Mount path. Server data Persistent Volume mount root path. + mountPath: /storage + # -- Mount subpath + subPath: "" + # -- Size of the volume. Should be calculated based on the metrics you send and retention policy you set. + size: 16Gi + + # -- Sts/Deploy additional labels + extraLabels: {} + # -- Pod's additional labels + podLabels: {} + # -- Pod's annotations + podAnnotations: {} + # -- Pod's management policy + podManagementPolicy: OrderedReady + + # -- Resource object. Ref: [http://kubernetes.io/docs/user-guide/compute-resources/](http://kubernetes.io/docs/user-guide/compute-resources/ + resources: + {} + # limits: + # cpu: 500m + # memory: 512Mi + # requests: + # cpu: 500m + # memory: 512Mi + + # Indicates whether the Container is ready to service requests. If the readiness probe fails, the endpoints controller removes the Pod's IP address from the endpoints of all Services that match the Pod. The default state of readiness before the initial delay is Failure. If a Container does not provide a readiness probe, the default state is Success. + readinessProbe: + httpGet: + path: /health + port: http + initialDelaySeconds: 5 + periodSeconds: 15 + timeoutSeconds: 5 + failureThreshold: 3 + + # Indicates whether the Container is running. If the liveness probe fails, the kubelet kills the Container, and the Container is subjected to its restart policy. If a Container does not provide a liveness probe, the default state is Success. + livenessProbe: + httpGet: + scheme: HTTP + path: /health + port: 8428 + initialDelaySeconds: 30 + periodSeconds: 30 + timeoutSeconds: 5 + failureThreshold: 10 + + # Indicates whether the Container is done with potentially costly initialization. If set it is executed first. If it fails Container is restarted. If it succeeds liveness and readiness probes takes over. + startupProbe: {} + #tcpSocket: + # port: http + #failureThreshold: 30 + #periodSeconds: 15 + #successThreshold: 1 + #timeoutSeconds: 5 + + # -- Security context to be added to server pods + securityContext: {} + # -- Pod's security context. Ref: [https://kubernetes.io/docs/tasks/configure-pod-container/security-context/](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) + podSecurityContext: {} + ingress: + # -- Enable deployment of ingress for server component + enabled: false + # -- Ingress annotations + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: 'true' + + # -- Ingress extra labels + extraLabels: {} + # -- Array of host objects + hosts: [] + # - name: vmselect.local + # path: /select + # port: http + + # -- Array of TLS objects + tls: [] + # - secretName: vmselect-ingress-tls + # hosts: + # - vmselect.local + # For Kubernetes >= 1.18 you should specify the ingress-controller via the field ingressClassName + # See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#specifying-the-class-of-an-ingress + # ingressClassName: nginx + # -- pathType is only for k8s >= 1.1= + pathType: Prefix + + vmbackupmanager: + # -- enable automatic creation of backup via vmbackupmanager. vmbackupmanager is part of Enterprise packages + enable: false + # -- should be true and means that you have the legal right to run a backup manager + # that can either be a signed contract or an email with confirmation to run the service in a trial period + # # https://victoriametrics.com/legal/esa/ + eula: false + image: + # -- vmbackupmanager image repository + repository: victoriametrics/vmbackupmanager + # -- vmbackupmanager image tag + tag: v1.97.1-enterprise + # -- disable hourly backups + disableHourly: false + # -- disable daily backups + disableDaily: false + # -- disable weekly backups + disableWeekly: false + # -- disable monthly backups + disableMonthly: false + # -- backup destination at S3, GCS or local filesystem. Release name will be included to path! + destination: "" + # -- backups' retention settings + retention: + # -- keep last N hourly backups. 0 means delete all existing hourly backups. Specify -1 to turn off + keepLastHourly: 2 + # -- keep last N daily backups. 0 means delete all existing daily backups. Specify -1 to turn off + keepLastDaily: 2 + # -- keep last N weekly backups. 0 means delete all existing weekly backups. Specify -1 to turn off + keepLastWeekly: 2 + # -- keep last N monthly backups. 0 means delete all existing monthly backups. Specify -1 to turn off + keepLastMonthly: 2 + extraArgs: + envflag.enable: "true" + envflag.prefix: VM_ + loggerFormat: json + # Extra Volume Mounts for the container + extraVolumeMounts: + [] + # - name: example + # mountPath: /example + # -- Allows to enable restore options for pod. + # Read more: https://docs.victoriametrics.com/vmbackupmanager.html#restore-commands + restore: + onStart: + enabled: false + resources: {} + # -- Additional environment variables (ex.: secret tokens, flags) https://github.com/VictoriaMetrics/VictoriaMetrics#environment-variables + env: [] + readinessProbe: + httpGet: + path: /health + port: manager-http + initialDelaySeconds: 5 + periodSeconds: 15 + timeoutSeconds: 5 + failureThreshold: 3 + livenessProbe: + tcpSocket: + port: manager-http + initialDelaySeconds: 30 + periodSeconds: 30 + timeoutSeconds: 5 + failureThreshold: 10 + service: + # -- Service annotations + annotations: {} + # -- Service labels + labels: {} + # -- Service ClusterIP + clusterIP: "" + # -- Service External IPs. Ref: [https://kubernetes.io/docs/user-guide/services/#external-ips]( https://kubernetes.io/docs/user-guide/services/#external-ips) + externalIPs: [] + # -- Service load balacner IP + loadBalancerIP: "" + # -- Load balancer source range + loadBalancerSourceRanges: [] + # -- Service port + servicePort: 8428 + # -- Node port + # nodePort: 30000 + # -- Service type + type: ClusterIP + # Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + # externalTrafficPolicy: "local" + # healthCheckNodePort: 0 + + statefulSet: + # -- Creates statefulset instead of deployment, useful when you want to keep the cache + enabled: true + # -- Deploy order policy for StatefulSet pods + podManagementPolicy: OrderedReady + # Headless service for statefulset + service: + # -- Headless service annotations + annotations: {} + # -- Headless service labels + labels: {} + # -- Headless service port + servicePort: 8428 + # Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + # externalTrafficPolicy: "local" + # healthCheckNodePort: 0 + # -- Pod's termination grace period in seconds + terminationGracePeriodSeconds: 60 + serviceMonitor: + # -- Enable deployment of Service Monitor for server component. This is Prometheus operator object + enabled: false + # -- Service Monitor labels + extraLabels: {} + # -- Service Monitor annotations + annotations: {} + # -- Commented. Prometheus scrape interval for server component +# interval: 15s + # -- Commented. Prometheus pre-scrape timeout for server component +# scrapeTimeout: 5s + # -- Commented. HTTP scheme to use for scraping. +# scheme: https + # -- Commented. TLS configuration to use when scraping the endpoint +# tlsConfig: +# insecureSkipVerify: true + # -- Service Monitor relabelings + relabelings: [] + + # -- Scrape configuration for victoriametrics + scrape: + # -- If true scrapes targets, creates config map or use specified one with scrape targets + enabled: false + # -- Use existing configmap if specified + # otherwise .config values will be used + configMap: "" + # -- Scrape config + config: + global: + scrape_interval: 15s + + # -- Scrape targets + scrape_configs: + # -- Scrape rule for scrape victoriametrics + - job_name: victoriametrics + static_configs: + - targets: [ "localhost:8428" ] + + ## COPY from Prometheus helm chart https://github.com/helm/charts/blob/master/stable/prometheus/values.yaml + + # -- Scrape config for API servers. + # + # Kubernetes exposes API servers as endpoints to the default/kubernetes + # service so this uses `endpoints` role and uses relabelling to only keep + # the endpoints associated with the default/kubernetes service using the + # default named port `https`. This works for single API server deployments as + # well as HA API server deployments. + - job_name: "kubernetes-apiservers" + kubernetes_sd_configs: + - role: endpoints + # Default to scraping over https. If required, just disable this or change to + # `http`. + scheme: https + # This TLS & bearer token file config is used to connect to the actual scrape + # endpoints for cluster components. This is separate to discovery auth + # configuration because discovery & scraping are two separate concerns in + # Prometheus. The discovery auth config is automatic if Prometheus runs inside + # the cluster. Otherwise, more config options have to be provided within the + # . + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + # If your node certificates are self-signed or use a different CA to the + # master CA, then you need to disable certificate verification. Note that + # certificate verification is an integral part of a secure infrastructure + # so this should only be disabled in a controlled environment. You can + # enable certificate verification by commenting the line below. + # + insecure_skip_verify: true + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + # Keep only the default/kubernetes service endpoints for the https port. This + # will add targets for each API server which Kubernetes adds an endpoint to + # the default/kubernetes service. + relabel_configs: + - source_labels: + [ + __meta_kubernetes_namespace, + __meta_kubernetes_service_name, + __meta_kubernetes_endpoint_port_name, + ] + action: keep + regex: default;kubernetes;https + # -- Scrape rule using kubernetes service discovery for nodes + - job_name: "kubernetes-nodes" + # Default to scraping over https. If required, just disable this or change to + # `http`. + scheme: https + # This TLS & bearer token file config is used to connect to the actual scrape + # endpoints for cluster components. This is separate to discovery auth + # configuration because discovery & scraping are two separate concerns in + # Prometheus. The discovery auth config is automatic if Prometheus runs inside + # the cluster. Otherwise, more config options have to be provided within the + # . + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + # If your node certificates are self-signed or use a different CA to the + # master CA, then you need to disable certificate verification. Note that + # certificate verification is an integral part of a secure infrastructure + # so this should only be disabled in a controlled environment. You can + # enable certificate verification by commenting the line below. + # + insecure_skip_verify: true + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + kubernetes_sd_configs: + - role: node + relabel_configs: + - action: labelmap + regex: __meta_kubernetes_node_label_(.+) + - target_label: __address__ + replacement: kubernetes.default.svc:443 + - source_labels: [ __meta_kubernetes_node_name ] + regex: (.+) + target_label: __metrics_path__ + replacement: /api/v1/nodes/$1/proxy/metrics + # -- Scrape rule using kubernetes service discovery for cadvisor + - job_name: "kubernetes-nodes-cadvisor" + # Default to scraping over https. If required, just disable this or change to + # `http`. + scheme: https + # This TLS & bearer token file config is used to connect to the actual scrape + # endpoints for cluster components. This is separate to discovery auth + # configuration because discovery & scraping are two separate concerns in + # Prometheus. The discovery auth config is automatic if Prometheus runs inside + # the cluster. Otherwise, more config options have to be provided within the + # . + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + # If your node certificates are self-signed or use a different CA to the + # master CA, then you need to disable certificate verification. Note that + # certificate verification is an integral part of a secure infrastructure + # so this should only be disabled in a controlled environment. You can + # enable certificate verification by commenting the line below. + # + insecure_skip_verify: true + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + kubernetes_sd_configs: + - role: node + # This configuration will work only on kubelet 1.7.3+ + # As the scrape endpoints for cAdvisor have changed + # if you are using older version you need to change the replacement to + # replacement: /api/v1/nodes/$1:4194/proxy/metrics + # more info here https://github.com/coreos/prometheus-operator/issues/633 + relabel_configs: + - action: labelmap + regex: __meta_kubernetes_node_label_(.+) + - target_label: __address__ + replacement: kubernetes.default.svc:443 + - source_labels: [ __meta_kubernetes_node_name ] + regex: (.+) + target_label: __metrics_path__ + replacement: /api/v1/nodes/$1/proxy/metrics/cadvisor + # ignore timestamps of cadvisor's metrics by default + # more info here https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4697#issuecomment-1656540535 + honor_timestamps: false + # -- Scrape config for service endpoints. + # + # The relabeling allows the actual service scrape endpoint to be configured + # via the following annotations: + # + # * `prometheus.io/scrape`: Only scrape services that have a value of `true` + # * `prometheus.io/scheme`: If the metrics endpoint is secured then you will need + # to set this to `https` & most likely set the `tls_config` of the scrape config. + # * `prometheus.io/path`: If the metrics path is not `/metrics` override this. + # * `prometheus.io/port`: If the metrics are exposed on a different port to the + # service then set this appropriately. + # -- Scrape rule using kubernetes service discovery for endpoints + - job_name: "kubernetes-service-endpoints" + kubernetes_sd_configs: + - role: endpoints + relabel_configs: + - action: drop + source_labels: [ __meta_kubernetes_pod_container_init ] + regex: true + - action: keep_if_equal + source_labels: [ __meta_kubernetes_service_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number ] + - source_labels: + [ __meta_kubernetes_service_annotation_prometheus_io_scrape ] + action: keep + regex: true + - source_labels: + [ __meta_kubernetes_service_annotation_prometheus_io_scheme ] + action: replace + target_label: __scheme__ + regex: (https?) + - source_labels: + [ __meta_kubernetes_service_annotation_prometheus_io_path ] + action: replace + target_label: __metrics_path__ + regex: (.+) + - source_labels: + [ + __address__, + __meta_kubernetes_service_annotation_prometheus_io_port, + ] + action: replace + target_label: __address__ + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - source_labels: [ __meta_kubernetes_namespace ] + action: replace + target_label: kubernetes_namespace + - source_labels: [ __meta_kubernetes_service_name ] + action: replace + target_label: kubernetes_name + - source_labels: [ __meta_kubernetes_pod_node_name ] + action: replace + target_label: kubernetes_node + # -- Scrape config for slow service endpoints; same as above, but with a larger + # timeout and a larger interval + # + # The relabeling allows the actual service scrape endpoint to be configured + # via the following annotations: + # + # * `prometheus.io/scrape-slow`: Only scrape services that have a value of `true` + # * `prometheus.io/scheme`: If the metrics endpoint is secured then you will need + # to set this to `https` & most likely set the `tls_config` of the scrape config. + # * `prometheus.io/path`: If the metrics path is not `/metrics` override this. + # * `prometheus.io/port`: If the metrics are exposed on a different port to the + # service then set this appropriately. + - job_name: "kubernetes-service-endpoints-slow" + scrape_interval: 5m + scrape_timeout: 30s + kubernetes_sd_configs: + - role: endpoints + relabel_configs: + - action: drop + source_labels: [ __meta_kubernetes_pod_container_init ] + regex: true + - action: keep_if_equal + source_labels: [ __meta_kubernetes_service_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number ] + - source_labels: + [ __meta_kubernetes_service_annotation_prometheus_io_scrape_slow ] + action: keep + regex: true + - source_labels: + [ __meta_kubernetes_service_annotation_prometheus_io_scheme ] + action: replace + target_label: __scheme__ + regex: (https?) + - source_labels: + [ __meta_kubernetes_service_annotation_prometheus_io_path ] + action: replace + target_label: __metrics_path__ + regex: (.+) + - source_labels: + [ + __address__, + __meta_kubernetes_service_annotation_prometheus_io_port, + ] + action: replace + target_label: __address__ + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - source_labels: [ __meta_kubernetes_namespace ] + action: replace + target_label: kubernetes_namespace + - source_labels: [ __meta_kubernetes_service_name ] + action: replace + target_label: kubernetes_name + - source_labels: [ __meta_kubernetes_pod_node_name ] + action: replace + target_label: kubernetes_node + # -- Example scrape config for probing services via the Blackbox Exporter. + # + # The relabeling allows the actual service scrape endpoint to be configured + # via the following annotations: + # + # * `prometheus.io/probe`: Only probe services that have a value of `true` + - job_name: "kubernetes-services" + metrics_path: /probe + params: + module: [ http_2xx ] + kubernetes_sd_configs: + - role: service + relabel_configs: + - source_labels: + [ __meta_kubernetes_service_annotation_prometheus_io_probe ] + action: keep + regex: true + - source_labels: [ __address__ ] + target_label: __param_target + - target_label: __address__ + replacement: blackbox + - source_labels: [ __param_target ] + target_label: instance + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - source_labels: [ __meta_kubernetes_namespace ] + target_label: kubernetes_namespace + - source_labels: [ __meta_kubernetes_service_name ] + target_label: kubernetes_name + # -- Example scrape config for pods + # + # The relabeling allows the actual pod scrape endpoint to be configured via the + # following annotations: + # + # * `prometheus.io/scrape`: Only scrape pods that have a value of `true` + # * `prometheus.io/path`: If the metrics path is not `/metrics` override this. + # * `prometheus.io/port`: Scrape the pod on the indicated port instead of the default of `9102`. + - job_name: "kubernetes-pods" + kubernetes_sd_configs: + - role: pod + relabel_configs: + - action: drop + source_labels: [ __meta_kubernetes_pod_container_init ] + regex: true + - action: keep_if_equal + source_labels: [ __meta_kubernetes_pod_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number ] + - source_labels: [ __meta_kubernetes_pod_annotation_prometheus_io_scrape ] + action: keep + regex: true + - source_labels: [ __meta_kubernetes_pod_annotation_prometheus_io_path ] + action: replace + target_label: __metrics_path__ + regex: (.+) + - source_labels: + [ __address__, __meta_kubernetes_pod_annotation_prometheus_io_port ] + action: replace + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + target_label: __address__ + - action: labelmap + regex: __meta_kubernetes_pod_label_(.+) + - source_labels: [ __meta_kubernetes_namespace ] + action: replace + target_label: kubernetes_namespace + - source_labels: [ __meta_kubernetes_pod_name ] + action: replace + target_label: kubernetes_pod_name + ## End of COPY + + # -- Extra scrape configs that will be appended to `server.scrape.config` + extraScrapeConfigs: [] + +# -- Add extra specs dynamically to this chart +extraObjects: [] + +# -- Enterprise license key configuration for VictoriaMetrics enterprise. +# Required only for VictoriaMetrics enterprise. +# Documentation - https://docs.victoriametrics.com/enterprise.html, +# for more information, visit https://victoriametrics.com/products/enterprise/ . +# To request a trial license, go to https://victoriametrics.com/products/enterprise/trial/ +# Supported starting from VictoriaMetrics v1.94.0 +license: + # -- License key + key: "" + + # -- Use existing secret with license key + secret: + # -- Existing secret name + name: "" + # -- Key in secret with license key + key: "" diff --git a/thunder_deployment/infra/beta9/templates/_helpers.tpl b/thunder_deployment/infra/beta9/templates/_helpers.tpl new file mode 100644 index 000000000..0a92753d7 --- /dev/null +++ b/thunder_deployment/infra/beta9/templates/_helpers.tpl @@ -0,0 +1,120 @@ +{{- define "beta9.init" -}} + {{/* Hack to disable main controller */}} + {{- $_ := include "beta9.disable-main-controller" . | fromYaml | merge .Values -}} + + {{/* Make sure all variables are set properly */}} + {{- include "bjw-s.common.loader.init" . }} + + {{/* Enforce default values */}} + {{- $_ := include "beta9" . | fromYaml | merge .Values -}} +{{- end -}} + + +{{/* Disable main controller */}} +{{- define "beta9.disable-main-controller" -}} +controllers: + main: + enabled: false +service: + main: + enabled: false +ingress: + main: + enabled: false +route: + main: + enabled: false +serviceMonitor: + main: + enabled: false +networkpolicies: + main: + enabled: false +{{- end -}} + + +{{/* Define hard coded defaults */}} +{{- define "beta9" -}} +controllers: + gateway: + type: deployment + pod: + annotations: + secret-hash: {{ include "sha256sum" (toYaml .Values.config) }} + containers: + main: + command: + - /usr/local/bin/gateway + image: + repository: {{ .Values.images.gateway.repository }} + tag: "{{ .Values.images.gateway.tag | default .Chart.AppVersion }}" + pullPolicy: {{ .Values.images.gateway.pullPolicy | default "IfNotPresent" }} + probes: + readiness: + enabled: true + custom: true + spec: + initialDelaySeconds: 5 + successThreshold: 2 + failureThreshold: 2 + periodSeconds: 3 + timeoutSeconds: 1 + grpc: + port: 1993 + service: readiness + liveness: + enabled: true + custom: true + spec: + initialDelaySeconds: 10 + successThreshold: 1 + failureThreshold: 10 + periodSeconds: 3 + timeoutSeconds: 1 + grpc: + port: 1993 + service: liveness + startup: + enabled: true + custom: true + spec: + periodSeconds: 3 + timeoutSeconds: 1 + failureThreshold: 100 + grpc: + port: 1993 + service: liveness + securityContext: + privileged: true + hostNetwork: true +service: + gateway: + controller: gateway +ingress: + gateway: + controller: gateway +serviceAccount: + create: true +persistence: + config-helm: + enabled: {{ if .Values.config }}true{{ else }}false{{ end }} + type: secret + name: beta9-config-helm + globalMounts: + - path: /etc/beta9.d/config.yaml + subPath: config.yaml + readOnly: true +{{- end -}} + + +{{/*Adds labels to custom manifests.*/}} +{{- define "manifests.metadata" -}} +metadata: + labels: + {{ include "bjw-s.common.lib.metadata.allLabels" . | nindent 4 }} +{{- end -}} + + +{{- define "sha256sum" -}} +{{- printf "%s" (. | sha256sum) | quote -}} +{{- end -}} diff --git a/thunder_deployment/infra/beta9/templates/cache-server-daemonset.yaml b/thunder_deployment/infra/beta9/templates/cache-server-daemonset.yaml new file mode 100644 index 000000000..1e78f0e0b --- /dev/null +++ b/thunder_deployment/infra/beta9/templates/cache-server-daemonset.yaml @@ -0,0 +1,111 @@ +{{- if .Values.cacheServer.enabled -}} +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: {{ .Release.Name }}-cache-server + labels: + {{- include "bjw-s.common.lib.metadata.allLabels" . | nindent 4 }} + app.kubernetes.io/component: cache-server +spec: + selector: + matchLabels: + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/component: cache-server + template: + metadata: + labels: + {{- include "bjw-s.common.lib.metadata.allLabels" . | nindent 8 }} + app.kubernetes.io/component: cache-server + spec: + serviceAccountName: {{ .Values.serviceAccount.name }} + automountServiceAccountToken: true + terminationGracePeriodSeconds: 60 + {{- with .Values.cacheServer.priorityClassName }} + priorityClassName: {{ . | quote }} + {{- end }} + {{- if .Values.cacheServer.hostNetwork }} + hostNetwork: true + dnsPolicy: ClusterFirstWithHostNet + {{- end }} + {{- with .Values.cacheServer.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.cacheServer.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.cacheServer.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.defaultPodOptions.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + containers: + - name: worker + image: {{ .Values.cacheServer.image.repository | default .Values.images.worker.repository }}:{{ .Values.cacheServer.image.tag | default .Values.images.worker.tag | default .Chart.AppVersion }} + imagePullPolicy: {{ .Values.cacheServer.image.pullPolicy | default .Values.images.worker.pullPolicy | default "IfNotPresent" }} + command: + - /usr/bin/tini + - -g + - -- + - /usr/local/bin/worker + {{- with .Values.cacheServer.securityContext }} + securityContext: + {{- toYaml . | nindent 10 }} + {{- end }} + env: + - name: CONFIG_PATH + value: /etc/beta9/config.yaml + - name: CACHE_SERVER_ONLY + value: "true" + - name: WORKER_POOL_NAME + value: {{ .Values.cacheServer.poolName | quote }} + - name: CACHE_LOCALITY + value: {{ .Values.cacheServer.locality | quote }} + - name: CACHE_NODE_ID + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: POD_UID + valueFrom: + fieldRef: + fieldPath: metadata.uid + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: CACHE_HOST_NETWORK + value: {{ .Values.cacheServer.hostNetwork | quote }} + - name: CACHE_SERVER_PORT + value: {{ .Values.cacheServer.serverPort | quote }} + - name: WORKER_ID + value: cache-server-$(CACHE_NODE_ID) + ports: + - name: cache + containerPort: {{ .Values.cacheServer.serverPort }} + {{- if .Values.cacheServer.hostNetwork }} + hostPort: {{ .Values.cacheServer.serverPort }} + {{- end }} + volumeMounts: + - name: config + mountPath: /etc/beta9/config.yaml + subPath: config.yaml + readOnly: true + - name: cache + mountPath: {{ .Values.cacheServer.mountPath }} + {{- with .Values.cacheServer.resources }} + resources: + {{- toYaml . | nindent 10 }} + {{- end }} + volumes: + - name: config + secret: + secretName: {{ .Values.cacheServer.configSecretName }} + - name: cache + hostPath: + path: {{ .Values.cacheServer.hostPath }} + type: DirectoryOrCreate +{{- end -}} diff --git a/thunder_deployment/infra/beta9/templates/clusterrole.yaml b/thunder_deployment/infra/beta9/templates/clusterrole.yaml new file mode 100644 index 000000000..27951a732 --- /dev/null +++ b/thunder_deployment/infra/beta9/templates/clusterrole.yaml @@ -0,0 +1,29 @@ +{{- if .Values.serviceAccount.create -}} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ .Values.serviceAccount.name }}-role + labels: + {{- include "bjw-s.common.lib.metadata.allLabels" . | nindent 4 }} +rules: +- apiGroups: ["*"] + resources: ["*"] + verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ .Values.serviceAccount.name }}-role-binding + labels: + {{- include "bjw-s.common.lib.metadata.allLabels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ .Values.serviceAccount.name }}-role +subjects: +- kind: ServiceAccount + name: {{ .Values.serviceAccount.name }} + namespace: {{ .Release.Namespace }} +--- +{{- end -}} diff --git a/thunder_deployment/infra/beta9/templates/common.yaml b/thunder_deployment/infra/beta9/templates/common.yaml new file mode 100644 index 000000000..e374dca62 --- /dev/null +++ b/thunder_deployment/infra/beta9/templates/common.yaml @@ -0,0 +1,6 @@ +--- +{{/* Set all variables properly */}} +{{- include "beta9.init" . -}} + +{{/* Render the templates */}} +{{- include "bjw-s.common.loader.all" . -}} diff --git a/thunder_deployment/infra/beta9/templates/manifests.yaml b/thunder_deployment/infra/beta9/templates/manifests.yaml new file mode 100644 index 000000000..70fc03f38 --- /dev/null +++ b/thunder_deployment/infra/beta9/templates/manifests.yaml @@ -0,0 +1,9 @@ +{{- $template := fromYaml (include "manifests.metadata" .) -}} +{{- range .Values.manifests.resources }} +--- +{{ toYaml (merge . $template) -}} +{{- end }} +{{- range $i, $t := .Values.manifests.templates }} +--- +{{ toYaml (merge (tpl $t $ | fromYaml) $template) -}} +{{- end }} diff --git a/thunder_deployment/infra/beta9/templates/registry.yaml b/thunder_deployment/infra/beta9/templates/registry.yaml new file mode 100644 index 000000000..bcd44df08 --- /dev/null +++ b/thunder_deployment/infra/beta9/templates/registry.yaml @@ -0,0 +1,83 @@ +{{- if .Values.registry.enabled }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: beta9-registry + labels: + {{- include "bjw-s.common.lib.metadata.allLabels" . | nindent 4 }} +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ .Values.registry.persistence.size | quote }} + {{- if .Values.registry.persistence.storageClass }} + storageClassName: {{ .Values.registry.persistence.storageClass | quote }} + {{- end }} +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: beta9-registry + labels: + {{- include "bjw-s.common.lib.metadata.allLabels" . | nindent 4 }} + app.kubernetes.io/component: registry +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/name: {{ include "bjw-s.common.lib.chart.names.name" . }} + app.kubernetes.io/component: registry + template: + metadata: + labels: + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/name: {{ include "bjw-s.common.lib.chart.names.name" . }} + app.kubernetes.io/component: registry + spec: + {{- with .Values.registry.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + containers: + - name: registry + image: {{ .Values.registry.image.repository }}:{{ .Values.registry.image.tag }} + imagePullPolicy: {{ .Values.registry.image.pullPolicy | default "IfNotPresent" }} + ports: + - name: registry + containerPort: 5000 + protocol: TCP + env: + - name: REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY + value: /var/lib/registry + volumeMounts: + - name: data + mountPath: /var/lib/registry + volumes: + - name: data + persistentVolumeClaim: + claimName: beta9-registry +--- +apiVersion: v1 +kind: Service +metadata: + name: beta9-registry + labels: + {{- include "bjw-s.common.lib.metadata.allLabels" . | nindent 4 }} + app.kubernetes.io/component: registry +spec: + type: {{ .Values.registry.service.type | default "ClusterIP" }} + selector: + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/name: {{ include "bjw-s.common.lib.chart.names.name" . }} + app.kubernetes.io/component: registry + ports: + - name: registry + port: {{ .Values.registry.service.port | default 5000 }} + targetPort: 5000 + protocol: TCP + {{- if eq (.Values.registry.service.type | default "ClusterIP") "NodePort" }} + nodePort: {{ .Values.registry.service.nodePort }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/templates/secret.yaml b/thunder_deployment/infra/beta9/templates/secret.yaml new file mode 100644 index 000000000..983b74ab9 --- /dev/null +++ b/thunder_deployment/infra/beta9/templates/secret.yaml @@ -0,0 +1,11 @@ +{{ if .Values.config }} +apiVersion: v1 +kind: Secret +type: Opaque +metadata: + name: beta9-config-helm + annotations: + config-hash: {{ include "sha256sum" (toYaml .Values.config) }} +data: + config.yaml: {{ .Values.config | toYaml | b64enc }} +{{- end }} diff --git a/thunder_deployment/infra/beta9/values.yaml b/thunder_deployment/infra/beta9/values.yaml new file mode 100644 index 000000000..7f7a4d15b --- /dev/null +++ b/thunder_deployment/infra/beta9/values.yaml @@ -0,0 +1,475 @@ +# -- See the common values.yaml for all the options you can set. +# https://github.com/bjw-s/helm-charts/blob/common-2.5.0/charts/library/common/values.yaml +global: + labels: {} + annotations: {} + nameOverride: beta9 + +# -- Beta9's configuration. +# https://github.com/beam-cloud/beta9/blob/main/pkg/common/config.default.yaml +config: + gateway: + host: beta9-gateway + grpc: + externalHost: 100.73.254.107 + externalPort: 31993 + tls: false + port: 1993 + http: + externalHost: 100.73.254.107 + externalPort: 31994 + tls: false + port: 1994 + database: + postgres: + host: postgresql + port: 5432 + username: root + password: password + name: main + timezone: UTC + encryptionKey: sk_pKz38fK8v7lz01AneJI8MJnR70akmP2CtDNf1IufKcY= + redis: + mode: single + addrs: + - redis-master:6379 + password: "" + enableTLS: false + insecureSkipVerify: false + dialTimeout: 3s + storage: + mode: juicefs + fsName: beta9-fs + fsPath: /data + juicefs: + redisURI: redis://juicefs-redis-master:6379/0 + awsS3Bucket: http://localstack:4566/juicefs + worker: + imageRegistry: public.ecr.aws/n4e0e1y0 + imageName: beta9-worker + imageTag: 0.1.682 + hostNetwork: true + jobResourcesEnforced: true + imagePVCName: "" + pools: + default: + mode: local + priority: 1 + imagesPath: /var/lib/beta9/images + containerRuntime: gvisor + containerStartConcurrency: 32 + containerRuntimeConfig: + gvisorPlatform: systrap + gvisorRoot: /run/gvisor + gvisorExtraArgs: + - --overlay2=none + - --file-access=shared + networkPreallocation: true + networkSlotPoolSize: 32 + jobSpec: + nodeSelector: {} + criuEnabled: true + poolSizing: + defaultWorkerCPU: 2000m + defaultWorkerGPUType: "" + defaultWorkerMemory: 1Gi + minFreeCPU: 0 + minFreeGPU: 0 + minFreeMemory: 0 + build: + mode: local + requiresPoolSelector: true + imagesPath: /var/lib/beta9/images + containerRuntime: runc + containerRuntimeConfig: + gvisorPlatform: systrap + gvisorRoot: /run/gvisor + gvisorExtraArgs: + - --overlay2=none + - --file-access=shared + networkPreallocation: true + networkSlotPoolSize: 32 + tmpSizeLimit: 50Gi + jobSpec: + nodeSelector: + beta9.node-role: master + env: + - name: POD_HOSTNAME + value: 10.42.0.0 + poolSizing: + defaultWorkerCPU: 8000m + defaultWorkerGPUType: "" + defaultWorkerMemory: 32Gi + minFreeCPU: 8000m + minFreeGPU: 0 + minFreeMemory: 32Gi + sharedMemoryLimitPct: 100% + a6000: + mode: local + priority: 100 + imagesPath: /var/lib/beta9/images + gpuType: A6000 + runtime: nvidia + containerRuntime: runc + containerStartConcurrency: 8 + containerRuntimeConfig: + gvisorPlatform: systrap + gvisorRoot: /run/gvisor + gvisorExtraArgs: + - --overlay2=none + - --file-access=shared + networkPreallocation: true + networkSlotPoolSize: 32 + jobSpec: + nodeSelector: + beta9.node-role: gpu + beta9.gpu-type: A6000 + env: + - name: POD_HOSTNAME + value: 10.42.2.0 + poolSizing: + defaultWorkerCPU: 8000m + defaultWorkerGPUType: A6000 + defaultWorkerGPUCount: "1" + defaultWorkerMemory: 32Gi + minFreeCPU: 0 + minFreeGPU: 0 + minFreeMemory: 0 + sharedMemoryLimitPct: 100% + monitoring: + metricsCollector: none + prometheus: + scrapeWorkers: false + port: 9090 + + imageService: + registryStore: s3 + registries: + s3: + bucketName: beta9-images + region: us-east-1 + accessKey: test + secretKey: test + endpoint: http://localstack:4566 + forcePathStyle: true + runner: + baseImageRegistry: public.ecr.aws/n4e0e1y0 + buildRegistry: 100.73.254.107:32000 + buildRegistryInsecure: true + buildRepositoryName: beta9-users + managedCompute: + billableMarginPct: 0.10 + byoc: + pricing: + memoryHourlyMicrosPerGB: 4500 + cpuHourlyMicrosPerVCPU: 9500 + aws: + templateUrl: "" + billing: + mode: noop + endpoint: "" + authToken: "" + required: false + timeout: 5s + reconcileInterval: 1m + minimumCreditCents: 2500 + +registry: + enabled: true + image: + repository: registry + tag: 2.8.3 + pullPolicy: IfNotPresent + nodeSelector: + beta9.node-role: master + service: + type: NodePort + port: 5000 + nodePort: 32000 + persistence: + enabled: true + storageClass: local-path + size: 100Gi + +images: + gateway: + repository: public.ecr.aws/n4e0e1y0/beta9-gateway + tag: 0.1.714 + pullPolicy: # Defaults to IfNotPresent + worker: + repository: public.ecr.aws/n4e0e1y0/beta9-worker + tag: 0.1.682 + pullPolicy: # Defaults to IfNotPresent + +cacheServer: + enabled: false + configSecretName: beta9-config-helm + poolName: default + locality: default + serverPort: 2050 + hostPath: /var/lib/beta9/cache + mountPath: /var/lib/beta9/cache + hostNetwork: true + priorityClassName: + image: + repository: # Defaults to images.worker.repository + tag: # Defaults to images.worker.tag or chart app version + pullPolicy: # Defaults to images.worker.pullPolicy or IfNotPresent + nodeSelector: {} + affinity: {} + tolerations: [] + securityContext: + privileged: true + resources: + requests: + cpu: 250m + memory: 512Mi + limits: + cpu: "2" + memory: 2Gi + +controllers: + gateway: + annotations: {} + labels: {} + replicas: 1 + pod: + hostNetwork: true + dnsPolicy: ClusterFirstWithHostNet + nodeSelector: + beta9.node-role: master + # 180s gateway shutdownTimeout + 10s readiness propagation + 5s buffer. + terminationGracePeriodSeconds: "195" + strategy: RollingUpdate + rollingUpdate: + unavailable: 1 + surge: "0" + containers: + main: + probes: + liveness: + enabled: false + readiness: + enabled: false + startup: + enabled: false + initContainers: + wait-on-backends: + image: + repository: busybox + tag: 1.37.0 + command: + - sh + - -c + - | + until nc -z postgresql 5432; do echo "Waiting on PostgreSQL..."; sleep 2; done; + until nc -z redis-master 6379; do echo "Waiting on Redis..."; sleep 2; done; + until nc -z juicefs-redis-master 6379; do echo "Waiting on Redis (JuiceFS)..."; sleep 2; done; + echo "All systems ready!" + +persistence: + images: + enabled: false + type: persistentVolumeClaim + size: 50Gi + storageClass: local-path + accessMode: ReadWriteOnce + +service: + gateway: + annotations: + prometheus.io/scrape: "true" + prometheus.io/port: "9090" + labels: {} + ports: + grpc: + port: 1993 + targetPort: 1993 + protocol: TCP + nodePort: 31993 + http: + primary: true + port: 1994 + targetPort: 1994 + protocol: TCP + nodePort: 31994 + metrics: + port: 9090 + targetPort: 9090 + protocol: TCP + type: NodePort + +ingress: + gateway: + enabled: false + annotations: {} + labels: {} + +serviceAccount: + name: beta9 + annotations: {} + labels: {} + +# -- In-memory cache for container images. +# https://github.com/beam-cloud/blobcache/deploy/charts/blobcache/values.yaml +blobcache: + enabled: false + +# -- Needed by Gateway +redis: + enabled: true + nameOverride: redis + fullnameOverride: redis + architecture: standalone + auth: + enabled: false + image: + tag: latest + volumePermissions: + image: + tag: latest + sysctl: + image: + tag: latest + master: + configuration: | + activedefrag yes + notify-keyspace-events AKE + persistence: + size: 1Gi + +# -- Needed by Gateway +postgresql: + enabled: true + nameOverride: postgresql + fullnameOverride: postgresql + image: + tag: latest + global: + postgresql: + auth: + username: root + password: password + database: main + primary: + extendedConfiguration: | + max_connections=400 + shared_buffers='400MB' + volumePermissions: + enabled: true + image: + tag: latest + persistence: + enabled: true + size: 1Gi + +# -- Needed by Gateway's file system +juicefs-redis: + enabled: true + nameOverride: juicefs-redis + fullnameOverride: juicefs-redis + architecture: standalone + auth: + enabled: false + image: + tag: latest + volumePermissions: + image: + tag: latest + sysctl: + image: + tag: latest + master: + persistence: + size: 1Gi + +# -- Enables deployment of victoria-metrics and grafana +metrics: + enabled: false + +grafana: + nameOverride: grafana + fullnameOverride: grafana + datasources: + datasources.yaml: + apiVersion: 1 + datasources: + - name: Victoria Metrics + type: prometheus + url: http://victoria-metrics-single:8428 + access: proxy + isDefault: true + +victoria-metrics-agent: + nameOverride: victoria-metrics-agent + fullnameOverride: victoria-metrics-agent + remoteWriteUrls: + - http://victoria-metrics-single:8428/api/v1/write + extraScrapeConfigs: + - job_name: beta9-pods + metrics_path: /metrics + scheme: http + honor_labels: true + scrape_timeout: 10s + scrape_interval: 15s + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - beta9 + relabel_configs: + - source_labels: [__meta_kubernetes_pod_label_prometheus_io_scrape] + action: keep + regex: true + - source_labels: [__meta_kubernetes_pod_container_port_number] + action: keep + regex: 9090 + +victoria-metrics-single: + server: + fullnameOverride: victoria-metrics-single + +# -- Used to add any custom manifests +manifests: + resources: + - apiVersion: helm.cattle.io/v1 + kind: HelmChart + metadata: + name: localstack + spec: + repo: https://localstack.github.io/helm-charts + chart: localstack + createNamespace: false + version: 0.6.5 + valuesContent: |- + image: + tag: 3.8.1 + extraEnvVars: + - name: SERVICES + value: s3 + enableStartupScripts: true + startupScriptContent: | + #!/bin/bash + awslocal s3 mb s3://juicefs + awslocal s3 mb s3://beta9-images + persistence: + enabled: true + storageClass: local-path + accessModes: + - ReadWriteOnce + size: 50Gi + - apiVersion: v1 + kind: Service + metadata: + name: postgres-postgresql + spec: + type: ClusterIP + ports: + - name: tcp-postgresql + port: 5432 + targetPort: tcp-postgresql + selector: + app.kubernetes.io/component: primary + app.kubernetes.io/instance: beta9 + app.kubernetes.io/name: postgresql + templates: [] diff --git a/thunder_deployment/infra/gpu-node-labels.yaml b/thunder_deployment/infra/gpu-node-labels.yaml new file mode 100644 index 000000000..a0a58f1bc --- /dev/null +++ b/thunder_deployment/infra/gpu-node-labels.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Node +metadata: + name: REPLACE_WITH_GPU_NODE_NAME + labels: + beta9.node-role: gpu + beta9.gpu: "true" + beta9.gpu-type: A6000 + beta9.gpu-count: "8" diff --git a/thunder_deployment/infra/nvidia-runtimeclass/Chart.yaml b/thunder_deployment/infra/nvidia-runtimeclass/Chart.yaml new file mode 100644 index 000000000..c54179695 --- /dev/null +++ b/thunder_deployment/infra/nvidia-runtimeclass/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: nvidia-runtimeclass +description: NVIDIA RuntimeClass for containers with GPU requirements, including gVisor support +type: application +version: 0.2.0 +appVersion: "1.0.0" \ No newline at end of file diff --git a/thunder_deployment/infra/nvidia-runtimeclass/templates/_helpers.tpl b/thunder_deployment/infra/nvidia-runtimeclass/templates/_helpers.tpl new file mode 100644 index 000000000..55c395524 --- /dev/null +++ b/thunder_deployment/infra/nvidia-runtimeclass/templates/_helpers.tpl @@ -0,0 +1,49 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "nvidia-runtimeclass.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +*/}} +{{- define "nvidia-runtimeclass.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "nvidia-runtimeclass.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "nvidia-runtimeclass.labels" -}} +helm.sh/chart: {{ include "nvidia-runtimeclass.chart" . }} +{{ include "nvidia-runtimeclass.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "nvidia-runtimeclass.selectorLabels" -}} +app.kubernetes.io/name: {{ include "nvidia-runtimeclass.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} \ No newline at end of file diff --git a/thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-ctk-installer-daemonset.yaml b/thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-ctk-installer-daemonset.yaml new file mode 100644 index 000000000..4d5263c89 --- /dev/null +++ b/thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-ctk-installer-daemonset.yaml @@ -0,0 +1,66 @@ +{{- if .Values.devicePlugin.installer.enabled }} +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: nvidia-ctk-installer + namespace: kube-system + labels: + app.kubernetes.io/name: nvidia-ctk-installer + app.kubernetes.io/managed-by: {{ .Release.Service }} + helm.sh/chart: {{ include "nvidia-runtimeclass.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} +spec: + selector: + matchLabels: + name: nvidia-ctk-installer + updateStrategy: + type: RollingUpdate + template: + metadata: + labels: + name: nvidia-ctk-installer + spec: + hostPID: true + {{- with .Values.devicePlugin.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + tolerations: + - key: nvidia.com/gpu + operator: Exists + effect: NoSchedule + priorityClassName: "system-node-critical" + containers: + - name: nvidia-ctk-installer + image: {{ .Values.devicePlugin.installer.image }} + command: + - bash + - -c + - | + nvidia-ctk runtime configure --runtime=containerd --config=/etc/containerd/config.toml --set-as-default + nsenter --mount=/host/proc/1/ns/mnt -- systemctl restart containerd || true + echo "NVIDIA runtime configured successfully" + # Keep the container running + sleep infinity + {{- with .Values.devicePlugin.installer.securityContext }} + securityContext: + {{- toYaml . | nindent 10 }} + {{- end }} + {{- with .Values.devicePlugin.installer.volumeMounts }} + volumeMounts: + {{- toYaml . | nindent 8 }} + {{- end }} + volumes: + - name: host-root + hostPath: + path: / + type: Directory + - name: containerd-config + hostPath: + path: /etc/containerd + type: Directory + - name: containerd-socket + hostPath: + path: /run/containerd/containerd.sock + type: Socket +{{- end }} diff --git a/thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-device-plugin-daemonset.yaml b/thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-device-plugin-daemonset.yaml new file mode 100644 index 000000000..5f5e1cd79 --- /dev/null +++ b/thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-device-plugin-daemonset.yaml @@ -0,0 +1,54 @@ +{{- if .Values.devicePlugin.enabled }} +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: nvidia-device-plugin-daemonset + namespace: kube-system + labels: + app.kubernetes.io/name: nvidia-device-plugin + app.kubernetes.io/managed-by: {{ .Release.Service }} + helm.sh/chart: {{ include "nvidia-runtimeclass.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} +spec: + selector: + matchLabels: + name: nvidia-device-plugin-ds + updateStrategy: + type: RollingUpdate + template: + metadata: + labels: + name: nvidia-device-plugin-ds + spec: + {{- with .Values.devicePlugin.runtimeClassName }} + runtimeClassName: {{ . }} + {{- end }} + {{- with .Values.devicePlugin.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + tolerations: + - key: nvidia.com/gpu + operator: Exists + effect: NoSchedule + priorityClassName: "system-node-critical" + containers: + - image: {{ .Values.devicePlugin.image }} + name: nvidia-device-plugin-ctr + {{- with .Values.devicePlugin.env }} + env: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.devicePlugin.securityContext }} + securityContext: + {{- toYaml . | nindent 10 }} + {{- end }} + {{- with .Values.devicePlugin.volumeMounts }} + volumeMounts: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.devicePlugin.volumes }} + volumes: + {{- toYaml . | nindent 6 }} + {{- end }} +{{- end }} diff --git a/thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-runtimeclass.yaml b/thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-runtimeclass.yaml new file mode 100644 index 000000000..62e2138d5 --- /dev/null +++ b/thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-runtimeclass.yaml @@ -0,0 +1,12 @@ +{{- if .Values.enabled }} +apiVersion: node.k8s.io/v1 +kind: RuntimeClass +metadata: + name: nvidia + labels: + app.kubernetes.io/name: nvidia-runtimeclass + app.kubernetes.io/managed-by: {{ .Release.Service }} + helm.sh/chart: {{ include "nvidia-runtimeclass.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} +handler: {{ .Values.handler }} +{{- end }} \ No newline at end of file diff --git a/thunder_deployment/infra/nvidia-runtimeclass/values.yaml b/thunder_deployment/infra/nvidia-runtimeclass/values.yaml new file mode 100644 index 000000000..3aafc54aa --- /dev/null +++ b/thunder_deployment/infra/nvidia-runtimeclass/values.yaml @@ -0,0 +1,75 @@ +# Default values for nvidia-runtimeclass. +# This is a YAML-formatted file. + +# Enable/disable the RuntimeClass deployment +enabled: true + +# RuntimeClass handler name +handler: nvidia + +# Enable/disable device plugin +devicePlugin: + enabled: true + runtimeClassName: nvidia + image: nvcr.io/nvidia/k8s-device-plugin:v0.18.2 + nodeSelector: + beta9.node-role: gpu + env: + - name: FAIL_ON_INIT_ERROR + value: "false" + - name: PASS_DEVICE_SPECS + value: "true" + - name: NVIDIA_VISIBLE_DEVICES + value: "all" + - name: NVIDIA_DRIVER_CAPABILITIES + value: "compute,utility" + securityContext: + allowPrivilegeEscalation: true + privileged: true + capabilities: + add: + - SYS_ADMIN + volumeMounts: + - name: device-plugin + mountPath: /var/lib/kubelet/device-plugins + - name: dev + mountPath: /dev + - name: containerd-config + mountPath: /etc/containerd + - name: containerd-socket + mountPath: /run/containerd/containerd.sock + volumes: + - name: device-plugin + hostPath: + path: /var/lib/kubelet/device-plugins + - name: dev + hostPath: + path: /dev + - name: containerd-config + hostPath: + path: /etc/containerd + type: Directory + - name: containerd-socket + hostPath: + path: /run/containerd/containerd.sock + type: Socket + - name: host-root + hostPath: + path: / + type: Directory + # NVIDIA Container Toolkit installer + installer: + enabled: true + image: nvcr.io/nvidia/k8s/container-toolkit:v1.17.4-ubuntu20.04 + securityContext: + privileged: true + volumeMounts: + - name: host-root + mountPath: /host + - name: containerd-config + mountPath: /etc/containerd + - name: containerd-socket + mountPath: /run/containerd/containerd.sock + +nameOverride: "" +fullnameOverride: "" diff --git a/thunder_deployment/provision/main.go b/thunder_deployment/provision/main.go new file mode 100644 index 000000000..79e587b5a --- /dev/null +++ b/thunder_deployment/provision/main.go @@ -0,0 +1,302 @@ +package main + +import ( + "errors" + "flag" + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" +) + +type nodeRole string +type runMode string + +const ( + roleMaster nodeRole = "master" + roleGPU nodeRole = "gpu" + roleCPU nodeRole = "cpu" + + modeCheck runMode = "check" + modeInstall runMode = "install" +) + +type options struct { + role nodeRole + mode runMode + host string + user string + keyPath string + remoteDir string + noCopy bool + k3sURL string + k3sToken string + k3sTLSSAN string + nodeName string + nodeIP string + flannelIface string + flannelBackend string + tailscaleAuthKey string + beamRegistry string + gpuType string + gpuCount string +} + +func main() { + opts := parseFlags() + if err := opts.validate(); err != nil { + fatal(err) + } + + root, err := deploymentRoot() + if err != nil { + fatal(err) + } + + if isLocal(opts.host) { + if err := runLocal(root, opts); err != nil { + fatal(err) + } + return + } + + if err := runRemote(root, opts); err != nil { + fatal(err) + } +} + +func parseFlags() options { + var opts options + flag.Var((*roleValue)(&opts.role), "role", "node role: master, gpu, or cpu") + flag.Var((*modeValue)(&opts.mode), "mode", "run mode: check or install") + flag.StringVar(&opts.host, "host", "local", "target host; use local, localhost, or 127.0.0.1 for this machine") + flag.StringVar(&opts.user, "user", os.Getenv("USER"), "ssh user for remote hosts") + flag.StringVar(&opts.keyPath, "key", "", "ssh private key for remote hosts") + flag.StringVar(&opts.remoteDir, "remote-dir", "/tmp/beam-deployment", "remote deployment directory") + flag.BoolVar(&opts.noCopy, "no-copy", false, "skip copying scripts and infra before running") + flag.StringVar(&opts.k3sURL, "k3s-url", os.Getenv("K3S_URL"), "k3s server URL for cpu/gpu workers, for example https://100.73.254.107:6443") + flag.StringVar(&opts.k3sToken, "k3s-token", os.Getenv("K3S_TOKEN"), "k3s node token for cpu/gpu workers") + flag.StringVar(&opts.k3sTLSSAN, "k3s-tls-san", os.Getenv("K3S_TLS_SAN"), "extra TLS SAN for the k3s server, usually the master Tailscale IP") + flag.StringVar(&opts.nodeName, "node-name", os.Getenv("K3S_NODE_NAME"), "Kubernetes node name to register") + flag.StringVar(&opts.nodeIP, "node-ip", os.Getenv("K3S_NODE_IP"), "Kubernetes node IP to advertise, usually this node's Tailscale IP") + flag.StringVar(&opts.flannelIface, "flannel-iface", os.Getenv("K3S_FLANNEL_IFACE"), "network interface for flannel traffic, for example tailscale0") + flag.StringVar(&opts.flannelBackend, "flannel-backend", os.Getenv("K3S_FLANNEL_BACKEND"), "server-side flannel backend, for example wireguard-native") + flag.StringVar(&opts.tailscaleAuthKey, "ts-authkey", os.Getenv("TS_AUTHKEY"), "optional Tailscale auth key for first-time login") + flag.StringVar(&opts.beamRegistry, "beam-registry", os.Getenv("BEAM_REGISTRY"), "optional registry prefix for image reachability checks") + flag.StringVar(&opts.gpuType, "gpu-type", os.Getenv("GPU_TYPE"), "GPU type label to apply on gpu nodes, default A6000") + flag.StringVar(&opts.gpuCount, "gpu-count", os.Getenv("GPU_COUNT"), "GPU count label and expected allocatable value on gpu nodes, default 8") + flag.Parse() + if opts.mode == "" { + opts.mode = modeCheck + } + return opts +} + +func (o options) validate() error { + switch o.role { + case roleMaster, roleGPU, roleCPU: + default: + return fmt.Errorf("unsupported role %q; expected master, gpu, or cpu", o.role) + } + switch o.mode { + case modeCheck, modeInstall: + default: + return fmt.Errorf("unsupported mode %q; expected check or install", o.mode) + } + if !isLocal(o.host) && strings.TrimSpace(o.user) == "" { + return errors.New("remote user is required") + } + if o.mode == modeInstall && (o.role == roleGPU || o.role == roleCPU) { + if strings.TrimSpace(o.k3sURL) == "" || strings.TrimSpace(o.k3sToken) == "" { + return errors.New("--k3s-url and --k3s-token are required when installing cpu/gpu worker nodes") + } + } + return nil +} + +func deploymentRoot() (string, error) { + exe, err := os.Executable() + if err == nil { + if root := findRoot(filepath.Dir(exe)); root != "" { + return root, nil + } + } + wd, err := os.Getwd() + if err != nil { + return "", err + } + if root := findRoot(wd); root != "" { + return root, nil + } + return "", errors.New("could not find deployment root containing scripts/run.sh") +} + +func findRoot(start string) string { + dir, _ := filepath.Abs(start) + for { + if fileExists(filepath.Join(dir, "scripts", "run.sh")) { + return dir + } + next := filepath.Dir(dir) + if next == dir { + return "" + } + dir = next + } +} + +func runLocal(root string, opts options) error { + script := filepath.Join(root, "scripts", "run.sh") + args := []string{"--role", string(opts.role), "--mode", string(opts.mode)} + return runCommandEnv("", opts.envPairs(), "bash", append([]string{script}, args...)...) +} + +func runRemote(root string, opts options) error { + target := opts.user + "@" + opts.host + if !opts.noCopy { + if err := runCommand("", "ssh", append(sshArgs(opts), target, "mkdir -p "+shellQuote(opts.remoteDir))...); err != nil { + return err + } + for _, name := range []string{"scripts", "infra"} { + src := filepath.Join(root, name) + if !dirExists(src) { + continue + } + dest := target + ":" + strings.TrimRight(opts.remoteDir, "/") + "/" + if err := runCommand("", "scp", append(scpArgs(opts), "-r", src, dest)...); err != nil { + return err + } + } + } + remoteScript := strings.TrimRight(opts.remoteDir, "/") + "/scripts/run.sh" + remoteCmd := fmt.Sprintf("%s bash %s --role %s --mode %s", opts.remoteEnvPrefix(), shellQuote(remoteScript), shellQuote(string(opts.role)), shellQuote(string(opts.mode))) + return runCommand("", "ssh", append(sshArgs(opts), target, strings.TrimSpace(remoteCmd))...) +} + +func (o options) remoteEnvPrefix() string { + return strings.Join(shellEnvAssignments(o.envPairs()), " ") +} + +func (o options) envPairs() []string { + values := map[string]string{ + "K3S_URL": o.k3sURL, + "K3S_TOKEN": o.k3sToken, + "K3S_TLS_SAN": o.k3sTLSSAN, + "K3S_NODE_NAME": o.nodeName, + "K3S_NODE_IP": o.nodeIP, + "K3S_FLANNEL_IFACE": o.flannelIface, + "K3S_FLANNEL_BACKEND": o.flannelBackend, + "TS_AUTHKEY": o.tailscaleAuthKey, + "BEAM_REGISTRY": o.beamRegistry, + "GPU_TYPE": o.gpuType, + "GPU_COUNT": o.gpuCount, + } + order := []string{"K3S_URL", "K3S_TOKEN", "K3S_TLS_SAN", "K3S_NODE_NAME", "K3S_NODE_IP", "K3S_FLANNEL_IFACE", "K3S_FLANNEL_BACKEND", "TS_AUTHKEY", "BEAM_REGISTRY", "GPU_TYPE", "GPU_COUNT"} + pairs := []string{} + for _, key := range order { + if strings.TrimSpace(values[key]) == "" { + continue + } + pairs = append(pairs, key+"="+values[key]) + } + return pairs +} + +func shellEnvAssignments(pairs []string) []string { + parts := []string{} + for _, pair := range pairs { + key, value, ok := strings.Cut(pair, "=") + if !ok || strings.TrimSpace(value) == "" { + continue + } + parts = append(parts, key+"="+shellQuote(value)) + } + return parts +} + +func sshArgs(opts options) []string { + args := []string{"-o", "StrictHostKeyChecking=accept-new"} + if opts.keyPath != "" { + args = append(args, "-i", expandHome(opts.keyPath)) + } + return args +} + +func scpArgs(opts options) []string { + args := []string{"-o", "StrictHostKeyChecking=accept-new"} + if opts.keyPath != "" { + args = append(args, "-i", expandHome(opts.keyPath)) + } + return args +} + +func runCommand(dir string, name string, args ...string) error { + return runCommandEnv(dir, nil, name, args...) +} + +func runCommandEnv(dir string, env []string, name string, args ...string) error { + cmd := exec.Command(name, args...) + cmd.Dir = dir + if len(env) > 0 { + cmd.Env = append(os.Environ(), env...) + } + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + cmd.Stdin = os.Stdin + return cmd.Run() +} + +func isLocal(host string) bool { + host = strings.TrimSpace(strings.ToLower(host)) + return host == "" || host == "local" || host == "localhost" || host == "127.0.0.1" || host == "0.0.0.0" || host == "::1" +} + +func fileExists(path string) bool { + info, err := os.Stat(path) + return err == nil && !info.IsDir() +} + +func dirExists(path string) bool { + info, err := os.Stat(path) + return err == nil && info.IsDir() +} + +func expandHome(path string) string { + if path == "~" { + if home, err := os.UserHomeDir(); err == nil { + return home + } + } + if strings.HasPrefix(path, "~/") { + if home, err := os.UserHomeDir(); err == nil { + return filepath.Join(home, strings.TrimPrefix(path, "~/")) + } + } + return path +} + +func shellQuote(s string) string { + return "'" + strings.ReplaceAll(s, "'", "'\\''") + "'" +} + +func fatal(err error) { + fmt.Fprintln(os.Stderr, "error:", err) + os.Exit(1) +} + +type roleValue nodeRole + +func (v *roleValue) String() string { return string(*v) } +func (v *roleValue) Set(s string) error { + *v = roleValue(strings.TrimSpace(strings.ToLower(s))) + return nil +} + +type modeValue runMode + +func (v *modeValue) String() string { return string(*v) } +func (v *modeValue) Set(s string) error { + *v = modeValue(strings.TrimSpace(strings.ToLower(s))) + return nil +} diff --git a/thunder_deployment/scripts/00-host-baseline.sh b/thunder_deployment/scripts/00-host-baseline.sh new file mode 100755 index 000000000..09b2a7b6a --- /dev/null +++ b/thunder_deployment/scripts/00-host-baseline.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +set -uo pipefail +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +. "$SCRIPT_DIR/common.sh" +parse_common_args "$@" + +record_fact role "$ROLE" +record_fact hostname "$(hostname -s)" +record_fact fqdn "$(hostname -f 2>/dev/null || hostname)" +record_fact kernel "$(uname -r)" +record_fact arch "$(uname -m)" + +if [ -r /etc/os-release ]; then + . /etc/os-release + record_fact os_id "${ID:-unknown}" + record_fact os_version "${VERSION_ID:-unknown}" + case "${ID:-}" in + ubuntu|debian) log_pass "supported OS family: ${ID:-unknown} ${VERSION_ID:-}" ;; + *) log_warn "untested OS family: ${ID:-unknown} ${VERSION_ID:-}" ;; + esac +else + log_warn "/etc/os-release not readable" +fi + +for cmd in bash sh awk sed grep cut sort uniq tr date hostname uname df free id; do + need_cmd "$cmd" || true +done + +for cmd in curl jq tar systemctl; do + if ! have_cmd "$cmd"; then + if require_install_mode "$cmd"; then + if have_cmd apt-get; then + run_sudo apt-get update + run_sudo apt-get install -y "$cmd" + else + log_fail "cannot install $cmd: apt-get not available" + fi + fi + else + log_pass "command available: $cmd" + fi +done + +root_avail_kb="$(df -Pk / | awk 'NR==2 {print $4}')" +record_fact root_available_kb "$root_avail_kb" +if [ "${root_avail_kb:-0}" -lt 10485760 ]; then + log_warn "root filesystem has less than 10GiB available" +else + log_pass "root filesystem free space is acceptable" +fi + +mem_mb="$(free -m | awk '/^Mem:/ {print $2}')" +record_fact memory_mb "${mem_mb:-0}" +if is_gpu && [ "${mem_mb:-0}" -lt 32768 ]; then + log_warn "GPU node has less than 32GiB RAM" +else + log_pass "memory check complete" +fi + +if timedatectl show -p NTPSynchronized --value >/tmp/beam-ntp 2>/dev/null; then + ntp="$(cat /tmp/beam-ntp)" + record_fact ntp_synchronized "$ntp" + [ "$ntp" = "yes" ] && log_pass "time synchronization enabled" || log_warn "time synchronization is not confirmed" +else + log_warn "timedatectl unavailable or not reporting NTP state" +fi + diff --git a/thunder_deployment/scripts/01-tailscale.sh b/thunder_deployment/scripts/01-tailscale.sh new file mode 100755 index 000000000..31b1226d9 --- /dev/null +++ b/thunder_deployment/scripts/01-tailscale.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +set -uo pipefail +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +. "$SCRIPT_DIR/common.sh" +parse_common_args "$@" + +if ! have_cmd tailscale; then + if require_install_mode "tailscale"; then + if have_cmd curl; then + curl -fsSL https://tailscale.com/install.sh | sh + else + log_fail "curl is required to install tailscale" + fi + fi +fi + +if ! have_cmd tailscale; then + log_fail "tailscale command is unavailable" + exit 1 +fi + +log_pass "tailscale command available" + +if systemctl is-active --quiet tailscaled 2>/dev/null; then + log_pass "tailscaled service is active" +else + if is_install; then + run_sudo systemctl enable --now tailscaled || log_fail "failed to start tailscaled" + else + log_fail "tailscaled service is not active" + fi +fi + +ip="$(tailscale ip -4 2>/dev/null | head -n1 || true)" +if [ -z "$ip" ] && is_install && [ -n "${TS_AUTHKEY:-}" ]; then + run_sudo tailscale up --auth-key "$TS_AUTHKEY" --ssh || log_fail "tailscale authentication failed" + ip="$(tailscale ip -4 2>/dev/null | head -n1 || true)" +fi + +if [ -n "$ip" ]; then + record_fact tailscale_ip "$ip" + log_pass "tailscale IPv4 detected: $ip" +else + log_warn "tailscale is installed but not authenticated or no IPv4 address is assigned" +fi + +status="$(tailscale status --json 2>/dev/null || true)" +if [ -n "$status" ] && have_cmd jq; then + dns="$(printf '%s' "$status" | jq -r '.Self.DNSName // empty')" + if [ -n "$dns" ]; then + record_fact tailscale_dns "$dns" + log_pass "tailscale DNS detected: $dns" + fi +fi + diff --git a/thunder_deployment/scripts/02-k3s-server.sh b/thunder_deployment/scripts/02-k3s-server.sh new file mode 100755 index 000000000..4670fad8a --- /dev/null +++ b/thunder_deployment/scripts/02-k3s-server.sh @@ -0,0 +1,129 @@ +#!/usr/bin/env bash +set -uo pipefail +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +. "$SCRIPT_DIR/common.sh" +parse_common_args "$@" +use_k3s_kubeconfig + +if ! is_master; then + log_skip "k3s server checks apply only to master nodes" + exit 0 +fi + +build_server_args() { + tls_san_args="" + if [ -n "${K3S_TLS_SAN:-}" ]; then + tls_san_args="--tls-san $K3S_TLS_SAN" + fi + + node_name_args="" + if [ -n "${K3S_NODE_NAME:-}" ]; then + node_name_args="--node-name $K3S_NODE_NAME" + fi + + network_args="" + if [ -n "${K3S_NODE_IP:-}" ]; then + network_args="$network_args --node-ip $K3S_NODE_IP" + fi + if [ -n "${K3S_FLANNEL_IFACE:-}" ]; then + network_args="$network_args --flannel-iface $K3S_FLANNEL_IFACE" + fi + if [ -n "${K3S_FLANNEL_BACKEND:-}" ]; then + network_args="$network_args --flannel-backend $K3S_FLANNEL_BACKEND" + fi + + SERVER_ARGS="server --write-kubeconfig-mode 0644 --node-label beta9.node-role=master $tls_san_args $node_name_args $network_args" +} + +install_or_reconcile_dropin() { + build_server_args + if [ -z "${K3S_NODE_IP:-}${K3S_FLANNEL_IFACE:-}${K3S_FLANNEL_BACKEND:-}${K3S_TLS_SAN:-}${K3S_NODE_NAME:-}" ]; then + return 0 + fi + + tmp="$(mktemp)" + { + printf '%s\n' '[Service]' + printf '%s\n' 'ExecStart=' + printf 'ExecStart=/usr/local/bin/k3s %s\n' "$SERVER_ARGS" + } > "$tmp" + + dropin_dir=/etc/systemd/system/k3s.service.d + dropin="$dropin_dir/10-beam-network.conf" + if ! run_sudo test -f "$dropin" || ! run_sudo cmp -s "$tmp" "$dropin"; then + run_sudo mkdir -p "$dropin_dir" + run_sudo cp "$tmp" "$dropin" + run_sudo systemctl daemon-reload + if systemctl is-active --quiet k3s 2>/dev/null; then + if [ "${K3S_FLANNEL_BACKEND:-}" = "wireguard-native" ] || [ "${K3S_FLANNEL_BACKEND:-}" = "wireguard" ]; then + run_sudo ip link delete flannel.1 2>/dev/null || true + iface="${K3S_FLANNEL_IFACE:-tailscale0}" + ip route show | awk -v iface="$iface" '$1 ~ /^10[.]42[.]/ && $0 ~ ("dev " iface) {print}' | while IFS= read -r route; do + [ -n "$route" ] && run_sudo ip route del $route 2>/dev/null || true + done + fi + run_sudo systemctl restart k3s + fi + log_pass "k3s server systemd drop-in reconciled" + else + log_pass "k3s server systemd drop-in already matches" + fi + rm -f "$tmp" +} + +if ! have_cmd k3s; then + if require_install_mode "k3s server"; then + build_server_args + curl -sfL https://get.k3s.io | sh -s - $SERVER_ARGS + fi +fi + +if is_install; then + install_or_reconcile_dropin +fi + +have_cmd k3s || { log_fail "k3s is not installed"; exit 1; } +log_pass "k3s command available" + +if systemctl is-active --quiet k3s 2>/dev/null; then + log_pass "k3s server service is active" +else + log_fail "k3s server service is not active" +fi + +if [ -r /etc/rancher/k3s/k3s.yaml ]; then + record_fact kubeconfig /etc/rancher/k3s/k3s.yaml + log_pass "k3s kubeconfig exists" +else + log_fail "missing /etc/rancher/k3s/k3s.yaml" +fi + +if run_sudo test -r /var/lib/rancher/k3s/server/node-token; then + record_fact k3s_node_token_path /var/lib/rancher/k3s/server/node-token + log_pass "k3s node token exists" +else + log_fail "missing k3s node token" +fi + +if have_cmd kubectl; then + if kubectl get nodes >/dev/null 2>&1; then + log_pass "kubectl can reach the cluster" + else + log_fail "kubectl cannot reach the cluster" + fi + + node="${K3S_NODE_NAME:-$(hostname -s)}" + if [ -n "${K3S_NODE_IP:-}" ]; then + internal_ip="$(kubectl get node "$node" -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}' 2>/dev/null || true)" + [ "$internal_ip" = "$K3S_NODE_IP" ] && log_pass "node advertises requested InternalIP: $K3S_NODE_IP" || log_warn "node InternalIP is ${internal_ip:-unknown}, expected $K3S_NODE_IP" + fi + if [ -n "${K3S_FLANNEL_BACKEND:-}" ]; then + backend="$(kubectl get node "$node" -o jsonpath='{.metadata.annotations.flannel\.alpha\.coreos\.com/backend-type}' 2>/dev/null || true)" + case "$K3S_FLANNEL_BACKEND:$backend" in + wireguard-native:wireguard|wireguard:wireguard|host-gw:host-gw|vxlan:vxlan) log_pass "flannel backend is $backend" ;; + *) log_warn "flannel backend is ${backend:-unknown}, expected $K3S_FLANNEL_BACKEND" ;; + esac + fi +else + log_warn "kubectl is not installed as a standalone command; k3s kubectl may still work" +fi diff --git a/thunder_deployment/scripts/03-k3s-agent.sh b/thunder_deployment/scripts/03-k3s-agent.sh new file mode 100755 index 000000000..aba044b6f --- /dev/null +++ b/thunder_deployment/scripts/03-k3s-agent.sh @@ -0,0 +1,137 @@ +#!/usr/bin/env bash +set -uo pipefail +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +. "$SCRIPT_DIR/common.sh" +parse_common_args "$@" + +if is_master; then + log_skip "k3s agent checks are skipped on master nodes" + exit 0 +fi + +build_agent_args() { + gpu_type="${GPU_TYPE:-A6000}" + gpu_count="${GPU_COUNT:-8}" + install_args="agent --node-label beta9.node-role=cpu" + if is_gpu; then + install_args="agent --node-label beta9.node-role=gpu --node-label beta9.gpu=true --node-label beta9.gpu-type=$gpu_type --node-label beta9.gpu-count=$gpu_count" + fi + if [ -n "${K3S_NODE_NAME:-}" ]; then + install_args="$install_args --node-name $K3S_NODE_NAME" + fi + if [ -n "${K3S_NODE_IP:-}" ]; then + install_args="$install_args --node-ip $K3S_NODE_IP" + fi + if [ -n "${K3S_FLANNEL_IFACE:-}" ]; then + install_args="$install_args --flannel-iface $K3S_FLANNEL_IFACE" + fi + AGENT_ARGS="$install_args" +} + +reconcile_agent_dropin() { + build_agent_args + if [ -z "${K3S_NODE_IP:-}${K3S_FLANNEL_IFACE:-}${K3S_NODE_NAME:-}${GPU_TYPE:-}${GPU_COUNT:-}" ]; then + return 0 + fi + + tmp="$(mktemp)" + { + printf '%s\n' '[Service]' + printf '%s\n' 'ExecStart=' + printf 'ExecStart=/usr/local/bin/k3s %s\n' "$AGENT_ARGS" + } > "$tmp" + + dropin_dir=/etc/systemd/system/k3s-agent.service.d + dropin="$dropin_dir/10-beam-network.conf" + if ! run_sudo test -f "$dropin" || ! run_sudo cmp -s "$tmp" "$dropin"; then + run_sudo mkdir -p "$dropin_dir" + run_sudo cp "$tmp" "$dropin" + run_sudo systemctl daemon-reload + if systemctl is-active --quiet k3s-agent 2>/dev/null; then + run_sudo systemctl restart k3s-agent + fi + log_pass "k3s agent systemd drop-in reconciled" + else + log_pass "k3s agent systemd drop-in already matches" + fi + rm -f "$tmp" +} + +cleanup_stale_cni_state() { + [ "$MODE" = "install" ] || return 0 + + if run_sudo test -d /etc/cni/net.d; then + stale="$(run_sudo find /etc/cni/net.d -maxdepth 1 -type f \( -name '*cilium*' -o -name '05-cilium.conflist' \) -print 2>/dev/null || true)" + if [ -n "$stale" ]; then + backup_dir="/etc/cni/net.d/beam-backup-$(date -u +%Y%m%d%H%M%S)" + run_sudo mkdir -p "$backup_dir" + printf '%s\n' "$stale" | while IFS= read -r file; do + [ -n "$file" ] && run_sudo mv "$file" "$backup_dir/" + done + log_pass "stale Cilium CNI configs moved to $backup_dir" + fi + fi + + flannel_conf=/var/lib/rancher/k3s/agent/etc/cni/net.d/10-flannel.conflist + if run_sudo test -f "$flannel_conf"; then + run_sudo mkdir -p /etc/cni/net.d + run_sudo cp "$flannel_conf" /etc/cni/net.d/10-flannel.conflist + log_pass "k3s flannel CNI config installed in /etc/cni/net.d" + fi + + cni_dir=/var/lib/rancher/k3s/data/cni + if run_sudo test -d "$cni_dir"; then + run_sudo mkdir -p /opt/cni/bin + for plugin in "$cni_dir"/*; do + [ -e "$plugin" ] || continue + name="$(basename "$plugin")" + if ! run_sudo test -e "/opt/cni/bin/$name"; then + run_sudo ln -s "$plugin" "/opt/cni/bin/$name" + fi + done + log_pass "k3s CNI plugin binaries are available under /opt/cni/bin" + fi + + if [ "${K3S_FLANNEL_BACKEND:-}" = "wireguard-native" ] || [ "${K3S_FLANNEL_BACKEND:-}" = "wireguard" ]; then + run_sudo ip link delete flannel.1 2>/dev/null || true + iface="${K3S_FLANNEL_IFACE:-tailscale0}" + ip route show | awk -v iface="$iface" '$1 ~ /^10[.]42[.]/ && $0 ~ ("dev " iface) {print}' | while IFS= read -r route; do + [ -n "$route" ] && run_sudo ip route del $route 2>/dev/null || true + done + log_pass "stale flannel vxlan/host-gw routes cleaned for wireguard backend" + fi +} + +if ! have_cmd k3s; then + if is_install; then + if [ -z "${K3S_URL:-}" ] || [ -z "${K3S_TOKEN:-}" ]; then + log_fail "K3S_URL and K3S_TOKEN are required to install/join k3s agent" + exit 1 + fi + + build_agent_args + curl -sfL https://get.k3s.io | K3S_URL="$K3S_URL" K3S_TOKEN="$K3S_TOKEN" sh -s - $AGENT_ARGS + else + log_fail "k3s agent is not installed" + exit 1 + fi +fi + +if is_install; then + cleanup_stale_cni_state + reconcile_agent_dropin +fi + +log_pass "k3s command available" + +if systemctl is-active --quiet k3s-agent 2>/dev/null; then + log_pass "k3s-agent service is active" +else + log_fail "k3s-agent service is not active" +fi + +if [ -f /etc/systemd/system/k3s-agent.service.env ]; then + log_pass "k3s agent environment file exists" +else + log_warn "k3s agent environment file was not found" +fi diff --git a/thunder_deployment/scripts/04-container-runtime.sh b/thunder_deployment/scripts/04-container-runtime.sh new file mode 100755 index 000000000..4176a9075 --- /dev/null +++ b/thunder_deployment/scripts/04-container-runtime.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +set -uo pipefail +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +. "$SCRIPT_DIR/common.sh" +parse_common_args "$@" + +if have_cmd crictl; then + log_pass "crictl command available" +else + log_warn "crictl not found; k3s may still include it under /var/lib/rancher/k3s/data" +fi + +if have_cmd docker; then + log_pass "docker command available" + if systemctl is-active --quiet docker 2>/dev/null; then + log_pass "docker service is active" + else + log_warn "docker command exists but service is not active" + fi +else + if is_gpu; then + log_warn "docker is not installed; required only for agent-backed worker-container mode, not local k3s pools" + else + log_skip "docker not required for role=$ROLE local k3s path" + fi +fi + +if [ -S /run/k3s/containerd/containerd.sock ] || [ -S /run/containerd/containerd.sock ]; then + log_pass "containerd socket detected" +else + log_warn "containerd socket not detected" +fi + +if is_gpu; then + if have_cmd nvidia-ctk; then + log_pass "nvidia-ctk command available" + else + log_warn "nvidia-ctk missing; NVIDIA container toolkit may be incomplete" + fi +else + log_skip "NVIDIA runtime checks are skipped for role=$ROLE" +fi + diff --git a/thunder_deployment/scripts/05-nvidia.sh b/thunder_deployment/scripts/05-nvidia.sh new file mode 100755 index 000000000..347b42d8b --- /dev/null +++ b/thunder_deployment/scripts/05-nvidia.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +set -uo pipefail +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +. "$SCRIPT_DIR/common.sh" +parse_common_args "$@" + +if ! is_gpu; then + log_skip "NVIDIA checks apply only to gpu nodes" + exit 0 +fi + +if ! have_cmd nvidia-smi; then + log_fail "nvidia-smi is missing; install NVIDIA driver before continuing" + exit 1 +fi + +log_pass "nvidia-smi command available" + +expected_gpu_count="${GPU_COUNT:-8}" +expected_gpu_type="${GPU_TYPE:-A6000}" +gpu_count="$(nvidia-smi -L 2>/dev/null | grep -c '^GPU ' || true)" +record_fact gpu_count "$gpu_count" +if [ "$gpu_count" -eq "$expected_gpu_count" ]; then + log_pass "detected $expected_gpu_count NVIDIA GPUs" +else + log_fail "expected $expected_gpu_count NVIDIA GPUs, detected $gpu_count" +fi + +if nvidia-smi -L | grep -qi "$expected_gpu_type"; then + record_fact gpu_type "$expected_gpu_type" + log_pass "detected $expected_gpu_type GPU model" +else + log_fail "$expected_gpu_type GPU model was not detected" +fi + +driver="$(nvidia-smi --query-gpu=driver_version --format=csv,noheader 2>/dev/null | head -n1 || true)" +record_fact nvidia_driver_version "$driver" +[ -n "$driver" ] && log_pass "NVIDIA driver version: $driver" || log_warn "could not determine NVIDIA driver version" + +if have_cmd docker; then + if docker info >/dev/null 2>&1; then + log_pass "docker daemon is reachable" + if docker run --rm --gpus all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi >/tmp/beam-docker-nvidia-smi.out 2>/tmp/beam-docker-nvidia-smi.err; then + log_pass "docker GPU smoke test passed" + else + log_warn "docker GPU smoke test failed; local k3s GPU scheduling can still work if containerd is configured" + fi + else + log_warn "docker exists but daemon is not reachable" + fi +else + log_skip "docker GPU smoke test skipped because docker is unavailable" +fi + diff --git a/thunder_deployment/scripts/06-k8s-gpu-device-plugin.sh b/thunder_deployment/scripts/06-k8s-gpu-device-plugin.sh new file mode 100755 index 000000000..2699b37d3 --- /dev/null +++ b/thunder_deployment/scripts/06-k8s-gpu-device-plugin.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +set -uo pipefail +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +. "$SCRIPT_DIR/common.sh" +parse_common_args "$@" +use_k3s_kubeconfig + +if is_cpu; then + log_skip "Kubernetes GPU device plugin checks skipped on cpu nodes" + exit 0 +fi + +if is_gpu; then + if have_cmd kubectl; then + node="${K3S_NODE_NAME:-$(hostname -s)}" + alloc="$(kubectl get node "$node" -o jsonpath='{.status.allocatable.nvidia\.com/gpu}' 2>/dev/null || true)" + expected_gpu_count="${GPU_COUNT:-8}" + if [ "$alloc" = "$expected_gpu_count" ]; then + log_pass "node advertises nvidia.com/gpu=$expected_gpu_count" + elif [ -n "$alloc" ]; then + log_fail "node advertises nvidia.com/gpu=$alloc, expected $expected_gpu_count" + else + log_warn "could not read this node's GPU allocatable value; run this check from a kubeconfig-capable host or verify from master" + fi + else + log_skip "kubectl unavailable on gpu node; master-side verification required" + fi + exit 0 +fi + +if is_master; then + if ! have_cmd kubectl; then + log_fail "kubectl is required on master to verify/install the NVIDIA runtime chart" + exit 1 + fi + + if kubectl get runtimeclass nvidia >/dev/null 2>&1; then + log_pass "nvidia RuntimeClass is installed" + else + log_warn "nvidia RuntimeClass is not installed" + fi + + if kubectl -n kube-system get ds nvidia-device-plugin-daemonset >/dev/null 2>&1; then + log_pass "NVIDIA device plugin daemonset is installed" + else + log_warn "NVIDIA device plugin daemonset is not installed" + fi + + if kubectl -n kube-system get ds nvidia-ctk-installer >/dev/null 2>&1; then + log_pass "NVIDIA container toolkit installer daemonset is installed" + else + log_warn "NVIDIA container toolkit installer daemonset is not installed" + fi + + if is_install; then + if ! have_cmd helm; then + log_fail "helm is required to install infra/nvidia-runtimeclass" + exit 1 + fi + + chart_dir="$(cd "$SCRIPT_DIR/.." && pwd)/infra/nvidia-runtimeclass" + if ! helm -n kube-system status nvidia-runtimeclass >/dev/null 2>&1 \ + && kubectl get runtimeclass nvidia >/dev/null 2>&1; then + kubectl delete runtimeclass nvidia || { log_fail "failed to remove unmanaged nvidia RuntimeClass"; exit 1; } + fi + helm upgrade --install nvidia-runtimeclass "$chart_dir" \ + --namespace kube-system \ + --create-namespace || { log_fail "failed to install NVIDIA runtime chart"; exit 1; } + fi +fi + diff --git a/thunder_deployment/scripts/07-registry-access.sh b/thunder_deployment/scripts/07-registry-access.sh new file mode 100755 index 000000000..520d5d6bc --- /dev/null +++ b/thunder_deployment/scripts/07-registry-access.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +set -uo pipefail +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +. "$SCRIPT_DIR/common.sh" +parse_common_args "$@" + +registry="${BEAM_REGISTRY:-}" +if [ -z "$registry" ]; then + log_warn "BEAM_REGISTRY is not set; skipping registry pull checks" + exit 0 +fi + +record_fact beam_registry "$registry" + +if have_cmd docker && docker info >/dev/null 2>&1; then + image="$registry/beta9-worker:latest" + if is_master; then + image="$registry/beta9-gateway:latest" + fi + if docker manifest inspect "$image" >/dev/null 2>&1 || docker pull "$image" >/dev/null 2>&1; then + log_pass "registry image reachable: $image" + else + log_warn "could not verify registry image: $image" + fi +else + log_skip "docker unavailable; registry checks should be performed through Kubernetes image pulls" +fi + diff --git a/thunder_deployment/scripts/08-beta9-readiness.sh b/thunder_deployment/scripts/08-beta9-readiness.sh new file mode 100755 index 000000000..b1262360a --- /dev/null +++ b/thunder_deployment/scripts/08-beta9-readiness.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +set -uo pipefail +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +. "$SCRIPT_DIR/common.sh" +parse_common_args "$@" +use_k3s_kubeconfig + +if ! is_master; then + log_skip "Beta9 cluster readiness checks are master-side only" + exit 0 +fi + +if ! have_cmd kubectl; then + log_fail "kubectl is required for Beta9 readiness checks" + exit 1 +fi + +if is_install; then + if ! have_cmd helm; then + log_fail "helm is required to install infra/beta9" + exit 1 + fi + + chart_dir="$(cd "$SCRIPT_DIR/.." && pwd)/infra/beta9" + helm repo add bjw-s-labs https://bjw-s-labs.github.io/helm-charts --force-update >/dev/null \ + || { log_fail "failed to configure bjw-s-labs Helm repo"; exit 1; } + helm repo add bitnami https://charts.bitnami.com/bitnami --force-update >/dev/null \ + || { log_fail "failed to configure bitnami Helm repo"; exit 1; } + helm repo add grafana https://grafana.github.io/helm-charts --force-update >/dev/null \ + || { log_fail "failed to configure grafana Helm repo"; exit 1; } + helm repo add victoria-metrics https://victoriametrics.github.io/helm-charts --force-update >/dev/null \ + || { log_fail "failed to configure victoria-metrics Helm repo"; exit 1; } + helm repo update || { log_fail "failed to update Helm repos"; exit 1; } + helm dependency build "$chart_dir" || { log_fail "failed to build Beta9 chart dependencies"; exit 1; } + helm upgrade --install beta9 "$chart_dir" \ + --namespace beta9 \ + --create-namespace \ + --wait \ + --timeout 15m || { log_fail "failed to install Beta9 chart"; exit 1; } +fi + +if kubectl get namespace beta9 >/dev/null 2>&1; then + log_pass "beta9 namespace exists" +else + log_warn "beta9 namespace does not exist yet" + exit 0 +fi + +if kubectl -n beta9 get deploy beta9-gateway >/dev/null 2>&1; then + available="$(kubectl -n beta9 get deploy beta9-gateway -o jsonpath='{.status.availableReplicas}' 2>/dev/null || true)" + if [ "${available:-0}" -ge 1 ]; then + log_pass "beta9 gateway deployment has an available replica" + else + log_fail "beta9 gateway deployment is not available" + fi +else + log_warn "beta9 gateway deployment not found" +fi + +kubectl -n beta9 get secret beta9-config-helm >/dev/null 2>&1 \ + && log_pass "beta9 Helm config secret exists" \ + || log_warn "beta9 Helm config secret not found" + +kubectl -n beta9 get pods >/tmp/beam-beta9-pods.txt 2>/dev/null && log_pass "listed beta9 pods" || log_warn "could not list beta9 pods" + diff --git a/thunder_deployment/scripts/common.sh b/thunder_deployment/scripts/common.sh new file mode 100755 index 000000000..5ad245b4d --- /dev/null +++ b/thunder_deployment/scripts/common.sh @@ -0,0 +1,164 @@ +#!/usr/bin/env bash +set -uo pipefail + +ROLE="" +MODE="check" +VERBOSE=0 +FAILURES=0 +WARNINGS=0 +FACT_DIR="${FACT_DIR:-/tmp/beam-deployment-state}" +FACT_FILE="" + +usage_common() { + cat <<'EOF' +Usage: run.sh --role master|gpu|cpu [--mode check|install] [--verbose] + +Modes: + check Verify prerequisites only. This is the default. + install Install or configure missing prerequisites where the script supports it. +EOF +} + +parse_common_args() { + while [ "$#" -gt 0 ]; do + case "$1" in + --role) + ROLE="${2:-}" + shift 2 + ;; + --mode) + MODE="${2:-}" + shift 2 + ;; + --check) + MODE="check" + shift + ;; + --install) + MODE="install" + shift + ;; + --verbose|-v) + VERBOSE=1 + shift + ;; + --help|-h) + usage_common + exit 0 + ;; + *) + log_fail "unknown argument: $1" + usage_common + exit 2 + ;; + esac + done + + case "$ROLE" in + master|gpu|cpu) ;; + "") + log_fail "--role is required" + exit 2 + ;; + *) + log_fail "unsupported role: $ROLE" + exit 2 + ;; + esac + + case "$MODE" in + check|install) ;; + *) + log_fail "unsupported mode: $MODE" + exit 2 + ;; + esac + + mkdir -p "$FACT_DIR" + FACT_FILE="$FACT_DIR/$(hostname -s).facts.env" +} + +init_fact_file() { + mkdir -p "$FACT_DIR" + : > "$FACT_FILE" +} + +ts() { + date -u +"%Y-%m-%dT%H:%M:%SZ" +} + +log() { + printf '%s [%s] %s\n' "$(ts)" "$1" "$2" +} + +log_info() { log INFO "$*"; } +log_pass() { log PASS "$*"; } +log_skip() { log SKIP "$*"; } +log_warn() { WARNINGS=$((WARNINGS + 1)); log WARN "$*"; } +log_fail() { FAILURES=$((FAILURES + 1)); log FAIL "$*"; } + +debug() { + if [ "$VERBOSE" -eq 1 ]; then + log DEBUG "$*" + fi +} + +have_cmd() { + command -v "$1" >/dev/null 2>&1 +} + +need_cmd() { + if have_cmd "$1"; then + log_pass "command available: $1" + return 0 + fi + log_fail "missing command: $1" + return 1 +} + +run_sudo() { + if [ "$(id -u)" -eq 0 ]; then + "$@" + else + sudo "$@" + fi +} + +is_master() { [ "$ROLE" = "master" ]; } +is_gpu() { [ "$ROLE" = "gpu" ]; } +is_cpu() { [ "$ROLE" = "cpu" ]; } +is_install() { [ "$MODE" = "install" ]; } + +require_install_mode() { + if ! is_install; then + log_warn "$1 missing; rerun with --mode install to let scripts attempt installation" + return 1 + fi + return 0 +} + +use_k3s_kubeconfig() { + if [ -z "${KUBECONFIG:-}" ] && [ -r /etc/rancher/k3s/k3s.yaml ]; then + export KUBECONFIG=/etc/rancher/k3s/k3s.yaml + debug "using KUBECONFIG=$KUBECONFIG" + fi +} + +record_fact() { + key="$1" + value="$2" + printf '%s=%q\n' "$key" "$value" >> "$FACT_FILE" +} + +summary_and_exit() { + log_info "facts written to $FACT_FILE" + if [ "$WARNINGS" -gt 0 ]; then + log_warn "warnings: $WARNINGS" + fi + if [ "$FAILURES" -gt 0 ]; then + log_fail "failed checks: $FAILURES" + exit 1 + fi + log_pass "all required checks passed" +} + diff --git a/thunder_deployment/scripts/run.sh b/thunder_deployment/scripts/run.sh new file mode 100755 index 000000000..0cb4e88ce --- /dev/null +++ b/thunder_deployment/scripts/run.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +set -uo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +. "$SCRIPT_DIR/common.sh" + +parse_common_args "$@" +init_fact_file + +log_info "starting beam node preflight role=$ROLE mode=$MODE host=$(hostname -f 2>/dev/null || hostname)" + +checks=( + "00-host-baseline.sh" + "01-tailscale.sh" + "02-k3s-server.sh" + "03-k3s-agent.sh" + "04-container-runtime.sh" + "05-nvidia.sh" + "06-k8s-gpu-device-plugin.sh" + "07-registry-access.sh" + "08-beta9-readiness.sh" +) + +for check in "${checks[@]}"; do + path="$SCRIPT_DIR/$check" + if [ ! -x "$path" ]; then + log_fail "script is missing or not executable: $path" + continue + fi + log_info "running $check" + "$path" --role "$ROLE" --mode "$MODE" + status=$? + if [ "$status" -ne 0 ]; then + log_fail "$check failed with exit code $status" + fi +done + +summary_and_exit + From cfc87183d92f6bee88eff734c10264a9a6d48307 Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Fri, 17 Jul 2026 16:56:22 +0000 Subject: [PATCH 04/26] removed helm --- .gitignore | 14 - pkg/worker/thunder.go | 24 +- pkg/worker/thunder_test.go | 15 +- thunder_deployment/README.md | 118 - .../client_workload/.beamignore | 28 - thunder_deployment/client_workload/beam.py | 1 - .../client_workload/client_setup.py | 71 - thunder_deployment/client_workload/main.py | 60 - .../client_workload/requirements.txt | 49 - thunder_deployment/go.mod | 3 - thunder_deployment/infra/beta9/.helmignore | 23 - thunder_deployment/infra/beta9/Chart.lock | 27 - thunder_deployment/infra/beta9/Chart.yaml | 41 - .../charts/beam-blobcache-chart/.helmignore | 23 - .../charts/beam-blobcache-chart/Chart.lock | 6 - .../charts/beam-blobcache-chart/Chart.yaml | 11 - .../charts/common/.helmignore | 28 - .../charts/common/Chart.yaml | 33 - .../charts/common/README.md | 234 -- .../common/templates/classes/_configmap.tpl | 32 - .../common/templates/classes/_cronjob.tpl | 61 - .../common/templates/classes/_daemonset.tpl | 40 - .../common/templates/classes/_deployment.tpl | 60 - .../common/templates/classes/_ingress.tpl | 85 - .../charts/common/templates/classes/_job.tpl | 46 - .../templates/classes/_networkpolicy.tpl | 49 - .../charts/common/templates/classes/_pvc.tpl | 53 - .../common/templates/classes/_route.tpl | 86 - .../common/templates/classes/_secret.tpl | 39 - .../common/templates/classes/_service.tpl | 104 - .../templates/classes/_serviceAccount.tpl | 30 - .../templates/classes/_serviceMonitor.tpl | 37 - .../common/templates/classes/_statefulset.tpl | 56 - .../lib/chart/_getMapItemsWithKey.tpl | 17 - .../common/templates/lib/chart/_kahn.tpl | 35 - .../common/templates/lib/chart/_names.tpl | 35 - .../lib/configMap/_getByIdentifier.tpl | 12 - .../templates/lib/configMap/_validate.tpl | 7 - .../lib/configMap/_valuesToObject.tpl | 24 - .../common/templates/lib/container/_spec.tpl | 54 - .../templates/lib/container/_validate.tpl | 20 - .../lib/container/_valuesToObject.tpl | 27 - .../templates/lib/container/fields/_args.tpl | 26 - .../lib/container/fields/_command.tpl | 26 - .../templates/lib/container/fields/_env.tpl | 82 - .../lib/container/fields/_envFrom.tpl | 58 - .../templates/lib/container/fields/_image.tpl | 15 - .../templates/lib/container/fields/_name.tpl | 24 - .../lib/container/fields/_probes.tpl | 83 - .../lib/container/fields/_volumeMounts.tpl | 115 - .../lib/controller/_enabled_containers.tpl | 24 - .../templates/lib/controller/_metadata.tpl | 25 - .../templates/lib/controller/_validate.tpl | 18 - .../lib/controller/_valuesToObject.tpl | 41 - .../templates/lib/cronjob/_validate.tpl | 11 - .../templates/lib/cronjob/_valuesToObject.tpl | 18 - .../templates/lib/daemonset/_validate.tpl | 7 - .../lib/daemonset/_valuesToObject.tpl | 11 - .../templates/lib/deployment/_validate.tpl | 11 - .../lib/deployment/_valuesToObject.tpl | 14 - .../common/templates/lib/ingress/_primary.tpl | 21 - .../templates/lib/ingress/_validate.tpl | 15 - .../templates/lib/ingress/_valuesToObject.tpl | 24 - .../common/templates/lib/job/_validate.tpl | 12 - .../templates/lib/job/_valuesToObject.tpl | 14 - .../templates/lib/metadata/_allLabels.tpl | 10 - .../lib/metadata/_globalAnnotations.tpl | 10 - .../templates/lib/metadata/_globalLabels.tpl | 9 - .../lib/metadata/_selectorLabels.tpl | 5 - .../templates/lib/networkpolicy/_validate.tpl | 22 - .../lib/networkpolicy/_valuesToObject.tpl | 24 - .../common/templates/lib/pod/_getOption.tpl | 34 - .../charts/common/templates/lib/pod/_spec.tpl | 67 - .../templates/lib/pod/fields/_containers.tpl | 71 - .../templates/lib/pod/fields/_dnsPolicy.tpl | 25 - .../lib/pod/fields/_initContainers.tpl | 78 - .../lib/pod/fields/_serviceAccountName.tpl | 11 - .../templates/lib/pod/fields/_volumes.tpl | 125 - .../lib/pod/metadata/_annotations.tpl | 56 - .../templates/lib/pod/metadata/_labels.tpl | 36 - .../common/templates/lib/pvc/_validate.tpl | 7 - .../templates/lib/pvc/_valuesToObject.tpl | 24 - .../common/templates/lib/routes/_primary.tpl | 21 - .../common/templates/lib/routes/_validate.tpl | 25 - .../templates/lib/routes/_valuesToObject.tpl | 24 - .../templates/lib/secret/_getByIdentifier.tpl | 12 - .../common/templates/lib/secret/_validate.tpl | 7 - .../templates/lib/secret/_valuesToObject.tpl | 24 - .../templates/lib/service/_enabled_ports.tpl | 22 - .../lib/service/_enabled_services.tpl | 23 - .../lib/service/_getByIdentifier.tpl | 13 - .../lib/service/_getPortNumberByName.tpl | 17 - .../lib/service/_primaryForController.tpl | 30 - .../templates/lib/service/_primary_port.tpl | 25 - .../templates/lib/service/_validate.tpl | 37 - .../templates/lib/service/_valuesToObject.tpl | 24 - .../lib/serviceAccount/_validate.tpl | 7 - .../lib/serviceAccount/_valuesToObject.tpl | 23 - .../lib/serviceMonitor/_validate.tpl | 11 - .../lib/serviceMonitor/_valuesToObject.tpl | 24 - .../templates/lib/statefulset/_validate.tpl | 23 - .../lib/statefulset/_valuesToObject.tpl | 14 - .../lib/statefulset/_volumeClaimTemplates.tpl | 51 - .../charts/common/templates/loader/_all.tpl | 10 - .../common/templates/loader/_generate.tpl | 16 - .../charts/common/templates/loader/_init.tpl | 4 - .../common/templates/render/_configmaps.tpl | 26 - .../common/templates/render/_controllers.tpl | 45 - .../common/templates/render/_ingresses.tpl | 26 - .../templates/render/_networkpolicies.tpl | 26 - .../charts/common/templates/render/_pvcs.tpl | 26 - .../common/templates/render/_routes.tpl | 24 - .../common/templates/render/_secrets.tpl | 26 - .../templates/render/_serviceMonitors.tpl | 26 - .../templates/render/_serviceaccount.tpl | 20 - .../common/templates/render/_services.tpl | 19 - .../charts/common/templates/values/_init.tpl | 11 - .../charts/common/values.yaml | 740 ------ .../templates/_helpers.tpl | 23 - .../templates/common.yaml | 6 - .../charts/beam-blobcache-chart/values.yaml | 60 - .../infra/beta9/charts/common/.helmignore | 28 - .../infra/beta9/charts/common/Chart.yaml | 33 - .../infra/beta9/charts/common/README.md | 234 -- .../common/templates/classes/_configmap.tpl | 32 - .../common/templates/classes/_cronjob.tpl | 61 - .../common/templates/classes/_daemonset.tpl | 40 - .../common/templates/classes/_deployment.tpl | 60 - .../common/templates/classes/_ingress.tpl | 85 - .../charts/common/templates/classes/_job.tpl | 46 - .../templates/classes/_networkpolicy.tpl | 49 - .../charts/common/templates/classes/_pvc.tpl | 53 - .../common/templates/classes/_route.tpl | 86 - .../common/templates/classes/_secret.tpl | 39 - .../common/templates/classes/_service.tpl | 104 - .../templates/classes/_serviceAccount.tpl | 30 - .../templates/classes/_serviceMonitor.tpl | 37 - .../common/templates/classes/_statefulset.tpl | 56 - .../lib/chart/_getMapItemsWithKey.tpl | 17 - .../common/templates/lib/chart/_kahn.tpl | 35 - .../common/templates/lib/chart/_names.tpl | 35 - .../lib/configMap/_getByIdentifier.tpl | 12 - .../templates/lib/configMap/_validate.tpl | 7 - .../lib/configMap/_valuesToObject.tpl | 24 - .../common/templates/lib/container/_spec.tpl | 54 - .../templates/lib/container/_validate.tpl | 20 - .../lib/container/_valuesToObject.tpl | 27 - .../templates/lib/container/fields/_args.tpl | 26 - .../lib/container/fields/_command.tpl | 26 - .../templates/lib/container/fields/_env.tpl | 82 - .../lib/container/fields/_envFrom.tpl | 58 - .../templates/lib/container/fields/_image.tpl | 15 - .../templates/lib/container/fields/_name.tpl | 24 - .../lib/container/fields/_probes.tpl | 83 - .../lib/container/fields/_volumeMounts.tpl | 115 - .../lib/controller/_enabled_containers.tpl | 24 - .../templates/lib/controller/_metadata.tpl | 25 - .../templates/lib/controller/_validate.tpl | 18 - .../lib/controller/_valuesToObject.tpl | 41 - .../templates/lib/cronjob/_validate.tpl | 11 - .../templates/lib/cronjob/_valuesToObject.tpl | 18 - .../templates/lib/daemonset/_validate.tpl | 7 - .../lib/daemonset/_valuesToObject.tpl | 11 - .../templates/lib/deployment/_validate.tpl | 11 - .../lib/deployment/_valuesToObject.tpl | 14 - .../common/templates/lib/ingress/_primary.tpl | 21 - .../templates/lib/ingress/_validate.tpl | 15 - .../templates/lib/ingress/_valuesToObject.tpl | 24 - .../common/templates/lib/job/_validate.tpl | 12 - .../templates/lib/job/_valuesToObject.tpl | 14 - .../templates/lib/metadata/_allLabels.tpl | 10 - .../lib/metadata/_globalAnnotations.tpl | 10 - .../templates/lib/metadata/_globalLabels.tpl | 9 - .../lib/metadata/_selectorLabels.tpl | 5 - .../templates/lib/networkpolicy/_validate.tpl | 22 - .../lib/networkpolicy/_valuesToObject.tpl | 24 - .../common/templates/lib/pod/_getOption.tpl | 34 - .../charts/common/templates/lib/pod/_spec.tpl | 67 - .../templates/lib/pod/fields/_containers.tpl | 71 - .../templates/lib/pod/fields/_dnsPolicy.tpl | 25 - .../lib/pod/fields/_initContainers.tpl | 78 - .../lib/pod/fields/_serviceAccountName.tpl | 11 - .../templates/lib/pod/fields/_volumes.tpl | 125 - .../lib/pod/metadata/_annotations.tpl | 56 - .../templates/lib/pod/metadata/_labels.tpl | 36 - .../common/templates/lib/pvc/_validate.tpl | 7 - .../templates/lib/pvc/_valuesToObject.tpl | 24 - .../common/templates/lib/routes/_primary.tpl | 21 - .../common/templates/lib/routes/_validate.tpl | 25 - .../templates/lib/routes/_valuesToObject.tpl | 24 - .../templates/lib/secret/_getByIdentifier.tpl | 12 - .../common/templates/lib/secret/_validate.tpl | 7 - .../templates/lib/secret/_valuesToObject.tpl | 24 - .../templates/lib/service/_enabled_ports.tpl | 22 - .../lib/service/_enabled_services.tpl | 23 - .../lib/service/_getByIdentifier.tpl | 13 - .../lib/service/_getPortNumberByName.tpl | 17 - .../lib/service/_primaryForController.tpl | 30 - .../templates/lib/service/_primary_port.tpl | 25 - .../templates/lib/service/_validate.tpl | 37 - .../templates/lib/service/_valuesToObject.tpl | 24 - .../lib/serviceAccount/_validate.tpl | 7 - .../lib/serviceAccount/_valuesToObject.tpl | 23 - .../lib/serviceMonitor/_validate.tpl | 11 - .../lib/serviceMonitor/_valuesToObject.tpl | 24 - .../templates/lib/statefulset/_validate.tpl | 23 - .../lib/statefulset/_valuesToObject.tpl | 14 - .../lib/statefulset/_volumeClaimTemplates.tpl | 51 - .../charts/common/templates/loader/_all.tpl | 10 - .../common/templates/loader/_generate.tpl | 16 - .../charts/common/templates/loader/_init.tpl | 4 - .../common/templates/render/_configmaps.tpl | 26 - .../common/templates/render/_controllers.tpl | 45 - .../common/templates/render/_ingresses.tpl | 26 - .../templates/render/_networkpolicies.tpl | 26 - .../charts/common/templates/render/_pvcs.tpl | 26 - .../common/templates/render/_routes.tpl | 24 - .../common/templates/render/_secrets.tpl | 26 - .../templates/render/_serviceMonitors.tpl | 26 - .../templates/render/_serviceaccount.tpl | 20 - .../common/templates/render/_services.tpl | 19 - .../charts/common/templates/values/_init.tpl | 11 - .../infra/beta9/charts/common/values.yaml | 740 ------ .../infra/beta9/charts/grafana/.helmignore | 23 - .../infra/beta9/charts/grafana/Chart.yaml | 33 - .../infra/beta9/charts/grafana/README.md | 769 ------- .../charts/grafana/ci/default-values.yaml | 1 - .../grafana/ci/with-affinity-values.yaml | 16 - .../ci/with-dashboard-json-values.yaml | 53 - .../grafana/ci/with-dashboard-values.yaml | 19 - .../ci/with-extraconfigmapmounts-values.yaml | 7 - .../ci/with-image-renderer-values.yaml | 19 - .../charts/grafana/ci/with-persistence.yaml | 3 - .../grafana/dashboards/custom-dashboard.json | 1 - .../beta9/charts/grafana/templates/NOTES.txt | 55 - .../charts/grafana/templates/_config.tpl | 171 -- .../charts/grafana/templates/_helpers.tpl | 278 --- .../beta9/charts/grafana/templates/_pod.tpl | 1296 ----------- .../charts/grafana/templates/clusterrole.yaml | 25 - .../grafana/templates/clusterrolebinding.yaml | 24 - .../grafana/templates/configSecret.yaml | 43 - .../configmap-dashboard-provider.yaml | 15 - .../charts/grafana/templates/configmap.yaml | 15 - .../templates/dashboards-json-configmap.yaml | 38 - .../charts/grafana/templates/deployment.yaml | 53 - .../grafana/templates/extra-manifests.yaml | 4 - .../grafana/templates/headless-service.yaml | 22 - .../beta9/charts/grafana/templates/hpa.yaml | 52 - .../templates/image-renderer-deployment.yaml | 131 -- .../grafana/templates/image-renderer-hpa.yaml | 47 - .../image-renderer-network-policy.yaml | 79 - .../templates/image-renderer-service.yaml | 31 - .../image-renderer-servicemonitor.yaml | 48 - .../charts/grafana/templates/ingress.yaml | 78 - .../grafana/templates/networkpolicy.yaml | 61 - .../templates/poddisruptionbudget.yaml | 22 - .../grafana/templates/podsecuritypolicy.yaml | 49 - .../beta9/charts/grafana/templates/pvc.yaml | 36 - .../beta9/charts/grafana/templates/role.yaml | 32 - .../charts/grafana/templates/rolebinding.yaml | 25 - .../charts/grafana/templates/secret-env.yaml | 14 - .../charts/grafana/templates/secret.yaml | 16 - .../charts/grafana/templates/service.yaml | 61 - .../grafana/templates/serviceaccount.yaml | 17 - .../grafana/templates/servicemonitor.yaml | 52 - .../charts/grafana/templates/statefulset.yaml | 56 - .../templates/tests/test-configmap.yaml | 20 - .../tests/test-podsecuritypolicy.yaml | 32 - .../grafana/templates/tests/test-role.yaml | 17 - .../templates/tests/test-rolebinding.yaml | 20 - .../templates/tests/test-serviceaccount.yaml | 12 - .../charts/grafana/templates/tests/test.yaml | 49 - .../infra/beta9/charts/grafana/values.yaml | 1315 ----------- .../infra/beta9/charts/postgresql/.helmignore | 23 - .../infra/beta9/charts/postgresql/Chart.lock | 6 - .../infra/beta9/charts/postgresql/Chart.yaml | 37 - .../infra/beta9/charts/postgresql/README.md | 998 -------- .../postgresql/charts/common/.helmignore | 22 - .../postgresql/charts/common/Chart.yaml | 23 - .../charts/postgresql/charts/common/README.md | 235 -- .../charts/common/templates/_affinities.tpl | 139 -- .../charts/common/templates/_capabilities.tpl | 229 -- .../charts/common/templates/_errors.tpl | 28 - .../charts/common/templates/_images.tpl | 117 - .../charts/common/templates/_ingress.tpl | 73 - .../charts/common/templates/_labels.tpl | 46 - .../charts/common/templates/_names.tpl | 71 - .../charts/common/templates/_secrets.tpl | 182 -- .../charts/common/templates/_storage.tpl | 28 - .../charts/common/templates/_tplvalues.tpl | 38 - .../charts/common/templates/_utils.tpl | 77 - .../charts/common/templates/_warnings.tpl | 19 - .../templates/validations/_cassandra.tpl | 77 - .../common/templates/validations/_mariadb.tpl | 108 - .../common/templates/validations/_mongodb.tpl | 113 - .../common/templates/validations/_mysql.tpl | 108 - .../templates/validations/_postgresql.tpl | 134 -- .../common/templates/validations/_redis.tpl | 81 - .../templates/validations/_validations.tpl | 51 - .../postgresql/charts/common/values.yaml | 8 - .../charts/postgresql/templates/NOTES.txt | 115 - .../charts/postgresql/templates/_helpers.tpl | 406 ---- .../postgresql/templates/backup/cronjob.yaml | 114 - .../postgresql/templates/backup/pvc.yaml | 34 - .../postgresql/templates/extra-list.yaml | 9 - .../templates/networkpolicy-egress.yaml | 34 - .../templates/primary/configmap.yaml | 26 - .../templates/primary/extended-configmap.yaml | 20 - .../primary/initialization-configmap.yaml | 17 - .../templates/primary/metrics-configmap.yaml | 18 - .../templates/primary/metrics-svc.yaml | 31 - .../templates/primary/networkpolicy.yaml | 61 - .../templates/primary/servicemonitor.yaml | 46 - .../templates/primary/statefulset.yaml | 662 ------ .../templates/primary/svc-headless.yaml | 36 - .../postgresql/templates/primary/svc.yaml | 51 - .../postgresql/templates/prometheusrule.yaml | 22 - .../charts/postgresql/templates/psp.yaml | 42 - .../templates/read/extended-configmap.yaml | 20 - .../templates/read/metrics-configmap.yaml | 18 - .../templates/read/metrics-svc.yaml | 31 - .../templates/read/networkpolicy.yaml | 39 - .../templates/read/servicemonitor.yaml | 46 - .../templates/read/statefulset.yaml | 553 ----- .../templates/read/svc-headless.yaml | 38 - .../charts/postgresql/templates/read/svc.yaml | 53 - .../charts/postgresql/templates/role.yaml | 32 - .../postgresql/templates/rolebinding.yaml | 24 - .../charts/postgresql/templates/secrets.yaml | 99 - .../postgresql/templates/serviceaccount.yaml | 18 - .../postgresql/templates/tls-secrets.yaml | 30 - .../charts/postgresql/values.schema.json | 156 -- .../infra/beta9/charts/postgresql/values.yaml | 1647 -------------- .../infra/beta9/charts/redis/.helmignore | 23 - .../infra/beta9/charts/redis/Chart.lock | 6 - .../infra/beta9/charts/redis/Chart.yaml | 36 - .../infra/beta9/charts/redis/README.md | 1223 ---------- .../charts/redis/charts/common/.helmignore | 22 - .../charts/redis/charts/common/Chart.yaml | 23 - .../charts/redis/charts/common/README.md | 235 -- .../charts/common/templates/_affinities.tpl | 139 -- .../charts/common/templates/_capabilities.tpl | 229 -- .../redis/charts/common/templates/_errors.tpl | 28 - .../redis/charts/common/templates/_images.tpl | 117 - .../charts/common/templates/_ingress.tpl | 73 - .../redis/charts/common/templates/_labels.tpl | 46 - .../redis/charts/common/templates/_names.tpl | 71 - .../charts/common/templates/_secrets.tpl | 182 -- .../charts/common/templates/_storage.tpl | 28 - .../charts/common/templates/_tplvalues.tpl | 38 - .../redis/charts/common/templates/_utils.tpl | 77 - .../charts/common/templates/_warnings.tpl | 19 - .../templates/validations/_cassandra.tpl | 77 - .../common/templates/validations/_mariadb.tpl | 108 - .../common/templates/validations/_mongodb.tpl | 113 - .../common/templates/validations/_mysql.tpl | 108 - .../templates/validations/_postgresql.tpl | 134 -- .../common/templates/validations/_redis.tpl | 81 - .../templates/validations/_validations.tpl | 51 - .../charts/redis/charts/common/values.yaml | 8 - .../beta9/charts/redis/templates/NOTES.txt | 191 -- .../beta9/charts/redis/templates/_helpers.tpl | 328 --- .../charts/redis/templates/configmap.yaml | 61 - .../charts/redis/templates/extra-list.yaml | 9 - .../charts/redis/templates/headless-svc.yaml | 33 - .../redis/templates/health-configmap.yaml | 194 -- .../redis/templates/master/application.yaml | 532 ----- .../charts/redis/templates/master/psp.yaml | 47 - .../charts/redis/templates/master/pvc.yaml | 33 - .../redis/templates/master/service.yaml | 62 - .../templates/master/serviceaccount.yaml | 18 - .../charts/redis/templates/metrics-svc.yaml | 44 - .../charts/redis/templates/networkpolicy.yaml | 105 - .../beta9/charts/redis/templates/pdb.yaml | 25 - .../charts/redis/templates/podmonitor.yaml | 69 - .../redis/templates/prometheusrule.yaml | 23 - .../redis/templates/replicas/application.yaml | 533 ----- .../charts/redis/templates/replicas/hpa.yaml | 49 - .../redis/templates/replicas/service.yaml | 59 - .../templates/replicas/serviceaccount.yaml | 18 - .../beta9/charts/redis/templates/role.yaml | 29 - .../charts/redis/templates/rolebinding.yaml | 23 - .../redis/templates/scripts-configmap.yaml | 757 ------- .../redis/templates/secret-svcbind.yaml | 37 - .../beta9/charts/redis/templates/secret.yaml | 25 - .../charts/redis/templates/sentinel/hpa.yaml | 49 - .../templates/sentinel/node-services.yaml | 67 - .../templates/sentinel/ports-configmap.yaml | 102 - .../redis/templates/sentinel/service.yaml | 104 - .../redis/templates/sentinel/statefulset.yaml | 785 ------- .../redis/templates/serviceaccount.yaml | 18 - .../redis/templates/servicemonitor.yaml | 70 - .../charts/redis/templates/tls-secret.yaml | 31 - .../beta9/charts/redis/values.schema.json | 163 -- .../infra/beta9/charts/redis/values.yaml | 2006 ----------------- .../charts/victoria-metrics-agent/.helmignore | 23 - .../victoria-metrics-agent/CHANGELOG.md | 163 -- .../charts/victoria-metrics-agent/Chart.yaml | 33 - .../charts/victoria-metrics-agent/README.md | 358 --- .../victoria-metrics-agent/README.md.gotmpl | 97 - .../victoria-metrics-agent/RELEASE_NOTES.md | 9 - .../templates/_helpers.tpl | 148 -- .../templates/clusterrole.yaml | 50 - .../templates/clusterrolebinding.yaml | 27 - .../templates/configmap.yaml | 17 - .../templates/deployment.yaml | 203 -- .../templates/extra-objects.yaml | 4 - .../templates/ingress.yaml | 50 - .../victoria-metrics-agent/templates/pdb.yaml | 26 - .../templates/podsecuritypolicy.yaml | 42 - .../victoria-metrics-agent/templates/pvc.yaml | 32 - .../templates/service-monitor.yaml | 44 - .../templates/service.yaml | 92 - .../templates/serviceaccount.yaml | 13 - .../templates/statefulset.yaml | 246 -- .../charts/victoria-metrics-agent/values.yaml | 593 ----- .../victoria-metrics-single/.helmignore | 22 - .../victoria-metrics-single/CHANGELOG.md | 154 -- .../charts/victoria-metrics-single/Chart.yaml | 31 - .../charts/victoria-metrics-single/README.md | 240 -- .../victoria-metrics-single/README.md.gotmpl | 103 - .../victoria-metrics-single/RELEASE_NOTES.md | 9 - .../templates/NOTES.txt | 51 - .../templates/_helpers.tpl | 227 -- .../templates/clusterrole.yaml | 50 - .../templates/clusterrolebinding.yaml | 23 - .../templates/extra-objects.yaml | 4 - .../templates/pdb.yaml | 26 - .../templates/podsecuritypolicy.yaml | 42 - .../templates/role.yaml | 23 - .../templates/rolebinding.yaml | 26 - .../templates/scrape-configmap.yaml | 17 - .../templates/server-deployment.yaml | 251 --- .../templates/server-ingress.yaml | 50 - .../templates/server-pvc.yaml | 33 - .../templates/server-service-headless.yaml | 72 - .../templates/server-service-monitor.yaml | 44 - .../templates/server-service.yaml | 91 - .../templates/server-statefulset.yaml | 282 --- .../templates/serviceaccount.yaml | 16 - .../victoria-metrics-single/values.yaml | 696 ------ .../infra/beta9/templates/_helpers.tpl | 120 - .../templates/cache-server-daemonset.yaml | 111 - .../infra/beta9/templates/clusterrole.yaml | 29 - .../infra/beta9/templates/common.yaml | 6 - .../infra/beta9/templates/manifests.yaml | 9 - .../infra/beta9/templates/registry.yaml | 83 - .../infra/beta9/templates/secret.yaml | 11 - thunder_deployment/infra/beta9/values.yaml | 475 ---- thunder_deployment/infra/gpu-node-labels.yaml | 9 - .../infra/nvidia-runtimeclass/Chart.yaml | 6 - .../templates/_helpers.tpl | 49 - .../nvidia-ctk-installer-daemonset.yaml | 66 - .../nvidia-device-plugin-daemonset.yaml | 54 - .../templates/nvidia-runtimeclass.yaml | 12 - .../infra/nvidia-runtimeclass/values.yaml | 75 - thunder_deployment/provision/main.go | 302 --- .../scripts/00-host-baseline.sh | 67 - thunder_deployment/scripts/01-tailscale.sh | 55 - thunder_deployment/scripts/02-k3s-server.sh | 129 -- thunder_deployment/scripts/03-k3s-agent.sh | 137 -- .../scripts/04-container-runtime.sh | 43 - thunder_deployment/scripts/05-nvidia.sh | 54 - .../scripts/06-k8s-gpu-device-plugin.sh | 71 - .../scripts/07-registry-access.sh | 28 - .../scripts/08-beta9-readiness.sh | 65 - thunder_deployment/scripts/common.sh | 164 -- thunder_deployment/scripts/run.sh | 39 - 468 files changed, 21 insertions(+), 38902 deletions(-) delete mode 100644 thunder_deployment/README.md delete mode 100644 thunder_deployment/client_workload/.beamignore delete mode 100644 thunder_deployment/client_workload/beam.py delete mode 100644 thunder_deployment/client_workload/client_setup.py delete mode 100644 thunder_deployment/client_workload/main.py delete mode 100644 thunder_deployment/client_workload/requirements.txt delete mode 100644 thunder_deployment/go.mod delete mode 100644 thunder_deployment/infra/beta9/.helmignore delete mode 100644 thunder_deployment/infra/beta9/Chart.lock delete mode 100644 thunder_deployment/infra/beta9/Chart.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/.helmignore delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/Chart.lock delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/Chart.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/.helmignore delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/Chart.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/README.md delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_configmap.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_cronjob.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_daemonset.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_deployment.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_ingress.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_job.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_networkpolicy.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_pvc.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_route.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_secret.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_service.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_serviceAccount.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_serviceMonitor.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_statefulset.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_getMapItemsWithKey.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_kahn.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_names.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_getByIdentifier.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_spec.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_args.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_command.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_env.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_envFrom.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_image.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_name.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_probes.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_volumeMounts.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_enabled_containers.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_metadata.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/cronjob/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/cronjob/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/daemonset/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/daemonset/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/deployment/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/deployment/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_primary.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/job/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/job/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_allLabels.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_globalAnnotations.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_globalLabels.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_selectorLabels.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/networkpolicy/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/networkpolicy/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/_getOption.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/_spec.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_containers.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_dnsPolicy.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_initContainers.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_serviceAccountName.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_volumes.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/metadata/_annotations.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/metadata/_labels.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pvc/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pvc/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_primary.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_getByIdentifier.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_enabled_ports.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_enabled_services.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_getByIdentifier.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_getPortNumberByName.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_primaryForController.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_primary_port.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceAccount/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceAccount/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceMonitor/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceMonitor/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_volumeClaimTemplates.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_all.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_generate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_init.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_configmaps.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_controllers.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_ingresses.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_networkpolicies.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_pvcs.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_routes.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_secrets.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_serviceMonitors.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_serviceaccount.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_services.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/values/_init.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/values.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/templates/_helpers.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/templates/common.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/beam-blobcache-chart/values.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/common/.helmignore delete mode 100644 thunder_deployment/infra/beta9/charts/common/Chart.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/common/README.md delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_configmap.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_cronjob.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_daemonset.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_deployment.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_ingress.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_job.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_networkpolicy.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_pvc.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_route.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_secret.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_service.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_serviceAccount.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_serviceMonitor.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/classes/_statefulset.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_getMapItemsWithKey.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_kahn.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_names.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_getByIdentifier.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/_spec.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_args.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_command.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_env.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_envFrom.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_image.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_name.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_probes.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_volumeMounts.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_enabled_containers.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_metadata.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/cronjob/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/cronjob/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/daemonset/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/daemonset/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/deployment/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/deployment/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_primary.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/job/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/job/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_allLabels.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_globalAnnotations.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_globalLabels.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_selectorLabels.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/networkpolicy/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/networkpolicy/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pod/_getOption.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pod/_spec.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_containers.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_dnsPolicy.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_initContainers.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_serviceAccountName.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_volumes.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pod/metadata/_annotations.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pod/metadata/_labels.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pvc/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/pvc/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_primary.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_getByIdentifier.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/service/_enabled_ports.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/service/_enabled_services.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/service/_getByIdentifier.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/service/_getPortNumberByName.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/service/_primaryForController.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/service/_primary_port.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/service/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/service/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/serviceAccount/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/serviceAccount/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/serviceMonitor/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/serviceMonitor/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_validate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_valuesToObject.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_volumeClaimTemplates.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/loader/_all.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/loader/_generate.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/loader/_init.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_configmaps.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_controllers.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_ingresses.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_networkpolicies.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_pvcs.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_routes.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_secrets.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_serviceMonitors.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_serviceaccount.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/render/_services.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/templates/values/_init.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/common/values.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/.helmignore delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/Chart.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/README.md delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/ci/default-values.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/ci/with-affinity-values.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/ci/with-dashboard-json-values.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/ci/with-dashboard-values.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/ci/with-extraconfigmapmounts-values.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/ci/with-image-renderer-values.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/ci/with-persistence.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/dashboards/custom-dashboard.json delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/NOTES.txt delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/_config.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/_helpers.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/_pod.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/clusterrole.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/clusterrolebinding.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/configSecret.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/configmap-dashboard-provider.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/configmap.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/dashboards-json-configmap.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/deployment.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/extra-manifests.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/headless-service.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/hpa.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-deployment.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-hpa.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-network-policy.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-service.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-servicemonitor.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/ingress.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/networkpolicy.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/poddisruptionbudget.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/podsecuritypolicy.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/pvc.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/role.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/rolebinding.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/secret-env.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/secret.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/service.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/serviceaccount.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/servicemonitor.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/statefulset.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-configmap.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-podsecuritypolicy.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-role.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-rolebinding.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-serviceaccount.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/templates/tests/test.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/grafana/values.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/.helmignore delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/Chart.lock delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/Chart.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/README.md delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/.helmignore delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/Chart.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/README.md delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_affinities.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_capabilities.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_errors.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_images.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_ingress.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_labels.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_names.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_secrets.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_storage.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_tplvalues.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_utils.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_warnings.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_cassandra.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mariadb.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mongodb.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mysql.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_postgresql.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_redis.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_validations.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/charts/common/values.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/NOTES.txt delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/_helpers.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/backup/cronjob.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/backup/pvc.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/extra-list.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/networkpolicy-egress.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/configmap.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/extended-configmap.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/initialization-configmap.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/metrics-configmap.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/metrics-svc.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/networkpolicy.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/servicemonitor.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/statefulset.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/svc-headless.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/primary/svc.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/prometheusrule.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/psp.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/read/extended-configmap.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/read/metrics-configmap.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/read/metrics-svc.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/read/networkpolicy.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/read/servicemonitor.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/read/statefulset.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/read/svc-headless.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/read/svc.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/role.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/rolebinding.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/secrets.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/serviceaccount.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/templates/tls-secrets.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/values.schema.json delete mode 100644 thunder_deployment/infra/beta9/charts/postgresql/values.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/.helmignore delete mode 100644 thunder_deployment/infra/beta9/charts/redis/Chart.lock delete mode 100644 thunder_deployment/infra/beta9/charts/redis/Chart.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/README.md delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/.helmignore delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/Chart.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/README.md delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_affinities.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_capabilities.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_errors.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_images.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_ingress.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_labels.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_names.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_secrets.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_storage.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_tplvalues.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_utils.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_warnings.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_cassandra.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mariadb.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mongodb.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mysql.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_postgresql.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_redis.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_validations.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/charts/common/values.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/NOTES.txt delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/_helpers.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/configmap.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/extra-list.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/headless-svc.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/health-configmap.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/master/application.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/master/psp.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/master/pvc.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/master/service.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/master/serviceaccount.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/metrics-svc.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/networkpolicy.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/pdb.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/podmonitor.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/prometheusrule.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/replicas/application.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/replicas/hpa.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/replicas/service.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/replicas/serviceaccount.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/role.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/rolebinding.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/scripts-configmap.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/secret-svcbind.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/secret.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/sentinel/hpa.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/sentinel/node-services.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/sentinel/ports-configmap.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/sentinel/service.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/sentinel/statefulset.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/serviceaccount.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/servicemonitor.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/templates/tls-secret.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/redis/values.schema.json delete mode 100644 thunder_deployment/infra/beta9/charts/redis/values.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/.helmignore delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/CHANGELOG.md delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/Chart.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/README.md delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/README.md.gotmpl delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/RELEASE_NOTES.md delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/_helpers.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/clusterrole.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/clusterrolebinding.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/configmap.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/deployment.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/extra-objects.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/ingress.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/pdb.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/podsecuritypolicy.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/pvc.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/service-monitor.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/service.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/serviceaccount.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/statefulset.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-agent/values.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/.helmignore delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/CHANGELOG.md delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/Chart.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/README.md delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/README.md.gotmpl delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/RELEASE_NOTES.md delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/NOTES.txt delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/_helpers.tpl delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/clusterrole.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/clusterrolebinding.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/extra-objects.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/pdb.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/podsecuritypolicy.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/role.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/rolebinding.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/scrape-configmap.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-deployment.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-ingress.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-pvc.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service-headless.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service-monitor.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-statefulset.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/serviceaccount.yaml delete mode 100644 thunder_deployment/infra/beta9/charts/victoria-metrics-single/values.yaml delete mode 100644 thunder_deployment/infra/beta9/templates/_helpers.tpl delete mode 100644 thunder_deployment/infra/beta9/templates/cache-server-daemonset.yaml delete mode 100644 thunder_deployment/infra/beta9/templates/clusterrole.yaml delete mode 100644 thunder_deployment/infra/beta9/templates/common.yaml delete mode 100644 thunder_deployment/infra/beta9/templates/manifests.yaml delete mode 100644 thunder_deployment/infra/beta9/templates/registry.yaml delete mode 100644 thunder_deployment/infra/beta9/templates/secret.yaml delete mode 100644 thunder_deployment/infra/beta9/values.yaml delete mode 100644 thunder_deployment/infra/gpu-node-labels.yaml delete mode 100644 thunder_deployment/infra/nvidia-runtimeclass/Chart.yaml delete mode 100644 thunder_deployment/infra/nvidia-runtimeclass/templates/_helpers.tpl delete mode 100644 thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-ctk-installer-daemonset.yaml delete mode 100644 thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-device-plugin-daemonset.yaml delete mode 100644 thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-runtimeclass.yaml delete mode 100644 thunder_deployment/infra/nvidia-runtimeclass/values.yaml delete mode 100644 thunder_deployment/provision/main.go delete mode 100755 thunder_deployment/scripts/00-host-baseline.sh delete mode 100755 thunder_deployment/scripts/01-tailscale.sh delete mode 100755 thunder_deployment/scripts/02-k3s-server.sh delete mode 100755 thunder_deployment/scripts/03-k3s-agent.sh delete mode 100755 thunder_deployment/scripts/04-container-runtime.sh delete mode 100755 thunder_deployment/scripts/05-nvidia.sh delete mode 100755 thunder_deployment/scripts/06-k8s-gpu-device-plugin.sh delete mode 100755 thunder_deployment/scripts/07-registry-access.sh delete mode 100755 thunder_deployment/scripts/08-beta9-readiness.sh delete mode 100755 thunder_deployment/scripts/common.sh delete mode 100755 thunder_deployment/scripts/run.sh diff --git a/.gitignore b/.gitignore index 2e5f062b0..76fcf8705 100644 --- a/.gitignore +++ b/.gitignore @@ -43,17 +43,3 @@ docs/*.md # Riptide artifacts (cloud-synced) .humanlayer/tasks/ - -# Thunder deployment local artifacts -/thunder_deployment/**/*.env -/thunder_deployment/**/.env -/thunder_deployment/**/.venv/ -/thunder_deployment/**/venv/ -/thunder_deployment/**/env/ -/thunder_deployment/**/*.tar -/thunder_deployment/**/*.tar.gz -/thunder_deployment/**/*.tgz -/thunder_deployment/**/*.zip -/thunder_deployment/provision.exe -/thunder_deployment/beam-admin-token -/thunder_deployment/client_workload/__pycache__/ diff --git a/pkg/worker/thunder.go b/pkg/worker/thunder.go index 6649e5006..afa2b47bb 100644 --- a/pkg/worker/thunder.go +++ b/pkg/worker/thunder.go @@ -61,13 +61,12 @@ type thunderDeleteClientRequest struct { type thunderConfigFile struct { DeviceID string `json:"deviceId"` - EnableGRPCTLS bool `json:"enableGrpcTls"` - EnvironmentType string `json:"environmentType"` GPUCount int `json:"gpuCount"` GPUType string `json:"gpuType"` - ManagerAddress string `json:"managerAddress"` - OtelCollector string `json:"otelCollector"` - UVM bool `json:"uvm"` + EnableGRPCTLS bool `json:"enableGrpcTls"` + CentralApiUrl string `json:"centralApiUrl"` + CentralZoneId string `json:"centralZoneId"` + CentralApiToken string `json:"centralApiToken"` } func NewContainerThunderManagerFromEnv() GPUManager { @@ -134,7 +133,7 @@ func (c *ContainerThunderManager) CDIDevices(assignedDevices []int) []string { } func (c *ContainerThunderManager) InjectEnvVars(env []string) []string { - return injectCudaEnvVars(env) + return withLDPreload(injectCudaEnvVars(env), thunderLibraryPath) } func (c *ContainerThunderManager) InjectAssignedEnvVars(env []string, assignedDevices []int) []string { @@ -246,7 +245,7 @@ func (c *ContainerThunderManager) InjectThunderFiles(request *types.ContainerReq if err := createThunderToken(rootPath, allocation.Token); err != nil { return err } - if err := createThunderConfig(rootPath, request); err != nil { + if err := c.createThunderConfig(rootPath, request); err != nil { return err } return nil @@ -280,16 +279,15 @@ func createThunderToken(rootPath string, token string) error { return writeThunderFile(rootPath, thunderTokenPath, []byte(token), 0644) } -func createThunderConfig(rootPath string, request *types.ContainerRequest) error { +func (c *ContainerThunderManager) createThunderConfig(rootPath string, request *types.ContainerRequest) error { config := thunderConfigFile{ DeviceID: request.ContainerId, - EnableGRPCTLS: false, - EnvironmentType: "production", GPUCount: int(thunderGPUCount(request)), GPUType: thunderGPUType(request), - ManagerAddress: "", - OtelCollector: "", - UVM: false, + EnableGRPCTLS: false, + CentralApiUrl: c.apiURL, + CentralZoneId: "thunder-beam", + CentralApiToken: c.apiToken, } contents, err := json.Marshal(config) diff --git a/pkg/worker/thunder_test.go b/pkg/worker/thunder_test.go index 971242663..7613623ca 100644 --- a/pkg/worker/thunder_test.go +++ b/pkg/worker/thunder_test.go @@ -50,6 +50,12 @@ func TestThunderAssignRegistersClientAndLeavesAssignedEnvUnchanged(t *testing.T) assert.Equal(t, []string{"A=1", "NVIDIA_VISIBLE_DEVICES=void", "WORKER_GPU_DEVICES=0"}, env) } +func TestThunderInjectEnvVarsMergesLDPreload(t *testing.T) { + manager := NewContainerThunderManager("https://thunder.example", "central-token", nil) + env := manager.InjectEnvVars([]string{"LD_PRELOAD=/existing.so"}) + assert.Contains(t, env, "LD_PRELOAD=/existing.so:/etc/thunder/libthunder.so") +} + func TestThunderUnassignUsesPostDeleteClient(t *testing.T) { var deletePayload thunderDeleteClientRequest var sawDelete bool @@ -185,12 +191,11 @@ func TestThunderPrepareContainerFilesystemWritesThunderFiles(t *testing.T) { } assert.Equal(t, thunderConfigFile{ DeviceID: "container-123", - EnableGRPCTLS: false, - EnvironmentType: "production", GPUCount: 2, GPUType: "A100", - ManagerAddress: "", - OtelCollector: "", - UVM: false, + EnableGRPCTLS: false, + CentralApiUrl: server.URL, + CentralZoneId: "thunder-beam", + CentralApiToken: "central-token", }, config) } diff --git a/thunder_deployment/README.md b/thunder_deployment/README.md deleted file mode 100644 index 18adcedb5..000000000 --- a/thunder_deployment/README.md +++ /dev/null @@ -1,118 +0,0 @@ -# Beam deployment notes - -## beta0 setep - -This deployment runs the open-source Beta9/Beam components from public sources and public container images. No private Beam registry access was needed. - -Versions used: - -- Gateway source release: `gateway-0.1.714` - - `https://github.com/beam-cloud/beta9/archive/refs/tags/gateway-0.1.714.tar.gz` - - image: `public.ecr.aws/n4e0e1y0/beta9-gateway:0.1.714` -- Worker source release: `worker-0.1.682` - - `https://github.com/beam-cloud/beta9/archive/refs/tags/worker-0.1.682.tar.gz` - - image: `public.ecr.aws/n4e0e1y0/beta9-worker:0.1.682` -- Helm chart: `infra/beta9`, chart/app version `0.1.714` -- Runner/base image registry: `public.ecr.aws/n4e0e1y0` - -Useful release checks: - -```bash -curl -fsSL -o /tmp/beta9-gateway-0.1.714.tar.gz \ - https://github.com/beam-cloud/beta9/archive/refs/tags/gateway-0.1.714.tar.gz -curl -fsSL -o /tmp/beta9-worker-0.1.682.tar.gz \ - https://github.com/beam-cloud/beta9/archive/refs/tags/worker-0.1.682.tar.gz -``` - -Install/update the chart from the master node path: - -```bash -helm dependency build infra/beta9 -helm upgrade --install beta9 infra/beta9 \ - --namespace beta9 \ - --create-namespace \ - --wait \ - --timeout 15m -``` - -The local deployment values expose the gateway on the master Tailscale IP using NodePorts: - -- gRPC: `100.73.254.107:31993` -- HTTP: `http://100.73.254.107:31994` - -Worker image storage is node-local hostPath (`/var/lib/beta9/images`) rather than a local-path PVC. A local-path PVC is pinned to the node where it was provisioned and blocks GPU worker pods from scheduling on a separate GPU node. - -## node setup - -This setup used one k3s master and one A6000 GPU worker: - -- master: `beam-master-1`, Tailscale IP `100.73.254.107` -- worker: `worker-a6000-1`, Tailscale IP `100.92.182.92` -- GPU shape: `A6000`, 8 GPUs on the node, 1 GPU per A6000 worker pod - -Provision the master: - -```bash -./provision.exe \ - --host 100.73.254.107 \ - --role master \ - --mode install \ - --key ~/.ssh/hyperstack_staging.pem \ - --node-name beam-master-1 \ - --node-ip 100.73.254.107 \ - --k3s-tls-san 100.73.254.107 \ - --flannel-iface tailscale0 \ - --flannel-backend wireguard-native -``` - -Get the k3s join token from the master: - -```bash -K3S_TOKEN="$(ssh -i ~/.ssh/hyperstack_staging.pem ubuntu@100.73.254.107 \ - 'sudo cat /var/lib/rancher/k3s/server/node-token')" -``` - -Provision the A6000 worker: - -```bash -./provision.exe \ - --host 100.92.182.92 \ - --role gpu \ - --mode install \ - --key ~/.ssh/master.pem \ - --node-name worker-a6000-1 \ - --node-ip 100.92.182.92 \ - --k3s-url https://100.73.254.107:6443 \ - --k3s-token "$K3S_TOKEN" \ - --flannel-iface tailscale0 \ - --gpu-type A6000 \ - --gpu-count 8 -``` - -Important node details captured in the scripts: - -- k3s node IPs are pinned to Tailscale IPs with `--node-ip`. -- flannel uses `tailscale0` and `wireguard-native`; plain VXLAN and host-gw were not sufficient in this mixed-network setup. -- reused nodes may contain stale RKE2/Cilium state. The GPU node provisioning path moves stale Cilium CNI configs aside, restores the k3s flannel CNI config, and ensures k3s CNI plugins are present under `/opt/cni/bin`. -- GPU nodes are labeled during join: `beta9.node-role=gpu`, `beta9.gpu=true`, `beta9.gpu-type=`, `beta9.gpu-count=`. - -Validation commands: - -```bash -kubectl get nodes -o wide -kubectl get node worker-a6000-1 \ - -o jsonpath='alloc_gpu={.status.allocatable.nvidia\.com/gpu} cap_gpu={.status.capacity.nvidia\.com/gpu}{"\n"}' -kubectl -n beta9 get pods -o wide -kubectl -n kube-system get pods -o wide | grep -E 'nvidia|coredns' -``` - -Expected final state for this setup: - -- both nodes Ready -- `worker-a6000-1` advertises `nvidia.com/gpu=8` -- NVIDIA device plugin pod Running on `worker-a6000-1` -- Beta9 gateway Running on `beam-master-1` -- A6000 worker Running on `worker-a6000-1` - -## thunder setup - diff --git a/thunder_deployment/client_workload/.beamignore b/thunder_deployment/client_workload/.beamignore deleted file mode 100644 index 6aa392d4a..000000000 --- a/thunder_deployment/client_workload/.beamignore +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Beam SDK -.beamignore -.git -.idea -.python-version -.vscode -.venv -venv -__pycache__ -.DS_Store -.config -drive/MyDrive -.coverage -.pytest_cache -.ipynb -.ruff_cache -.dockerignore -.ipynb_checkpoints -.env.local -.env -.envrc -**/__pycache__/ -**/.pytest_cache/ -**/node_modules/ -**/.venv/ -*.pyc -.next/ -.circleci diff --git a/thunder_deployment/client_workload/beam.py b/thunder_deployment/client_workload/beam.py deleted file mode 100644 index bc9c1d9cd..000000000 --- a/thunder_deployment/client_workload/beam.py +++ /dev/null @@ -1 +0,0 @@ -from beta9 import * # noqa: F403 diff --git a/thunder_deployment/client_workload/client_setup.py b/thunder_deployment/client_workload/client_setup.py deleted file mode 100644 index 812a72a7c..000000000 --- a/thunder_deployment/client_workload/client_setup.py +++ /dev/null @@ -1,71 +0,0 @@ -import os -from pathlib import Path - -from beta9 import config as beta9_config - - -ENV_PATH = Path(__file__).with_name(".env") - - -def load_env(path: Path = ENV_PATH) -> None: - if not path.exists(): - return - - for raw_line in path.read_text().splitlines(): - line = raw_line.strip() - if not line or line.startswith("#"): - continue - if line.startswith("export "): - line = line[len("export "):].strip() - if "=" not in line: - continue - - key, value = line.split("=", 1) - key = key.strip() - value = value.strip() - - if len(value) >= 2 and value[0] == value[-1] and value[0] in {"'", '"'}: - value = value[1:-1] - - os.environ[key] = value - - -def resolve_env_path(name: str) -> None: - value = os.environ.get(name) - if not value: - return - - path = Path(value).expanduser() - if not path.is_absolute(): - path = ENV_PATH.parent / path - os.environ[name] = str(path) - - -def normalize_beam_env() -> None: - token = os.environ.get("BEAM_TOKEN") or os.environ.get("BETA9_TOKEN") - gateway_host = os.environ.get("GATEWAY_HOST") or os.environ.get("BETA9_GATEWAY_HOST") - gateway_port = os.environ.get("GATEWAY_PORT") or os.environ.get("BETA9_GATEWAY_PORT") - - if token: - os.environ["BEAM_TOKEN"] = token - os.environ["BETA9_TOKEN"] = token - if gateway_host: - os.environ["GATEWAY_HOST"] = gateway_host - os.environ["BETA9_GATEWAY_HOST"] = gateway_host - if gateway_port: - os.environ["GATEWAY_PORT"] = gateway_port - os.environ["BETA9_GATEWAY_PORT"] = gateway_port - - resolve_env_path("CONFIG_PATH") - - CONFIG_PATH = os.environ.get("CONFIG_PATH") - if CONFIG_PATH: - beta9_config.get_settings().config_path = Path(CONFIG_PATH).expanduser() - - -def required_env(name: str) -> str: - value = os.environ.get(name) - if not value: - raise RuntimeError(f"Missing required environment variable: {name}") - return value - diff --git a/thunder_deployment/client_workload/main.py b/thunder_deployment/client_workload/main.py deleted file mode 100644 index e9510919f..000000000 --- a/thunder_deployment/client_workload/main.py +++ /dev/null @@ -1,60 +0,0 @@ -import os -import sys -import threading -from client_setup import load_env, normalize_beam_env - -from beam import Image, Sandbox, GpuType - -NUM_WORKERS = 4 - - -def worker(index: int): - sandbox = Sandbox( - image=Image(), - gpu=GpuType.A6000, - gpu_count=1, - gpu_virtualized=True, - ).create() - proc = None - try: - proc = sandbox.process.exec('nvidia-smi') - except Exception as e: - print(f'sandbox worker: {index}; received error: {e}') - finally: - if proc is not None: - proc.wait() - print(f'sandbox worker: {index}; result: {proc.stdout.read()}') - if sandbox.terminate(): - print(f'sandbox worker {index} terminated') - -if __name__ == "__main__": - exit_code = 0 - load_env() - normalize_beam_env() - try: - threaded = False - if len(sys.argv) > 1: - for index, arg in enumerate(sys.argv): - if arg == "--mode" and index < len(sys.argv) - 1 and sys.argv[index + 1] == "threaded": - threaded = True - - if threaded: - threads = [] - for index in range(NUM_WORKERS): - thread = threading.Thread(target=worker, args=(index,)) - thread.start() - threads.append(thread) - for thread in threads: - thread.join() - else: - for index in range(NUM_WORKERS): - worker(index) - except BaseException: - exit_code = 1 - import traceback - - traceback.print_exc() - finally: - sys.stdout.flush() - sys.stderr.flush() - os._exit(exit_code) diff --git a/thunder_deployment/client_workload/requirements.txt b/thunder_deployment/client_workload/requirements.txt deleted file mode 100644 index c984e50a0..000000000 --- a/thunder_deployment/client_workload/requirements.txt +++ /dev/null @@ -1,49 +0,0 @@ -annotated-doc==0.0.4 -annotated-types==0.7.0 -anyio==4.14.2 -asgiref==3.12.1 -bcrypt==5.0.0 --e file:///home/ubuntu/beam_demo/beta9/sdk -betterproto-beta9==2.0.1 -certifi==2026.6.17 -cffi==2.1.0 -charset-normalizer==3.4.9 -click==8.4.2 -cloudpickle==3.1.2 -croniter==3.0.4 -cryptography==49.0.0 -fastapi==0.139.0 -grpcio==1.82.1 -grpclib==0.4.9 -h11==0.16.0 -h2==4.3.0 -hpack==4.2.0 -hyperframe==6.1.0 -idna==3.18 -markdown-it-py==4.2.0 -mdurl==0.1.2 -multidict==6.7.1 -paramiko==3.5.1 -prompt-toolkit==3.0.52 -protobuf==6.33.6 -pycparser==3.0 -pydantic==2.13.4 -pydantic-core==2.46.4 -pygments==2.20.0 -pynacl==1.6.2 -python-dateutil==2.9.0.post0 -pytz==2026.2 -pyyaml==6.0.3 -requests==2.34.2 -rich==14.3.4 -six==1.17.0 -starlette==1.3.1 -typeguard==4.5.2 -typing-extensions==4.16.0 -typing-inspection==0.4.2 -urllib3==2.7.0 -uvicorn==0.51.0 -watchdog==4.0.2 -wcwidth==0.8.2 -websocket-client==1.9.0 -websockets==15.0.1 diff --git a/thunder_deployment/go.mod b/thunder_deployment/go.mod deleted file mode 100644 index 8ec2daa1c..000000000 --- a/thunder_deployment/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module thundercompute.com/beam - -go 1.23 diff --git a/thunder_deployment/infra/beta9/.helmignore b/thunder_deployment/infra/beta9/.helmignore deleted file mode 100644 index 0e8a0eb36..000000000 --- a/thunder_deployment/infra/beta9/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/thunder_deployment/infra/beta9/Chart.lock b/thunder_deployment/infra/beta9/Chart.lock deleted file mode 100644 index 7c0bb3826..000000000 --- a/thunder_deployment/infra/beta9/Chart.lock +++ /dev/null @@ -1,27 +0,0 @@ -dependencies: -- name: common - repository: https://bjw-s-labs.github.io/helm-charts - version: 2.5.0 -- name: beam-blobcache-chart - repository: oci://public.ecr.aws/n4e0e1y0 - version: 0.1.2 -- name: redis - repository: https://charts.bitnami.com/bitnami - version: 18.9.1 -- name: redis - repository: https://charts.bitnami.com/bitnami - version: 18.9.1 -- name: postgresql - repository: https://charts.bitnami.com/bitnami - version: 13.4.3 -- name: grafana - repository: https://grafana.github.io/helm-charts - version: 7.3.0 -- name: victoria-metrics-single - repository: https://victoriametrics.github.io/helm-charts - version: 0.9.15 -- name: victoria-metrics-agent - repository: https://victoriametrics.github.io/helm-charts - version: 0.9.17 -digest: sha256:b4adfbc1a1ddea3a896f3d880468d6e58a88dd4ae769786f77b577b6929c79cd -generated: "2026-05-27T13:39:46.548822-04:00" diff --git a/thunder_deployment/infra/beta9/Chart.yaml b/thunder_deployment/infra/beta9/Chart.yaml deleted file mode 100644 index bd59984f9..000000000 --- a/thunder_deployment/infra/beta9/Chart.yaml +++ /dev/null @@ -1,41 +0,0 @@ -apiVersion: v2 -name: beta9-chart -description: A Helm chart for Beta9 -type: application -version: 0.1.714 -appVersion: 0.1.714 -home: https://beta9.dev -dependencies: -- name: common - repository: https://bjw-s-labs.github.io/helm-charts - version: 2.5.0 -- alias: blobcache - name: beam-blobcache-chart - version: 0.1.2 - repository: oci://public.ecr.aws/n4e0e1y0 - condition: blobcache.enabled -- name: redis - version: 18.9.1 - repository: https://charts.bitnami.com/bitnami - condition: redis.enabled -- alias: juicefs-redis - name: redis - version: 18.9.1 - repository: https://charts.bitnami.com/bitnami - condition: juicefs-redis.enabled -- name: postgresql - version: 13.4.3 - repository: https://charts.bitnami.com/bitnami - condition: postgresql.enabled -- name: grafana - version: 7.3.0 - repository: https://grafana.github.io/helm-charts - condition: metrics.enabled -- name: victoria-metrics-single - version: 0.9.15 - repository: https://victoriametrics.github.io/helm-charts - condition: metrics.enabled -- name: victoria-metrics-agent - version: 0.9.17 - repository: https://victoriametrics.github.io/helm-charts - condition: metrics.enabled diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/.helmignore b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/.helmignore deleted file mode 100644 index 0e8a0eb36..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/Chart.lock b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/Chart.lock deleted file mode 100644 index 3289cbd0b..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: https://bjw-s.github.io/helm-charts - version: 2.5.0 -digest: sha256:d40f33f9bf7747337babf6efd9561f1fadc0e2dea867b3146201ca3a8eb70e7a -generated: "2024-02-08T17:59:12.280543-05:00" diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/Chart.yaml b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/Chart.yaml deleted file mode 100644 index 9cdb9b04f..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/Chart.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v2 -appVersion: 0.1.1 -dependencies: -- name: common - repository: https://bjw-s.github.io/helm-charts - version: 2.5.0 -description: A Helm chart for Blobcache -home: https://beam.cloud -name: beam-blobcache-chart -type: application -version: 0.1.2 diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/.helmignore b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/.helmignore deleted file mode 100644 index c62cbf857..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/.helmignore +++ /dev/null @@ -1,28 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ -# OWNERS file for Kubernetes -OWNERS -# helm-docs templates -*.gotmpl -# Test files -tests/ diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/Chart.yaml b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/Chart.yaml deleted file mode 100644 index 442854507..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/Chart.yaml +++ /dev/null @@ -1,33 +0,0 @@ -annotations: - artifacthub.io/changes: |- - - kind: fixed - description: |- - PersistentVolumeClaims now properly created based on `persistence.x.enabled` value - - kind: added - description: |- - Support suspending CronJobs - - kind: added - description: |- - Add support for targetLabels in ServiceMonitor - - kind: added - description: |- - Re-add support for setting mountPropagation on volumemounts - - kind: added - description: |- - Support `envFrom` identifiers and name templates for Secrets and ConfigMaps - - kind: added - description: |- - Support the `job` controller type to generate one-off jobs. -apiVersion: v2 -description: Function library for Helm charts -home: https://github.com/bjw-s/helm-charts/tree/main/charts/library/common -keywords: -- common -- library -kubeVersion: '>=1.22.0-0' -maintainers: -- email: me@bjw-s.dev - name: bjw-s -name: common -type: library -version: 2.5.0 diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/README.md b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/README.md deleted file mode 100644 index 76cef450e..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/README.md +++ /dev/null @@ -1,234 +0,0 @@ -# common - -![Version: 2.5.0](https://img.shields.io/badge/Version-2.5.0-informational?style=flat-square) ![Type: library](https://img.shields.io/badge/Type-library-informational?style=flat-square) - -Function library for Helm charts - -## Requirements - -Kubernetes: `>=1.22.0-0` - -## Dependencies - -| Repository | Name | Version | -|------------|------|---------| - -## Installing the Chart - -This is a [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm). - -**🚨 WARNING: THIS CHART IS NOT MEANT TO BE INSTALLED DIRECTLY** - -## Using this library - -Include this chart as a dependency in your `Chart.yaml` e.g. - -```yaml -# Chart.yaml -dependencies: - - name: common - version: 2.5.0 - repository: https://bjw-s.github.io/helm-charts/ -``` - -For more information, take a look at the [Docs](http://bjw-s.github.io/helm-charts/docs/common-library/introduction/). - -## Configuration - -Read through the [values.yaml](./values.yaml) file. It has several commented out suggested values. - -## Values - -**Important**: When deploying an application Helm chart you can add more values from the common library chart [here](https://github.com/bjw-s/helm-charts/tree/main/charts/library/common) - -The following table contains an overview of available values and their descriptions / default values. - -
-Expand - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| configMaps | object | See below | Configure configMaps for the chart here. Additional configMaps can be added by adding a dictionary key similar to the 'config' object. | -| configMaps.config.annotations | object | `{}` | Annotations to add to the configMap | -| configMaps.config.data | object | `{}` | configMap data content. Helm template enabled. | -| configMaps.config.enabled | bool | `false` | Enables or disables the configMap | -| configMaps.config.labels | object | `{}` | Labels to add to the configMap | -| controllers.main.annotations | object | `{}` | Set annotations on the deployment/statefulset/daemonset/cronjob/job | -| controllers.main.containers.main.args | list | `[]` | Override the args for the default container | -| controllers.main.containers.main.command | list | `[]` | Override the command(s) for the default container | -| controllers.main.containers.main.dependsOn | list | `[]` | Specify if this container depends on any other containers This is used to determine the order in which the containers are rendered. The use of "dependsOn" completely disables the "order" field within the controller. | -| controllers.main.containers.main.env | string | `nil` | Environment variables. Template enabled. Syntax options: A) TZ: UTC B) PASSWD: '{{ .Release.Name }}' B) TZ: value: UTC dependsOn: otherVar D) PASSWD: configMapKeyRef: name: config-map-name key: key-name E) PASSWD: dependsOn: - otherVar1 - otherVar2 valueFrom: secretKeyRef: name: secret-name key: key-name ... F) - name: TZ value: UTC G) - name: TZ value: '{{ .Release.Name }}' | -| controllers.main.containers.main.envFrom | list | `[]` | Secrets and/or ConfigMaps that will be loaded as environment variables. Syntax options: A) Pass an app-template configMap identifier: - config: config B) Pass any configMap name that is not also an identifier (Template enabled): - config: random-configmap-name C) Pass an app-template configMap identifier, explicit syntax: - configMapRef: identifier: config D) Pass any configMap name, explicit syntax (Template enabled): - configMapRef: name: "{{ .Release.Name }}-config" E) Pass an app-template secret identifier: - secret: secret F) Pass any secret name that is not also an identifier (Template enabled): - secret: random-secret-name G) Pass an app-template secret identifier, explicit syntax: - secretRef: identifier: secret H) Pass any secret name, explicit syntax (Template enabled): - secretRef: name: "{{ .Release.Name }}-secret" | -| controllers.main.containers.main.image.pullPolicy | string | `nil` | image pull policy | -| controllers.main.containers.main.image.repository | string | `nil` | image repository | -| controllers.main.containers.main.image.tag | string | `nil` | image tag | -| controllers.main.containers.main.lifecycle | object | `{}` | [[ref](https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/)] | -| controllers.main.containers.main.nameOverride | string | `nil` | Override the container name | -| controllers.main.containers.main.order | int | 99 | Override the default container order Containers get sorted alphanumerically by the `-` combination. | -| controllers.main.containers.main.probes | object | See below | [[ref]](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) | -| controllers.main.containers.main.probes.liveness | object | See below | Liveness probe configuration | -| controllers.main.containers.main.probes.liveness.custom | bool | `false` | Set this to `true` if you wish to specify your own livenessProbe | -| controllers.main.containers.main.probes.liveness.enabled | bool | `true` | Enable the liveness probe | -| controllers.main.containers.main.probes.liveness.spec | object | See below | The spec field contains the values for the default livenessProbe. If you selected `custom: true`, this field holds the definition of the livenessProbe. | -| controllers.main.containers.main.probes.liveness.type | string | "TCP" | sets the probe type when not using a custom probe | -| controllers.main.containers.main.probes.readiness | object | See below | Redainess probe configuration | -| controllers.main.containers.main.probes.readiness.custom | bool | `false` | Set this to `true` if you wish to specify your own readinessProbe | -| controllers.main.containers.main.probes.readiness.enabled | bool | `true` | Enable the readiness probe | -| controllers.main.containers.main.probes.readiness.spec | object | See below | The spec field contains the values for the default readinessProbe. If you selected `custom: true`, this field holds the definition of the readinessProbe. | -| controllers.main.containers.main.probes.readiness.type | string | "TCP" | sets the probe type when not using a custom probe | -| controllers.main.containers.main.probes.startup | object | See below | Startup probe configuration | -| controllers.main.containers.main.probes.startup.custom | bool | `false` | Set this to `true` if you wish to specify your own startupProbe | -| controllers.main.containers.main.probes.startup.enabled | bool | `true` | Enable the startup probe | -| controllers.main.containers.main.probes.startup.spec | object | See below | The spec field contains the values for the default startupProbe. If you selected `custom: true`, this field holds the definition of the startupProbe. | -| controllers.main.containers.main.probes.startup.type | string | "TCP" | sets the probe type when not using a custom probe | -| controllers.main.containers.main.resources | object | `{}` | Set the resource requests / limits for the container. | -| controllers.main.containers.main.securityContext | object | `{}` | Configure the Security Context for the container | -| controllers.main.containers.main.terminationMessagePath | string | `nil` | [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle-1)] | -| controllers.main.containers.main.terminationMessagePolicy | string | `nil` | [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle-1)] | -| controllers.main.containers.main.workingDir | string | `nil` | Override the working directory for the default container | -| controllers.main.cronjob | object | See below | CronJob configuration. Required only when using `controller.type: cronjob`. | -| controllers.main.cronjob.backoffLimit | int | `6` | Limits the number of times a failed job will be retried | -| controllers.main.cronjob.concurrencyPolicy | string | `"Forbid"` | Specifies how to treat concurrent executions of a job that is created by this cron job valid values are Allow, Forbid or Replace | -| controllers.main.cronjob.failedJobsHistory | int | `1` | The number of failed Jobs to keep | -| controllers.main.cronjob.schedule | string | `"*/20 * * * *"` | Sets the CronJob time when to execute your jobs | -| controllers.main.cronjob.startingDeadlineSeconds | int | `30` | The deadline in seconds for starting the job if it misses its scheduled time for any reason | -| controllers.main.cronjob.successfulJobsHistory | int | `1` | The number of succesful Jobs to keep | -| controllers.main.cronjob.suspend | string | false | Suspends the CronJob [[ref]](https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#schedule-suspension) | -| controllers.main.cronjob.timeZone | string | `nil` | Sets the CronJob timezone (only works in Kubernetes >= 1.27) | -| controllers.main.cronjob.ttlSecondsAfterFinished | string | `nil` | If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to be automatically deleted. | -| controllers.main.enabled | bool | `true` | enable the controller. | -| controllers.main.initContainers | object | `{}` | Specify any initContainers here as dictionary items. Each initContainer should have its own key initContainers get sorted alphanumerically by the `-` combination if no order or dependsOn has been configured for them. | -| controllers.main.job | object | See below | Job configuration. Required only when using `controller.type: job`. | -| controllers.main.job.backoffLimit | int | `6` | Limits the number of times a failed job will be retried | -| controllers.main.job.suspend | string | false | Suspends the Job [[ref]](https://kubernetes.io/docs/concepts/workloads/controllers/job/#suspending-a-job) | -| controllers.main.job.ttlSecondsAfterFinished | string | `nil` | If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to be automatically deleted. | -| controllers.main.labels | object | `{}` | Set labels on the deployment/statefulset/daemonset/cronjob/job | -| controllers.main.pod | object | `{}` | | -| controllers.main.replicas | int | `1` | Number of desired pods. When using a HorizontalPodAutoscaler, set this to `null`. | -| controllers.main.revisionHistoryLimit | int | `3` | ReplicaSet revision history limit | -| controllers.main.rollingUpdate.partition | string | `nil` | Set statefulset RollingUpdate partition | -| controllers.main.rollingUpdate.surge | string | `nil` | Set deployment RollingUpdate max surge | -| controllers.main.rollingUpdate.unavailable | string | `nil` | Set deployment RollingUpdate max unavailable | -| controllers.main.statefulset | object | `{"podManagementPolicy":null,"volumeClaimTemplates":[]}` | StatefulSet configuration. Required only when using `controller.type: statefulset`. | -| controllers.main.statefulset.podManagementPolicy | string | `nil` | Set podManagementPolicy, valid values are Parallel and OrderedReady (default). | -| controllers.main.statefulset.volumeClaimTemplates | list | `[]` | Used to create individual disks for each instance. | -| controllers.main.strategy | string | `nil` | Set the controller upgrade strategy For Deployments, valid values are Recreate (default) and RollingUpdate. For StatefulSets, valid values are OnDelete and RollingUpdate (default). DaemonSets/CronJobs/Jobs ignore this. | -| controllers.main.type | string | `"deployment"` | Set the controller type. Valid options are deployment, daemonset, statefulset, cronjob or job | -| defaultPodOptions | object | `{"affinity":{},"annotations":{},"automountServiceAccountToken":true,"dnsConfig":{},"dnsPolicy":null,"enableServiceLinks":true,"hostAliases":[],"hostIPC":false,"hostNetwork":false,"hostPID":false,"hostname":null,"imagePullSecrets":[],"labels":{},"nodeSelector":{},"priorityClassName":null,"restartPolicy":null,"runtimeClassName":null,"schedulerName":null,"securityContext":{},"terminationGracePeriodSeconds":null,"tolerations":[],"topologySpreadConstraints":[]}` | Set default options for all controllers / pods here Each of these options can be overridden on a Controller level | -| defaultPodOptions.affinity | object | `{}` | Defines affinity constraint rules. [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity) | -| defaultPodOptions.annotations | object | `{}` | Set annotations on the Pod. Pod-specific values will be merged with this. | -| defaultPodOptions.automountServiceAccountToken | bool | `true` | Specifies whether a service account token should be automatically mounted. | -| defaultPodOptions.dnsConfig | object | `{}` | Configuring the ndots option may resolve nslookup issues on some Kubernetes setups. | -| defaultPodOptions.dnsPolicy | string | `nil` | Defaults to "ClusterFirst" if hostNetwork is false and "ClusterFirstWithHostNet" if hostNetwork is true. | -| defaultPodOptions.enableServiceLinks | bool | `true` | Enable/disable the generation of environment variables for services. [[ref]](https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#accessing-the-service) | -| defaultPodOptions.hostAliases | list | `[]` | Use hostAliases to add custom entries to /etc/hosts - mapping IP addresses to hostnames. [[ref]](https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/) | -| defaultPodOptions.hostIPC | bool | `false` | Use the host's ipc namespace | -| defaultPodOptions.hostNetwork | bool | `false` | When using hostNetwork make sure you set dnsPolicy to `ClusterFirstWithHostNet` | -| defaultPodOptions.hostPID | bool | `false` | Use the host's pid namespace | -| defaultPodOptions.hostname | string | `nil` | Allows specifying explicit hostname setting | -| defaultPodOptions.imagePullSecrets | list | `[]` | Set image pull secrets | -| defaultPodOptions.labels | object | `{}` | Set labels on the Pod. Pod-specific values will be merged with this. | -| defaultPodOptions.nodeSelector | object | `{}` | Node selection constraint [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector) | -| defaultPodOptions.priorityClassName | string | `nil` | Custom priority class for different treatment by the scheduler | -| defaultPodOptions.restartPolicy | string | `Always`. When `controller.type` is `cronjob` it defaults to `Never`. | Set Container restart policy. | -| defaultPodOptions.runtimeClassName | string | `nil` | Allow specifying a runtimeClassName other than the default one (ie: nvidia) | -| defaultPodOptions.schedulerName | string | `nil` | Allows specifying a custom scheduler name | -| defaultPodOptions.securityContext | object | `{}` | Configure the Security Context for the Pod | -| defaultPodOptions.terminationGracePeriodSeconds | string | `nil` | [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle)] | -| defaultPodOptions.tolerations | list | `[]` | Specify taint tolerations [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) | -| defaultPodOptions.topologySpreadConstraints | list | `[]` | Defines topologySpreadConstraint rules. [[ref]](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) | -| global.annotations | object | `{}` | Set additional global annotations. Helm templates can be used. | -| global.fullnameOverride | string | `nil` | Set the entire name definition | -| global.labels | object | `{}` | Set additional global labels. Helm templates can be used. | -| global.nameOverride | string | `nil` | Set an override for the prefix of the fullname | -| ingress | object | See below | Configure the ingresses for the chart here. Additional ingresses can be added by adding a dictionary key similar to the 'main' ingress. | -| ingress.main.annotations | object | `{}` | Provide additional annotations which may be required. | -| ingress.main.className | string | `nil` | Set the ingressClass that is used for this ingress. | -| ingress.main.defaultBackend | string | `nil` | Configure the defaultBackend for this ingress. This will disable any other rules for the ingress. | -| ingress.main.enabled | bool | `false` | Enables or disables the ingress | -| ingress.main.hosts[0].host | string | `"chart-example.local"` | Host address. Helm template can be passed. | -| ingress.main.hosts[0].paths[0].path | string | `"/"` | Path. Helm template can be passed. | -| ingress.main.hosts[0].paths[0].service.name | string | `"main"` | Overrides the service name reference for this path This can be an actual service name, or reference a service identifier from this values.yaml | -| ingress.main.hosts[0].paths[0].service.port | string | `nil` | Overrides the service port number reference for this path | -| ingress.main.labels | object | `{}` | Provide additional labels which may be required. | -| ingress.main.nameOverride | string | `nil` | Override the name suffix that is used for this ingress. | -| ingress.main.primary | bool | `true` | Make this the primary ingress (used in probes, notes, etc...). If there is more than 1 ingress, make sure that only 1 ingress is marked as primary. | -| ingress.main.tls | list | `[]` | Configure TLS for the ingress. Both secretName and hosts can process a Helm template. | -| networkpolicies | object | See below | Configure the networkPolicies for the chart here. Additional networkPolicies can be added by adding a dictionary key similar to the 'main' networkPolicy. | -| networkpolicies.main.controller | string | `"main"` | Configure which controller this networkPolicy should target | -| networkpolicies.main.enabled | bool | `false` | Enables or disables the networkPolicy item. Defaults to true | -| networkpolicies.main.policyTypes | list | `["Ingress","Egress"]` | The policyTypes for this networkPolicy | -| networkpolicies.main.rules | object | `{"egress":[{}],"ingress":[{}]}` | The rulesets for this networkPolicy [[ref]](https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource) | -| networkpolicies.main.rules.egress | list | `[{}]` | The egress rules for this networkPolicy. Allows all egress traffic by default. | -| networkpolicies.main.rules.ingress | list | `[{}]` | The ingress rules for this networkPolicy. Allows all ingress traffic by default. | -| persistence | object | See below | Configure persistence for the chart here. Additional items can be added by adding a dictionary key similar to the 'config' key. [[ref]](https://bjw-s.github.io/helm-charts/docs/common-library/common-library-storage) | -| persistence.config.accessMode | string | `"ReadWriteOnce"` | AccessMode for the persistent volume. Make sure to select an access mode that is supported by your storage provider! [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes) | -| persistence.config.advancedMounts | object | `{}` | Explicitly configure mounts for specific controllers and containers. Example: advancedMounts: main: # the controller with the "main" identifier main: # the container with the "main" identifier - path: /data/config.yaml readOnly: true mountPropagation: None subPath: config.yaml second-container: # the container with the "second-container" identifier - path: /appdata/config readOnly: true second-controller: # the controller with the "second-controller" identifier main: # the container with the "main" identifier - path: /data/config.yaml readOnly: false subPath: config.yaml | -| persistence.config.dataSource | object | `{}` | The optional data source for the persistentVolumeClaim. [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-populators-and-data-sources) | -| persistence.config.dataSourceRef | object | `{}` | The optional volume populator for the persistentVolumeClaim. [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-populators-and-data-sources) | -| persistence.config.enabled | bool | `false` | Enables or disables the persistence item. Defaults to true | -| persistence.config.existingClaim | string | `nil` | If you want to reuse an existing claim, the name of the existing PVC can be passed here. | -| persistence.config.globalMounts | list | `[]` | Configure mounts to all controllers and containers. By default the persistence item will be mounted to `/`. Example: globalMounts: - path: /config readOnly: false | -| persistence.config.retain | bool | `false` | Set to true to retain the PVC upon `helm uninstall` | -| persistence.config.size | string | `"1Gi"` | The amount of storage that is requested for the persistent volume. | -| persistence.config.storageClass | string | `nil` | Storage Class for the config volume. If set to `-`, dynamic provisioning is disabled. If set to something else, the given storageClass is used. If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. | -| persistence.config.type | string | `"persistentVolumeClaim"` | Sets the persistence type Valid options are persistentVolumeClaim, emptyDir, nfs, hostPath, secret, configMap or custom | -| route | object | See below | Configure the gateway routes for the chart here. Additional routes can be added by adding a dictionary key similar to the 'main' route. [[ref]](https://gateway-api.sigs.k8s.io/references/spec/) | -| route.main.annotations | object | `{}` | Provide additional annotations which may be required. | -| route.main.enabled | bool | `false` | Enables or disables the route | -| route.main.hostnames | list | `[]` | Host addresses. Helm template can be passed. | -| route.main.kind | string | `"HTTPRoute"` | Set the route kind Valid options are GRPCRoute, HTTPRoute, TCPRoute, TLSRoute, UDPRoute | -| route.main.labels | object | `{}` | Provide additional labels which may be required. | -| route.main.nameOverride | string | `nil` | Override the name suffix that is used for this route. | -| route.main.parentRefs | list | `[{"group":"gateway.networking.k8s.io","kind":"Gateway","name":null,"namespace":null,"sectionName":null}]` | Configure the resource the route attaches to. | -| route.main.rules | list | `[{"backendRefs":[],"filters":[],"matches":[{"path":{"type":"PathPrefix","value":"/"}}],"timeouts":{}}]` | Configure rules for routing. Defaults to the primary service. | -| route.main.rules[0].backendRefs | list | `[]` | Configure backends where matching requests should be sent. | -| secrets | object | See below | Use this to populate secrets with the values you specify. Be aware that these values are not encrypted by default, and could therefore visible to anybody with access to the values.yaml file. Additional Secrets can be added by adding a dictionary key similar to the 'secret' object. | -| secrets.secret.annotations | object | `{}` | Annotations to add to the Secret | -| secrets.secret.enabled | bool | `false` | Enables or disables the Secret | -| secrets.secret.labels | object | `{}` | Labels to add to the Secret | -| secrets.secret.stringData | object | `{}` | Secret stringData content. Helm template enabled. | -| service | object | See below | Configure the services for the chart here. Additional services can be added by adding a dictionary key similar to the 'main' service. | -| service.main.annotations | object | `{}` | Provide additional annotations which may be required. | -| service.main.controller | string | `"main"` | Configure which controller this service should target | -| service.main.enabled | bool | `true` | Enables or disables the service | -| service.main.externalTrafficPolicy | string | `nil` | [[ref](https://kubernetes.io/docs/tutorials/services/source-ip/)] | -| service.main.extraSelectorLabels | object | `{}` | Allow adding additional match labels | -| service.main.ipFamilies | list | `[]` | The ip families that should be used. Options: IPv4, IPv6 | -| service.main.ipFamilyPolicy | string | `nil` | Specify the ip policy. Options: SingleStack, PreferDualStack, RequireDualStack | -| service.main.labels | object | `{}` | Provide additional labels which may be required. | -| service.main.nameOverride | string | `nil` | Override the name suffix that is used for this service | -| service.main.ports | object | See below | Configure the Service port information here. Additional ports can be added by adding a dictionary key similar to the 'http' service. | -| service.main.ports.http.appProtocol | string | `nil` | Specify the appProtocol value for the Service. [[ref]](https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol) | -| service.main.ports.http.enabled | bool | `true` | Enables or disables the port | -| service.main.ports.http.nodePort | string | `nil` | Specify the nodePort value for the LoadBalancer and NodePort service types. [[ref]](https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport) | -| service.main.ports.http.port | string | `nil` | The port number | -| service.main.ports.http.primary | bool | `true` | Make this the primary port (used in probes, notes, etc...) If there is more than 1 service, make sure that only 1 port is marked as primary. | -| service.main.ports.http.protocol | string | `"HTTP"` | Port protocol. Support values are `HTTP`, `HTTPS`, `TCP` and `UDP`. HTTP and HTTPS spawn a TCP service and get used for internal URL and name generation | -| service.main.ports.http.targetPort | string | `nil` | Specify a service targetPort if you wish to differ the service port from the application port. If `targetPort` is specified, this port number is used in the container definition instead of the `port` value. Therefore named ports are not supported for this field. | -| service.main.primary | bool | `true` | Make this the primary service for this controller (used in probes, notes, etc...). If there is more than 1 service targeting the controller, make sure that only 1 service is marked as primary. | -| service.main.type | string | `"ClusterIP"` | Set the service type | -| serviceAccount.annotations | object | `{}` | Annotations to add to the service account | -| serviceAccount.create | bool | `false` | Specifies whether a service account should be created | -| serviceAccount.labels | object | `{}` | Labels to add to the service account | -| serviceAccount.name | string | `""` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template | -| serviceMonitor | object | See below | Configure the ServiceMonitors for the chart here. Additional ServiceMonitors can be added by adding a dictionary key similar to the 'main' ServiceMonitors. | -| serviceMonitor.main.annotations | object | `{}` | Provide additional annotations which may be required. | -| serviceMonitor.main.enabled | bool | `false` | Enables or disables the serviceMonitor. | -| serviceMonitor.main.endpoints | list | See values.yaml | Configures the endpoints for the serviceMonitor. | -| serviceMonitor.main.labels | object | `{}` | Provide additional labels which may be required. | -| serviceMonitor.main.nameOverride | string | `nil` | Override the name suffix that is used for this serviceMonitor. | -| serviceMonitor.main.selector | object | `{}` | Configures a custom selector for the serviceMonitor, this takes precedence over specifying a service name. Helm templates can be used. | -| serviceMonitor.main.serviceName | string | `"{{ include \"bjw-s.common.lib.chart.names.fullname\" $ }}"` | Configures the target Service for the serviceMonitor. Helm templates can be used. | -| serviceMonitor.main.targetLabels | list | `[]` | Configures custom targetLabels for the serviceMonitor. (All collected meterics will have these labels, taking the value from the target service) [[ref]](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#servicemonitorspec/) | - -
- -## Support - -- See the [Docs](http://bjw-s.github.io/helm-charts/docs/) -- Open an [issue](https://github.com/bjw-s/helm-charts/issues/new/choose) -- Join the k8s-at-home [Discord](https://discord.gg/k8s-at-home) community - ----------------------------------------------- -Autogenerated from chart metadata using [helm-docs v1.11.3](https://github.com/norwoodj/helm-docs/releases/v1.11.3) diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_configmap.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_configmap.tpl deleted file mode 100644 index 3aa492e62..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_configmap.tpl +++ /dev/null @@ -1,32 +0,0 @@ -{{/* -This template serves as a blueprint for all configMap objects that are created -within the common library. -*/}} -{{- define "bjw-s.common.class.configMap" -}} - {{- $rootContext := .rootContext -}} - {{- $configMapObject := .object -}} - - {{- $labels := merge - ($configMapObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($configMapObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ $configMapObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -data: - {{- with $configMapObject.data }} - {{- tpl (toYaml .) $rootContext | nindent 2 }} - {{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_cronjob.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_cronjob.tpl deleted file mode 100644 index 829f54fc0..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_cronjob.tpl +++ /dev/null @@ -1,61 +0,0 @@ -{{/* -This template serves as a blueprint for Cronjob objects that are created -using the common library. -*/}} -{{- define "bjw-s.common.class.cronjob" -}} - {{- $rootContext := .rootContext -}} - {{- $cronjobObject := .object -}} - - {{- $timeZone := "" -}} - {{- if ge (int $rootContext.Capabilities.KubeVersion.Minor) 27 }} - {{- $timeZone = dig "cronjob" "timeZone" "" $cronjobObject -}} - {{- end -}} - - {{- $labels := merge - (dict "app.kubernetes.io/component" $cronjobObject.identifier) - ($cronjobObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($cronjobObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: batch/v1 -kind: CronJob -metadata: - name: {{ $cronjobObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - {{- with $cronjobObject.cronjob.suspend }} - suspend: {{ ternary "true" "false" . }} - {{- end }} - concurrencyPolicy: "{{ $cronjobObject.cronjob.concurrencyPolicy }}" - startingDeadlineSeconds: {{ $cronjobObject.cronjob.startingDeadlineSeconds }} - {{- with $timeZone }} - timeZone: "{{ . }}" - {{- end }} - schedule: "{{ $cronjobObject.cronjob.schedule }}" - successfulJobsHistoryLimit: {{ $cronjobObject.cronjob.successfulJobsHistory }} - failedJobsHistoryLimit: {{ $cronjobObject.cronjob.failedJobsHistory }} - jobTemplate: - spec: - {{- with $cronjobObject.cronjob.ttlSecondsAfterFinished }} - ttlSecondsAfterFinished: {{ . }} - {{- end }} - backoffLimit: {{ $cronjobObject.cronjob.backoffLimit }} - template: - metadata: - {{- with (include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $cronjobObject)) }} - annotations: {{ . | nindent 12 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $cronjobObject)) }} - labels: {{ . | nindent 12 }} - {{- end }} - spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $cronjobObject) | nindent 10 }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_daemonset.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_daemonset.tpl deleted file mode 100644 index cdb26fb84..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_daemonset.tpl +++ /dev/null @@ -1,40 +0,0 @@ -{{/* -This template serves as the blueprint for the DaemonSet objects that are created -within the common library. -*/}} -{{- define "bjw-s.common.class.daemonset" -}} - {{- $rootContext := .rootContext -}} - {{- $daemonsetObject := .object -}} - - {{- $labels := merge - (dict "app.kubernetes.io/component" $daemonsetObject.identifier) - ($daemonsetObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($daemonsetObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: {{ $daemonsetObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - revisionHistoryLimit: {{ $daemonsetObject.revisionHistoryLimit }} - selector: - matchLabels: - app.kubernetes.io/component: {{ $daemonsetObject.identifier }} - {{- include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | nindent 6 }} - template: - metadata: - annotations: {{ include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $daemonsetObject) | nindent 8 }} - labels: {{ include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $daemonsetObject) | nindent 8 }} - spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $daemonsetObject) | nindent 6 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_deployment.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_deployment.tpl deleted file mode 100644 index ee0a829c4..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_deployment.tpl +++ /dev/null @@ -1,60 +0,0 @@ -{{/* -This template serves as a blueprint for Deployment objects that are created -using the common library. -*/}} -{{- define "bjw-s.common.class.deployment" -}} - {{- $rootContext := .rootContext -}} - {{- $deploymentObject := .object -}} - - {{- $labels := merge - (dict "app.kubernetes.io/component" $deploymentObject.identifier) - ($deploymentObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($deploymentObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ $deploymentObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - revisionHistoryLimit: {{ $deploymentObject.revisionHistoryLimit }} - {{- if not (eq $deploymentObject.replicas nil) }} - replicas: {{ $deploymentObject.replicas }} - {{- end }} - strategy: - type: {{ $deploymentObject.strategy }} - {{- with $deploymentObject.rollingUpdate }} - {{- if and (eq $deploymentObject.strategy "RollingUpdate") (or .surge .unavailable) }} - rollingUpdate: - {{- with .unavailable }} - maxUnavailable: {{ . }} - {{- end }} - {{- with .surge }} - maxSurge: {{ . }} - {{- end }} - {{- end }} - {{- end }} - selector: - matchLabels: - app.kubernetes.io/component: {{ $deploymentObject.identifier }} - {{- include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | nindent 6 }} - template: - metadata: - {{- with (include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $deploymentObject)) }} - annotations: {{ . | nindent 8 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $deploymentObject)) }} - labels: {{ . | nindent 8 }} - {{- end }} - spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $deploymentObject) | nindent 6 }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_ingress.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_ingress.tpl deleted file mode 100644 index 841cd33e2..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_ingress.tpl +++ /dev/null @@ -1,85 +0,0 @@ -{{/* -This template serves as a blueprint for all Ingress objects that are created -within the common library. -*/}} - -{{- define "bjw-s.common.class.ingress" -}} - {{- $rootContext := .rootContext -}} - {{- $ingressObject := .object -}} - - {{- $labels := merge - ($ingressObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($ingressObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: {{ $ingressObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - {{- if $ingressObject.className }} - ingressClassName: {{ $ingressObject.className }} - {{- end }} - {{- if $ingressObject.tls }} - tls: - {{- range $ingressObject.tls }} - - hosts: - {{- range .hosts }} - - {{ tpl . $rootContext | quote }} - {{- end }} - {{- $secretName := tpl (default "" .secretName) $rootContext }} - {{- if $secretName }} - secretName: {{ $secretName | quote}} - {{- end }} - {{- end }} - {{- end }} - {{- if $ingressObject.defaultBackend }} - defaultBackend: {{ $ingressObject.defaultBackend }} - {{- else }} - rules: - {{- range $ingressObject.hosts }} - - host: {{ tpl .host $rootContext | quote }} - http: - paths: - {{- range .paths }} - - path: {{ tpl .path $rootContext | quote }} - pathType: {{ default "Prefix" .pathType }} - backend: - service: - {{ $service := include "bjw-s.common.lib.service.getByIdentifier" (dict "rootContext" $rootContext "id" .service.name) | fromYaml -}} - {{ $servicePort := 0 -}} - - {{ if empty (dig "port" nil .service) -}} - {{/* Default to the Service primary port if no port has been specified */ -}} - {{ if $service -}} - {{ $defaultServicePort := include "bjw-s.common.lib.service.primaryPort" (dict "rootContext" $rootContext "serviceObject" $service) | fromYaml -}} - {{ if $defaultServicePort -}} - {{ $servicePort = $defaultServicePort.port -}} - {{ end -}} - {{ end -}} - {{ else -}} - {{/* If a port number is given, use that */ -}} - {{ if kindIs "float64" .service.port -}} - {{ $servicePort = .service.port -}} - {{ else if kindIs "string" .service.port -}} - {{/* If a port name is given, try to resolve to a number */ -}} - {{ $servicePort = include "bjw-s.common.lib.service.getPortNumberByName" (dict "rootContext" $rootContext "serviceID" .service.name "portName" .service.port) -}} - {{ end -}} - {{ end -}} - name: {{ default .service.name $service.name }} - port: - number: {{ $servicePort }} - {{- end }} - {{- end }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_job.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_job.tpl deleted file mode 100644 index 9c8a99ece..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_job.tpl +++ /dev/null @@ -1,46 +0,0 @@ -{{/* -This template serves as the blueprint for the job objects that are created -within the common library. -*/}} -{{- define "bjw-s.common.class.job" -}} - {{- $rootContext := .rootContext -}} - {{- $jobObject := .object -}} - - {{- $labels := merge - (dict "app.kubernetes.io/component" $jobObject.identifier) - ($jobObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($jobObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ $jobObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - {{- with $jobObject.job.suspend }} - suspend: {{ ternary "true" "false" . }} - {{- end }} - {{- with $jobObject.job.ttlSecondsAfterFinished }} - ttlSecondsAfterFinished: {{ . }} - {{- end }} - backoffLimit: {{ $jobObject.job.backoffLimit }} - template: - metadata: - {{- with (include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $jobObject)) }} - annotations: {{ . | nindent 8 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $jobObject)) }} - labels: {{ . | nindent 8 }} - {{- end }} - spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $jobObject) | nindent 6 }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_networkpolicy.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_networkpolicy.tpl deleted file mode 100644 index 0854d145e..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_networkpolicy.tpl +++ /dev/null @@ -1,49 +0,0 @@ -{{/* -This template serves as a blueprint for all networkPolicy objects that are created -within the common library. -*/}} -{{- define "bjw-s.common.class.networkpolicy" -}} - {{- $rootContext := .rootContext -}} - {{- $networkPolicyObject := .object -}} - - {{- $labels := merge - ($networkPolicyObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($networkPolicyObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} - {{- $podSelector := dict -}} - {{- if (hasKey $networkPolicyObject "podSelector") -}} - {{- $podSelector = $networkPolicyObject.podSelector -}} - {{- else -}} - {{- $podSelector = dict "matchLabels" (merge - ($networkPolicyObject.extraSelectorLabels | default dict) - (dict "app.kubernetes.io/component" $networkPolicyObject.controller) - (include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | fromYaml) - ) -}} - {{- end -}} ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: {{ $networkPolicyObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - podSelector: {{- toYaml $podSelector | nindent 4 }} - {{- with $networkPolicyObject.policyTypes }} - policyTypes: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $networkPolicyObject.rules.ingress }} - ingress: {{- tpl (toYaml .) $rootContext | nindent 4 -}} - {{- end }} - {{- with $networkPolicyObject.rules.egress }} - egress: {{- tpl (toYaml .) $rootContext | nindent 4 -}} - {{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_pvc.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_pvc.tpl deleted file mode 100644 index 1c6ee9c17..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_pvc.tpl +++ /dev/null @@ -1,53 +0,0 @@ -{{/* -This template serves as a blueprint for all PersistentVolumeClaim objects that are created -within the common library. -*/}} -{{- define "bjw-s.common.class.pvc" -}} - {{- $rootContext := .rootContext -}} - {{- $pvcObject := .object -}} - - {{- $labels := merge - ($pvcObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($pvcObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} - {{- if $pvcObject.retain }} - {{- $annotations = merge - (dict "helm.sh/resource-policy" "keep") - $annotations - -}} - {{- end -}} - ---- -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ $pvcObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - accessModes: - - {{ required (printf "accessMode is required for PVC %v" $pvcObject.name) $pvcObject.accessMode | quote }} - resources: - requests: - storage: {{ required (printf "size is required for PVC %v" $pvcObject.name) $pvcObject.size | quote }} - {{- if $pvcObject.storageClass }} - storageClassName: {{ if (eq "-" $pvcObject.storageClass) }}""{{- else }}{{ $pvcObject.storageClass | quote }}{{- end }} - {{- end }} - {{- if $pvcObject.volumeName }} - volumeName: {{ $pvcObject.volumeName | quote }} - {{- end }} - {{- with $pvcObject.dataSource }} - dataSource: {{- tpl (toYaml .) $rootContext | nindent 10 }} - {{- end }} - {{- with $pvcObject.dataSourceRef }} - dataSourceRef: {{- tpl (toYaml .) $rootContext | nindent 10 }} - {{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_route.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_route.tpl deleted file mode 100644 index 123bc5fef..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_route.tpl +++ /dev/null @@ -1,86 +0,0 @@ -{{/* -This template serves as a blueprint for all Route objects that are created -within the common library. -*/}} -{{- define "bjw-s.common.class.route" -}} - {{- $rootContext := .rootContext -}} - {{- $routeObject := .object -}} - - {{- $routeKind := $routeObject.kind | default "HTTPRoute" -}} - {{- $apiVersion := "gateway.networking.k8s.io/v1alpha2" -}} - {{- if $rootContext.Capabilities.APIVersions.Has (printf "gateway.networking.k8s.io/v1beta1/%s" $routeKind) }} - {{- $apiVersion = "gateway.networking.k8s.io/v1beta1" -}} - {{- end -}} - {{- if $rootContext.Capabilities.APIVersions.Has (printf "gateway.networking.k8s.io/v1/%s" $routeKind) }} - {{- $apiVersion = "gateway.networking.k8s.io/v1" -}} - {{- end -}} - {{- $labels := merge - ($routeObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($routeObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: {{ $apiVersion }} -kind: {{ $routeKind }} -metadata: - name: {{ $routeObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - parentRefs: - {{- range $routeObject.parentRefs }} - - group: {{ default "gateway.networking.k8s.io" .group }} - kind: {{ default "Gateway" .kind }} - name: {{ required (printf "parentRef name is required for %v %v" $routeKind $routeObject.name) .name }} - namespace: {{ required (printf "parentRef namespace is required for %v %v" $routeKind $routeObject.name) .namespace }} - {{- if .sectionName }} - sectionName: {{ .sectionName | quote }} - {{- end }} - {{- end }} - {{- if and (ne $routeKind "TCPRoute") (ne $routeKind "UDPRoute") $routeObject.hostnames }} - hostnames: - {{- range $routeObject.hostnames }} - - {{ tpl . $rootContext | quote }} - {{- end }} - {{- end }} - rules: - {{- range $routeObject.rules }} - - backendRefs: - {{- range .backendRefs }} - {{ $service := include "bjw-s.common.lib.service.getByIdentifier" (dict "rootContext" $rootContext "id" .name) | fromYaml -}} - {{ $servicePrimaryPort := dict -}} - {{ if $service -}} - {{ $servicePrimaryPort = include "bjw-s.common.lib.service.primaryPort" (dict "rootContext" $rootContext "serviceObject" $service) | fromYaml -}} - {{- end }} - - group: {{ default "" .group | quote}} - kind: {{ default "Service" .kind }} - name: {{ default .name $service.name }} - namespace: {{ default $rootContext.Release.Namespace .namespace }} - port: {{ default .port $servicePrimaryPort.port }} - weight: {{ default 1 .weight }} - {{- end }} - {{- if or (eq $routeKind "HTTPRoute") (eq $routeKind "GRPCRoute") }} - {{- with .matches }} - matches: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .filters }} - filters: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- end }} - {{- if (eq $routeKind "HTTPRoute") }} - {{- with .timeouts }} - timeouts: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- end }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_secret.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_secret.tpl deleted file mode 100644 index a46fe534d..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_secret.tpl +++ /dev/null @@ -1,39 +0,0 @@ -{{/* -This template serves as a blueprint for all Secret objects that are created -within the common library. -*/}} -{{- define "bjw-s.common.class.secret" -}} - {{- $rootContext := .rootContext -}} - {{- $secretObject := .object -}} - - {{- $labels := merge - ($secretObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($secretObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} - - {{- $stringData := "" -}} - {{- with $secretObject.stringData -}} - {{- $stringData = (toYaml $secretObject.stringData) | trim -}} - {{- end -}} ---- -apiVersion: v1 -kind: Secret -{{- with $secretObject.type }} -type: {{ . }} -{{- end }} -metadata: - name: {{ $secretObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -{{- with $stringData }} -stringData: {{- tpl $stringData $rootContext | nindent 2 }} -{{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_service.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_service.tpl deleted file mode 100644 index 223e82b7f..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_service.tpl +++ /dev/null @@ -1,104 +0,0 @@ -{{/* -This template serves as a blueprint for all Service objects that are created -within the common library. -*/}} -{{- define "bjw-s.common.class.service" -}} - {{- $rootContext := .rootContext -}} - {{- $serviceObject := .object -}} - - {{- $svcType := $serviceObject.type | default "" -}} - {{- $enabledPorts := include "bjw-s.common.lib.service.enabledPorts" (dict "rootContext" $rootContext "serviceObject" $serviceObject) | fromYaml }} - {{- $labels := merge - (dict "app.kubernetes.io/service" $serviceObject.name) - ($serviceObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($serviceObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ $serviceObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - {{- if (or (eq $svcType "ClusterIP") (empty $svcType)) }} - type: ClusterIP - {{- if $serviceObject.clusterIP }} - clusterIP: {{ $serviceObject.clusterIP }} - {{end}} - {{- else if eq $svcType "LoadBalancer" }} - type: {{ $svcType }} - {{- if $serviceObject.loadBalancerIP }} - loadBalancerIP: {{ $serviceObject.loadBalancerIP }} - {{- end }} - {{- if $serviceObject.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{ toYaml $serviceObject.loadBalancerSourceRanges | nindent 4 }} - {{- end -}} - {{- else }} - type: {{ $svcType }} - {{- end }} - {{- if $serviceObject.externalTrafficPolicy }} - externalTrafficPolicy: {{ $serviceObject.externalTrafficPolicy }} - {{- end }} - {{- if hasKey $serviceObject "allocateLoadBalancerNodePorts" }} - allocateLoadBalancerNodePorts: {{ $serviceObject.allocateLoadBalancerNodePorts }} - {{- end }} - {{- if $serviceObject.sessionAffinity }} - sessionAffinity: {{ $serviceObject.sessionAffinity }} - {{- if $serviceObject.sessionAffinityConfig }} - sessionAffinityConfig: - {{ toYaml $serviceObject.sessionAffinityConfig | nindent 4 }} - {{- end -}} - {{- end }} - {{- with $serviceObject.externalIPs }} - externalIPs: - {{- toYaml . | nindent 4 }} - {{- end }} - {{- if $serviceObject.publishNotReadyAddresses }} - publishNotReadyAddresses: {{ $serviceObject.publishNotReadyAddresses }} - {{- end }} - {{- if $serviceObject.ipFamilyPolicy }} - ipFamilyPolicy: {{ $serviceObject.ipFamilyPolicy }} - {{- end }} - {{- with $serviceObject.ipFamilies }} - ipFamilies: - {{ toYaml . | nindent 4 }} - {{- end }} - ports: - {{- range $name, $port := $enabledPorts }} - - port: {{ $port.port }} - targetPort: {{ $port.targetPort | default $port.port }} - {{- if $port.protocol }} - {{- if or ( eq $port.protocol "HTTP" ) ( eq $port.protocol "HTTPS" ) ( eq $port.protocol "TCP" ) }} - protocol: TCP - {{- else }} - protocol: {{ $port.protocol }} - {{- end }} - {{- else }} - protocol: TCP - {{- end }} - name: {{ $name }} - {{- if (and (eq $svcType "NodePort") (not (empty $port.nodePort))) }} - nodePort: {{ $port.nodePort }} - {{ end }} - {{- if (not (empty $port.appProtocol)) }} - appProtocol: {{ $port.appProtocol }} - {{ end }} - {{- end -}} - {{- with (merge - ($serviceObject.extraSelectorLabels | default dict) - (dict "app.kubernetes.io/component" $serviceObject.controller) - (include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | fromYaml) - ) }} - selector: {{- toYaml . | nindent 4 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_serviceAccount.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_serviceAccount.tpl deleted file mode 100644 index 2b109ad0c..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_serviceAccount.tpl +++ /dev/null @@ -1,30 +0,0 @@ -{{/* -This template serves as a blueprint for ServiceAccount objects that are created -using the common library. -*/}} -{{- define "bjw-s.common.class.serviceAccount" -}} - {{- $rootContext := .rootContext -}} - {{- $serviceAccountObject := .object -}} - - {{- $labels := merge - ($serviceAccountObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($serviceAccountObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ $serviceAccountObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -secrets: - - name: {{ include "bjw-s.common.lib.chart.names.fullname" $rootContext }}-sa-token -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_serviceMonitor.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_serviceMonitor.tpl deleted file mode 100644 index b14186081..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_serviceMonitor.tpl +++ /dev/null @@ -1,37 +0,0 @@ -{{- define "bjw-s.common.class.serviceMonitor" -}} - {{- $rootContext := .rootContext -}} - {{- $serviceMonitorObject := .object -}} - {{- $labels := merge - ($serviceMonitorObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($serviceMonitorObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ $serviceMonitorObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - selector: - {{- if $serviceMonitorObject.selector -}} - {{- tpl ($serviceMonitorObject.selector | toYaml) $rootContext | nindent 4}} - {{- else }} - matchLabels: - app.kubernetes.io/service: {{ tpl $serviceMonitorObject.serviceName $rootContext }} - {{- include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | nindent 6 }} - {{- end }} - endpoints: {{- toYaml $serviceMonitorObject.endpoints | nindent 4 }} - {{- if not (empty $serviceMonitorObject.targetLabels )}} - targetLabels: - {{- toYaml $serviceMonitorObject.targetLabels | nindent 4 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_statefulset.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_statefulset.tpl deleted file mode 100644 index bdcf48a3f..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/classes/_statefulset.tpl +++ /dev/null @@ -1,56 +0,0 @@ -{{/* -This template serves as the blueprint for the StatefulSet objects that are created -within the common library. -*/}} -{{- define "bjw-s.common.class.statefulset" -}} - {{- $rootContext := .rootContext -}} - {{- $statefulsetObject := .object -}} - - {{- $labels := merge - (dict "app.kubernetes.io/component" $statefulsetObject.identifier) - ($statefulsetObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($statefulsetObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ $statefulsetObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - revisionHistoryLimit: {{ $statefulsetObject.revisionHistoryLimit }} - replicas: {{ $statefulsetObject.replicas }} - podManagementPolicy: {{ dig "statefulset" "podManagementPolicy" "OrderedReady" $statefulsetObject }} - updateStrategy: - type: {{ $statefulsetObject.strategy }} - {{- if and (eq $statefulsetObject.strategy "RollingUpdate") (dig "rollingUpdate" "partition" nil $statefulsetObject) }} - rollingUpdate: - partition: {{ $statefulsetObject.rollingUpdate.partition }} - {{- end }} - selector: - matchLabels: - app.kubernetes.io/component: {{ $statefulsetObject.identifier }} - {{- include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | nindent 6 }} - serviceName: {{ include "bjw-s.common.lib.chart.names.fullname" $rootContext }} - template: - metadata: - {{- with (include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $statefulsetObject)) }} - annotations: {{ . | nindent 8 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $statefulsetObject)) }} - labels: {{ . | nindent 8 }} - {{- end }} - spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $statefulsetObject) | nindent 6 }} - {{- with (include "bjw-s.common.lib.statefulset.volumeclaimtemplates" (dict "rootContext" $rootContext "statefulsetObject" $statefulsetObject)) }} - volumeClaimTemplates: {{ . | nindent 4 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_getMapItemsWithKey.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_getMapItemsWithKey.tpl deleted file mode 100644 index 0a65d4dc8..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_getMapItemsWithKey.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{/* -Returns the items in a map that have a certain key -*/}} -{{- define "bjw-s.common.lib.getMapItemsWithKey" -}} - {{- $map := .map -}} - {{- $keyToFind := .key -}} - {{- $output := dict -}} - - {{- if not (empty $keyToFind) -}} - {{- range $key, $item := $map -}} - {{- if not (empty (dig $keyToFind nil $item)) -}} - {{- $_ := set $output $key $item -}} - {{- end -}} - {{- end -}} - {{- end -}} - {{- $output | toYaml -}} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_kahn.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_kahn.tpl deleted file mode 100644 index 319a05c87..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_kahn.tpl +++ /dev/null @@ -1,35 +0,0 @@ -{{/* -Implementation of Kahn's algorithm based on -https://en.wikipedia.org/wiki/Topological_sorting#Kahn's_algorithm - -source: https://github.com/dastrobu/helm-charts/blob/main/environment-variables/templates/_kahn.tpl -*/}} -{{- define "bjw-s.common.lib.kahn" -}} - {{- $graph := .graph -}} - {{- if empty $graph -}} - {{- $_ := set . "out" list -}} - {{- else -}} - {{- $S := list -}} - - {{- range $node, $edges := $graph -}} - {{- if empty $edges -}} - {{- $S = append $S $node -}} - {{- end -}} - {{- end -}} - - {{- if empty $S -}} - {{- fail (printf "graph is cyclic or has bad edge definitions. Remaining graph is:\n%s" ( .graph | toYaml ) ) }} - {{- end -}} - - {{- $n := first $S -}} - {{- $_ := unset $graph $n -}} - - {{- range $node, $edges := $graph -}} - {{- $_ := set $graph $node ( without $edges $n ) -}} - {{- end -}} - - {{- $args := dict "graph" $graph "out" list -}} - {{- include "bjw-s.common.lib.kahn" $args -}} - {{- $_ = set . "out" ( concat ( list $n ) $args.out ) -}} - {{- end -}} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_names.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_names.tpl deleted file mode 100644 index 15725e512..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/chart/_names.tpl +++ /dev/null @@ -1,35 +0,0 @@ -{{/* Expand the name of the chart */}} -{{- define "bjw-s.common.lib.chart.names.name" -}} - {{- $globalNameOverride := get .Values.global "nameOverride" -}} - {{- $nameOverride := get .Values "nameOverride" -}} - {{- $name := $globalNameOverride | default $nameOverride | default .Chart.Name -}} - {{- $name | toString | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "bjw-s.common.lib.chart.names.fullname" -}} - {{- $name := include "bjw-s.common.lib.chart.names.name" . -}} - {{- $globalFullNameOverride := get .Values.global "fullnameOverride" -}} - {{- $fullNameOverride := get .Values "fullnameOverride" -}} - - {{- if or $fullNameOverride $globalFullNameOverride -}} - {{- $name = ($globalFullNameOverride | default $fullNameOverride) -}} - {{- else -}} - {{- if contains $name .Release.Name -}} - {{- $name = .Release.Name -}} - {{- else -}} - {{- $name = printf "%s-%s" .Release.Name $name -}} - {{- end -}} - {{- end -}} - - {{- $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* Create chart name and version as used by the chart label */}} -{{- define "bjw-s.common.lib.chart.names.chart" -}} - {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_getByIdentifier.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_getByIdentifier.tpl deleted file mode 100644 index 87b10a3b1..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_getByIdentifier.tpl +++ /dev/null @@ -1,12 +0,0 @@ -{{/* -Return a configMap Object by its Identifier. -*/}} -{{- define "bjw-s.common.lib.configMap.getByIdentifier" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - - {{- $configMapValues := dig $identifier nil $rootContext.Values.configMaps -}} - {{- if not (empty $configMapValues) -}} - {{- include "bjw-s.common.lib.configMap.valuesToObject" (dict "rootContext" $rootContext "id" $identifier "values" $configMapValues) -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_validate.tpl deleted file mode 100644 index c61c70441..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_validate.tpl +++ /dev/null @@ -1,7 +0,0 @@ -{{/* -Validate configMap values -*/}} -{{- define "bjw-s.common.lib.configMap.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $configMapValues := .object -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_valuesToObject.tpl deleted file mode 100644 index 1cad88337..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/configMap/_valuesToObject.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Convert configMap values to an object -*/}} -{{- define "bjw-s.common.lib.configMap.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Determine and inject the configMap name */ -}} - {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - - {{- if $objectValues.nameOverride -}} - {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} - {{- else -}} - {{- if ne $identifier "main" -}} - {{- $objectName = printf "%s-%s" $objectName $identifier -}} - {{- end -}} - {{- end -}} - {{- $_ := set $objectValues "name" $objectName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Return the configMap object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_spec.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_spec.tpl deleted file mode 100644 index 9dfd3d43c..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_spec.tpl +++ /dev/null @@ -1,54 +0,0 @@ -{{- /* -The container definition included in the Pod. -*/ -}} -{{- define "bjw-s.common.lib.container.spec" -}} - {{- $rootContext := .rootContext -}} - {{- $controllerObject := .controllerObject -}} - {{- $containerObject := .containerObject -}} - {{- $ctx := dict "rootContext" $rootContext "controllerObject" $controllerObject "containerObject" $containerObject -}} - -name: {{ include "bjw-s.common.lib.container.field.name" (dict "ctx" $ctx) | trim }} -image: {{ include "bjw-s.common.lib.container.field.image" (dict "ctx" $ctx) | trim }} - {{- with $containerObject.image.pullPolicy }} -imagePullPolicy: {{ . | trim }} - {{- end -}} - {{- with (include "bjw-s.common.lib.container.field.command" (dict "ctx" $ctx) | trim) }} -command: {{ . | trim | nindent 2 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.container.field.args" (dict "ctx" $ctx) | trim) }} -args: {{ . | trim | nindent 2 }} - {{- end -}} - {{- with $containerObject.workingDir }} -workingDir: {{ . | trim }} - {{- end -}} - {{- with $containerObject.securityContext }} -securityContext: {{ toYaml . | trim | nindent 2 }} - {{- end -}} - {{- with $containerObject.lifecycle }} -lifecycle: {{ toYaml . | trim | nindent 2 }} - {{- end -}} - {{- with $containerObject.terminationMessagePath }} -terminationMessagePath: {{ . | trim }} - {{- end -}} - {{- with $containerObject.terminationMessagePolicy }} -terminationMessagePolicy: {{ . | trim }} - {{- end -}} - {{- with (include "bjw-s.common.lib.container.field.env" (dict "ctx" $ctx) | trim) }} -env: {{ . | trim | nindent 2 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.container.field.envFrom" (dict "ctx" $ctx) | trim) }} -envFrom: {{ . | trim | nindent 2 }} - {{- end -}} - {{- with $containerObject.ports }} -ports: {{ toYaml . | trim | nindent 2 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.container.field.probes" (dict "ctx" $ctx) | trim) }} - {{- . | trim | nindent 0 -}} - {{- end -}} - {{- with $containerObject.resources }} -resources: {{ toYaml . | trim | nindent 2 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.container.field.volumeMounts" (dict "ctx" $ctx) | trim) }} -volumeMounts: {{ . | trim | nindent 2 }} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_validate.tpl deleted file mode 100644 index 6b3176bee..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_validate.tpl +++ /dev/null @@ -1,20 +0,0 @@ -{{/* -Validate container values -*/}} -{{- define "bjw-s.common.lib.container.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $controllerObject := .controllerObject -}} - {{- $containerObject := .containerObject -}} - - {{- if not (kindIs "map" $containerObject.image) -}} - {{- fail (printf "Image required to be a dictionary with repository and tag fields. (controller %s, container %s)" $controllerObject.identifier $containerObject.identifier) }} - {{- end -}} - - {{- if empty (dig "image" "repository" nil $containerObject) -}} - {{- fail (printf "No image repository specified for container. (controller %s, container %s)" $controllerObject.identifier $containerObject.identifier) }} - {{- end -}} - - {{- if empty (dig "image" "tag" nil $containerObject) -}} - {{- fail (printf "No image tag specified for container. (controller %s, container %s)" $controllerObject.identifier $containerObject.identifier) }} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_valuesToObject.tpl deleted file mode 100644 index 50b9e2f50..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/_valuesToObject.tpl +++ /dev/null @@ -1,27 +0,0 @@ -{{/* -Convert container values to an object -*/}} -{{- define "bjw-s.common.lib.container.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Process image tags */ -}} - {{- if kindIs "map" $objectValues.image -}} - {{- $imageTag := dig "image" "tag" "" $objectValues -}} - {{- /* Convert float64 image tags to string */ -}} - {{- if kindIs "float64" $imageTag -}} - {{- $imageTag = $imageTag | toString -}} - {{- end -}} - - {{- /* Process any templates in the tag */ -}} - {{- $imageTag = tpl $imageTag $rootContext -}} - - {{- $_ := set $objectValues.image "tag" $imageTag -}} - {{- end -}} - - {{- /* Return the container object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_args.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_args.tpl deleted file mode 100644 index 172e444ee..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_args.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{{/* -Args used by the container. -*/}} -{{- define "bjw-s.common.lib.container.field.args" -}} - {{- $ctx := .ctx -}} - {{- $containerObject := $ctx.containerObject -}} - - {{- /* Default to empty list */ -}} - {{- $args := list -}} - - {{- /* See if an override is desired */ -}} - {{- if not (empty (get $containerObject "args")) -}} - {{- $option := get $containerObject "args" -}} - {{- if not (empty $option) -}} - {{- if kindIs "string" $option -}} - {{- $args = append $args $option -}} - {{- else -}} - {{- $args = $option -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- if not (empty $args) -}} - {{- $args | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_command.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_command.tpl deleted file mode 100644 index 67e3b65bc..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_command.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{{/* -Command used by the container. -*/}} -{{- define "bjw-s.common.lib.container.field.command" -}} - {{- $ctx := .ctx -}} - {{- $containerObject := $ctx.containerObject -}} - - {{- /* Default to empty list */ -}} - {{- $command := list -}} - - {{- /* See if an override is desired */ -}} - {{- if not (empty (get $containerObject "command")) -}} - {{- $option := get $containerObject "command" -}} - {{- if not (empty $option) -}} - {{- if kindIs "string" $option -}} - {{- $command = append $command $option -}} - {{- else -}} - {{- $command = $option -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- if not (empty $command) -}} - {{- $command | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_env.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_env.tpl deleted file mode 100644 index 72973fb2a..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_env.tpl +++ /dev/null @@ -1,82 +0,0 @@ -{{/* -Env field used by the container. -*/}} -{{- define "bjw-s.common.lib.container.field.env" -}} - {{- $ctx := .ctx -}} - {{- $rootContext := $ctx.rootContext -}} - {{- $containerObject := $ctx.containerObject -}} - - {{- /* Default to empty list */ -}} - {{- $envList := list -}} - - {{- /* See if an override is desired */ -}} - {{- if not (empty (get $containerObject "env")) -}} - {{- if kindIs "slice" $containerObject.env -}} - {{- /* Env is a list so we assume the order is already as desired */ -}} - {{- range $name, $var := $containerObject.env -}} - {{- if kindIs "int" $name -}} - {{- $name = required "environment variables as a list of maps require a name field" $var.name -}} - {{- end -}} - {{- end -}} - {{- $envList = $containerObject.env -}} - {{- else -}} - {{- /* Env is a map so we must check if ordering is desired */ -}} - {{- $graph := dict -}} - - {{- range $name, $var := $containerObject.env -}} - {{- if kindIs "map" $var -}} - {{- /* Value is a map so ordering can be specified */ -}} - {{- if empty (dig "dependsOn" nil $var) -}} - {{- $_ := set $graph $name ( list ) -}} - {{- else if kindIs "string" $var.dependsOn -}} - {{- $_ := set $graph $name ( list $var.dependsOn ) -}} - {{- else if kindIs "slice" $var.dependsOn -}} - {{- $_ := set $graph $name $var.dependsOn -}} - {{- end -}} - {{- else -}} - {{- /* Value is not a map so no ordering can be specified */ -}} - {{- $_ := set $graph $name ( list ) -}} - {{- end -}} - {{- end -}} - - {{- $args := dict "graph" $graph "out" list -}} - {{- include "bjw-s.common.lib.kahn" $args -}} - - {{- range $name := $args.out -}} - {{- $envItem := dict "name" $name -}} - {{- $envValue := get $containerObject.env $name -}} - - {{- if kindIs "map" $envValue -}} - {{- $envItem := merge $envItem (omit $envValue "dependsOn") -}} - {{- else -}} - {{- $_ := set $envItem "value" $envValue -}} - {{- end -}} - - {{- $envList = append $envList $envItem -}} - {{- end -}} - - {{- $args = dict -}} - {{- end -}} - {{- end -}} - - {{- if not (empty $envList) -}} - {{- $output := list -}} - {{- range $envList -}} - {{- if hasKey . "value" -}} - {{- if kindIs "string" .value -}} - {{- $output = append $output (dict "name" .name "value" (tpl .value $rootContext)) -}} - {{- else if or (kindIs "float64" .value) (kindIs "bool" .value) -}} - {{- $output = append $output (dict "name" .name "value" (.value | toString)) -}} - {{- else -}} - {{- $output = append $output (dict "name" .name "value" .value) -}} - {{- end -}} - {{- else if hasKey . "valueFrom" -}} - {{- $parsedValue := (tpl (.valueFrom | toYaml) $rootContext) | fromYaml -}} - {{- $output = append $output (dict "name" .name "valueFrom" $parsedValue) -}} - {{- else -}} - {{- $output = append $output (dict "name" .name "valueFrom" (omit . "name")) -}} - {{- end -}} - {{- end -}} - {{- $output | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_envFrom.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_envFrom.tpl deleted file mode 100644 index 84e731291..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_envFrom.tpl +++ /dev/null @@ -1,58 +0,0 @@ -{{/* -Env field used by the container. -*/}} -{{- define "bjw-s.common.lib.container.field.envFrom" -}} - {{- $ctx := .ctx -}} - {{- $rootContext := $ctx.rootContext -}} - {{- $containerObject := $ctx.containerObject -}} - - {{- if not (empty (get $containerObject "envFrom")) -}} - {{- $envFrom := list -}} - {{- range $containerObject.envFrom -}} - {{- $item := dict -}} - - {{- if hasKey . "configMap" -}} - {{- $configMap := include "bjw-s.common.lib.configMap.getByIdentifier" (dict "rootContext" $rootContext "id" .configMap) | fromYaml -}} - {{- $configMapName := default (tpl .configMap $rootContext) $configMap.name -}} - {{- $_ := set $item "configMapRef" (dict "name" $configMapName) -}} - {{- else if hasKey . "configMapRef" -}} - {{- if not (empty (dig "identifier" nil .configMapRef)) -}} - {{- $configMap := include "bjw-s.common.lib.configMap.getByIdentifier" (dict "rootContext" $rootContext "id" .configMapRef.identifier) | fromYaml -}} - {{- if empty $configMap -}} - {{- fail (printf "No configMap configured with identifier '%s'" .configMapRef.identifier) -}} - {{- end -}} - - {{- $_ := set $item "configMapRef" (dict "name" $configMap.name) -}} - {{- else -}} - {{- $_ := set $item "configMapRef" (dict "name" (tpl .configMapRef.name $rootContext)) -}} - {{- end -}} - - {{- else if hasKey . "secret" -}} - {{- $secret := include "bjw-s.common.lib.secret.getByIdentifier" (dict "rootContext" $rootContext "id" .secret) | fromYaml -}} - {{- $secretName := default (tpl .secret $rootContext) $secret.name -}} - {{- $_ := set $item "secretRef" (dict "name" $secretName) -}} - {{- else if hasKey . "secretRef" -}} - {{- if not (empty (dig "identifier" nil .secretRef)) -}} - {{- $secret := include "bjw-s.common.lib.secret.getByIdentifier" (dict "rootContext" $rootContext "id" .secretRef.identifier) | fromYaml -}} - {{- if empty $secret -}} - {{- fail (printf "No secret configured with identifier '%s'" .secretRef.identifier) -}} - {{- end -}} - - {{- $_ := set $item "secretRef" (dict "name" $secret.name) -}} - {{- else -}} - {{- $_ := set $item "secretRef" (dict "name" (tpl .secretRef.name $rootContext)) -}} - {{- end -}} - {{- end -}} - - {{- if not (empty (dig "prefix" nil .)) -}} - {{- $_ := set $item "prefix" .prefix -}} - {{- end -}} - - {{- if not (empty $item) -}} - {{- $envFrom = append $envFrom $item -}} - {{- end -}} - {{- end -}} - - {{- $envFrom | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_image.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_image.tpl deleted file mode 100644 index 327ea627d..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_image.tpl +++ /dev/null @@ -1,15 +0,0 @@ -{{/* -Image used by the container. -*/}} -{{- define "bjw-s.common.lib.container.field.image" -}} - {{- $ctx := .ctx -}} - {{- $rootContext := $ctx.rootContext -}} - {{- $containerObject := $ctx.containerObject -}} - - {{- $imageRepo := $containerObject.image.repository -}} - {{- $imageTag := $containerObject.image.tag -}} - - {{- if and $imageRepo $imageTag -}} - {{- printf "%s:%s" $imageRepo $imageTag -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_name.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_name.tpl deleted file mode 100644 index 7695f39b9..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_name.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Name used by the container. -*/}} -{{- define "bjw-s.common.lib.container.field.name" -}} - {{- $ctx := .ctx -}} - {{- $rootContext := $ctx.rootContext -}} - {{- $containerObject := $ctx.containerObject -}} - - {{- /* Default to container identifier */ -}} - {{- $name := $containerObject.identifier -}} - - {{- /* See if an override is desired */ -}} - {{- if hasKey $containerObject "nameOverride" -}} - {{- $option := get $containerObject "nameOverride" -}} - {{- if not (empty $option) -}} - {{- $name = $option -}} - {{- end -}} - {{- end -}} - - {{- /* Parse any templates */ -}} - {{- $name = tpl $name $rootContext -}} - - {{- $name | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_probes.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_probes.tpl deleted file mode 100644 index 5f6d60e10..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_probes.tpl +++ /dev/null @@ -1,83 +0,0 @@ -{{/* -Probes used by the container. -*/}} -{{- define "bjw-s.common.lib.container.field.probes" -}} - {{- $ctx := .ctx -}} - {{- $rootContext := $ctx.rootContext -}} - {{- $controllerObject := $ctx.controllerObject -}} - {{- $containerObject := $ctx.containerObject -}} - - {{- /* Default to empty dict */ -}} - {{- $enabledProbes := dict -}} - - {{- range $probeName, $probeValues := $containerObject.probes -}} - {{- /* Disable probe by default, but allow override */ -}} - {{- $probeEnabled := false -}} - {{- if hasKey $probeValues "enabled" -}} - {{- $probeEnabled = $probeValues.enabled -}} - {{- end -}} - - {{- if $probeEnabled -}} - {{- $probeDefinition := dict -}} - - {{- if $probeValues.custom -}} - {{- $parsedProbeSpec := tpl ($probeValues.spec | toYaml) $rootContext -}} - {{- $probeDefinition = $parsedProbeSpec | fromYaml -}} - {{- else -}} - {{- $primaryService := include "bjw-s.common.lib.service.primaryForController" (dict "rootContext" $rootContext "controllerIdentifier" $controllerObject.identifier) | fromYaml -}} - {{- $primaryServiceDefaultPort := dict -}} - {{- if $primaryService -}} - {{- $primaryServiceDefaultPort = include "bjw-s.common.lib.service.primaryPort" (dict "rootContext" $rootContext "serviceObject" $primaryService) | fromYaml -}} - {{- end -}} - {{- if $primaryServiceDefaultPort -}} - {{- $probeType := "" -}} - {{- if eq $probeValues.type "AUTO" -}} - {{- $probeType = $primaryServiceDefaultPort.protocol -}} - {{- else -}} - {{- $probeType = $probeValues.type | default "TCP" -}} - {{- end -}} - - {{- $_ := set $probeDefinition "initialDelaySeconds" $probeValues.spec.initialDelaySeconds -}} - {{- $_ := set $probeDefinition "failureThreshold" $probeValues.spec.failureThreshold -}} - {{- $_ := set $probeDefinition "timeoutSeconds" $probeValues.spec.timeoutSeconds -}} - {{- $_ := set $probeDefinition "periodSeconds" $probeValues.spec.periodSeconds -}} - - {{- $probeHeader := "" -}} - {{- if or ( eq $probeType "HTTPS" ) ( eq $probeType "HTTP" ) -}} - {{- $probeHeader = "httpGet" -}} - - {{- $_ := set $probeDefinition $probeHeader ( - dict - "path" $probeValues.path - "scheme" $probeType - ) - -}} - {{- else }} - {{- $probeHeader = "tcpSocket" -}} - {{- $_ := set $probeDefinition $probeHeader dict -}} - {{- end -}} - - {{- if $probeValues.port -}} - {{- if kindIs "float64" $probeValues.port -}} - {{- $_ := set (index $probeDefinition $probeHeader) "port" $probeValues.port -}} - {{- else if kindIs "string" $probeValues.port -}} - {{- $_ := set (index $probeDefinition $probeHeader) "port" (tpl ( $probeValues.port | toString ) $rootContext) -}} - {{- end -}} - {{- else if $primaryServiceDefaultPort.targetPort -}} - {{- $_ := set (index $probeDefinition $probeHeader) "port" $primaryServiceDefaultPort.targetPort -}} - {{- else -}} - {{- $_ := set (index $probeDefinition $probeHeader) "port" ($primaryServiceDefaultPort.port | toString | atoi ) -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- if $probeDefinition -}} - {{- $_ := set $enabledProbes (printf "%sProbe" $probeName) $probeDefinition -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- with $enabledProbes -}} - {{- . | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_volumeMounts.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_volumeMounts.tpl deleted file mode 100644 index 5139866b2..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/container/fields/_volumeMounts.tpl +++ /dev/null @@ -1,115 +0,0 @@ -{{/* -volumeMounts used by the container. -*/}} -{{- define "bjw-s.common.lib.container.field.volumeMounts" -}} - {{- $ctx := .ctx -}} - {{- $rootContext := $ctx.rootContext -}} - {{- $controllerObject := $ctx.controllerObject -}} - {{- $containerObject := $ctx.containerObject -}} - - {{- /* Default to empty dict */ -}} - {{- $persistenceItemsToProcess := dict -}} - {{- $enabledVolumeMounts := list -}} - - {{- /* Collect regular persistence items */ -}} - {{- range $identifier, $persistenceValues := $rootContext.Values.persistence -}} - {{- /* Enable persistence item by default, but allow override */ -}} - {{- $persistenceEnabled := true -}} - {{- if hasKey $persistenceValues "enabled" -}} - {{- $persistenceEnabled = $persistenceValues.enabled -}} - {{- end -}} - - {{- if $persistenceEnabled -}} - {{- $_ := set $persistenceItemsToProcess $identifier $persistenceValues -}} - {{- end -}} - {{- end -}} - - {{- /* Collect volumeClaimTemplates */ -}} - {{- if not (empty (dig "statefulset" "volumeClaimTemplates" nil $controllerObject)) -}} - {{- range $persistenceValues := $controllerObject.statefulset.volumeClaimTemplates -}} - {{- /* Enable persistence item by default, but allow override */ -}} - {{- $persistenceEnabled := true -}} - {{- if hasKey $persistenceValues "enabled" -}} - {{- $persistenceEnabled = $persistenceValues.enabled -}} - {{- end -}} - - {{- if $persistenceEnabled -}} - {{- $mountValues := dict -}} - {{- if not (empty (dig "globalMounts" nil $persistenceValues)) -}} - {{- $_ := set $mountValues "globalMounts" $persistenceValues.globalMounts -}} - {{- end -}} - {{- if not (empty (dig "advancedMounts" nil $persistenceValues)) -}} - {{- $_ := set $mountValues "advancedMounts" (dict $controllerObject.identifier $persistenceValues.advancedMounts) -}} - {{- end -}} - {{- $_ := set $persistenceItemsToProcess $persistenceValues.name $mountValues -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- range $identifier, $persistenceValues := $persistenceItemsToProcess -}} - {{- /* Set some default values */ -}} - - {{- /* Set the default mountPath to / */ -}} - {{- $mountPath := (printf "/%v" $identifier) -}} - {{- if eq "hostPath" (default "pvc" $persistenceValues.type) -}} - {{- $mountPath = $persistenceValues.hostPath -}} - {{- end -}} - - {{- /* Process configured mounts */ -}} - {{- if or .globalMounts .advancedMounts -}} - {{- $mounts := list -}} - {{- if hasKey . "globalMounts" -}} - {{- $mounts = .globalMounts -}} - {{- end -}} - - {{- if hasKey . "advancedMounts" -}} - {{- $advancedMounts := dig $controllerObject.identifier $containerObject.identifier list .advancedMounts -}} - {{- range $advancedMounts -}} - {{- $mounts = append $mounts . -}} - {{- end -}} - {{- end -}} - - {{- range $mounts -}} - {{- $volumeMount := dict -}} - {{- $_ := set $volumeMount "name" $identifier -}} - - {{- /* Use the specified mountPath if provided */ -}} - {{- with .path -}} - {{- $mountPath = . -}} - {{- end -}} - {{- $_ := set $volumeMount "mountPath" $mountPath -}} - - {{- /* Use the specified subPath if provided */ -}} - {{- with .subPath -}} - {{- $subPath := . -}} - {{- $_ := set $volumeMount "subPath" $subPath -}} - {{- end -}} - - {{- /* Use the specified readOnly setting if provided */ -}} - {{- with .readOnly -}} - {{- $readOnly := . -}} - {{- $_ := set $volumeMount "readOnly" $readOnly -}} - {{- end -}} - - {{- /* Use the specified mountPropagation setting if provided */ -}} - {{- with .mountPropagation -}} - {{- $mountPropagation := . -}} - {{- $_ := set $volumeMount "mountPropagation" $mountPropagation -}} - {{- end -}} - - {{- $enabledVolumeMounts = append $enabledVolumeMounts $volumeMount -}} - {{- end -}} - - {{- /* Mount to default path if no mounts are configured */ -}} - {{- else -}} - {{- $volumeMount := dict -}} - {{- $_ := set $volumeMount "name" $identifier -}} - {{- $_ := set $volumeMount "mountPath" $mountPath -}} - {{- $enabledVolumeMounts = append $enabledVolumeMounts $volumeMount -}} - {{- end -}} - {{- end -}} - - {{- with $enabledVolumeMounts -}} - {{- . | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_enabled_containers.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_enabled_containers.tpl deleted file mode 100644 index a49104968..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_enabled_containers.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Return the enabled containers for a controller. -*/}} -{{- define "bjw-s.common.lib.controller.enabledContainers" -}} - {{- $rootContext := .rootContext -}} - {{- $controllerObject := .controllerObject -}} - - {{- $enabledContainers := dict -}} - {{- range $name, $container := $controllerObject.containers -}} - {{- if kindIs "map" $container -}} - {{- /* Enable container by default, but allow override */ -}} - {{- $containerEnabled := true -}} - {{- if hasKey $container "enabled" -}} - {{- $containerEnabled = $container.enabled -}} - {{- end -}} - - {{- if $containerEnabled -}} - {{- $_ := set $enabledContainers $name $container -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- $enabledContainers | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_metadata.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_metadata.tpl deleted file mode 100644 index 0d759d6d4..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_metadata.tpl +++ /dev/null @@ -1,25 +0,0 @@ -{{- define "bjw-s.common.lib.controller.metadata.labels" -}} - {{- - $labels := ( - merge - (.Values.controller.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $ | fromYaml) - ) - -}} - {{- with $labels -}} - {{- toYaml . -}} - {{- end -}} -{{- end -}} - -{{- define "bjw-s.common.lib.controller.metadata.annotations" -}} - {{- - $annotations := ( - merge - (.Values.controller.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $ | fromYaml) - ) - -}} - {{- with $annotations -}} - {{- toYaml . -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_validate.tpl deleted file mode 100644 index 5d61d1a00..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_validate.tpl +++ /dev/null @@ -1,18 +0,0 @@ -{{/* -Validate controller values -*/}} -{{- define "bjw-s.common.lib.controller.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $controllerValues := .object -}} - - {{- $allowedControllerTypes := list "deployment" "daemonset" "statefulset" "cronjob" "job" -}} - {{- if not (has $controllerValues.type $allowedControllerTypes) -}} - {{- fail (printf "Not a valid controller.type (%s)" $controllerValues.type) -}} - {{- end -}} - - {{- $enabledContainers := include "bjw-s.common.lib.controller.enabledContainers" (dict "rootContext" $rootContext "controllerObject" $controllerValues) | fromYaml }} - {{- /* Validate at least one container is enabled */ -}} - {{- if not $enabledContainers -}} - {{- fail (printf "No containers enabled for controller (%s)" $controllerValues.identifier) -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_valuesToObject.tpl deleted file mode 100644 index 6badac92c..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/controller/_valuesToObject.tpl +++ /dev/null @@ -1,41 +0,0 @@ -{{/* -Convert controller values to an object -*/}} -{{- define "bjw-s.common.lib.controller.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Default the controller type to Deployment */ -}} - {{- if empty (dig "type" nil $objectValues) -}} - {{- $_ := set $objectValues "type" "deployment" -}} - {{- end -}} - - {{- /* Determine and inject the controller name */ -}} - {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - - {{- if $objectValues.nameOverride -}} - {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} - {{- else -}} - {{- if ne $identifier "main" -}} - {{- $objectName = printf "%s-%s" $objectName $identifier -}} - {{- end -}} - {{- end -}} - {{- $_ := set $objectValues "name" $objectName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Set the default Pod options for the controller */ -}} - {{- range $index, $key := keys $rootContext.Values.defaultPodOptions -}} - {{- if not (hasKey $objectValues "pod") -}} - {{- $_ := set $objectValues "pod" dict -}} - {{- end -}} - - {{- $defaultValue := get $rootContext.Values.defaultPodOptions $key -}} - {{- if not (hasKey $objectValues.pod $key) -}} - {{- $_ := set $objectValues.pod $key $defaultValue -}} - {{- end -}} - {{- end -}} - - {{- /* Return the controller object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/cronjob/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/cronjob/_validate.tpl deleted file mode 100644 index 37cb7b20e..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/cronjob/_validate.tpl +++ /dev/null @@ -1,11 +0,0 @@ -{{/* -Validate CronJob values -*/}} -{{- define "bjw-s.common.lib.cronjob.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $cronjobValues := .object -}} - - {{- if and (ne $cronjobValues.pod.restartPolicy "Never") (ne $cronjobValues.pod.restartPolicy "OnFailure") -}} - {{- fail (printf "Not a valid restartPolicy type for CronJob. (controller: %s, restartPolicy: %s)" $cronjobValues.identifier $cronjobValues.pod.restartPolicy) }} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/cronjob/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/cronjob/_valuesToObject.tpl deleted file mode 100644 index 5657be59e..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/cronjob/_valuesToObject.tpl +++ /dev/null @@ -1,18 +0,0 @@ -{{/* -Convert Cronjob values to an object -*/}} -{{- define "bjw-s.common.lib.cronjob.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- if not (hasKey $objectValues "pod") -}} - {{- $_ := set $objectValues "pod" dict -}} - {{- end -}} - - {{- $restartPolicy := default "Never" $objectValues.pod.restartPolicy -}} - {{- $_ := set $objectValues.pod "restartPolicy" $restartPolicy -}} - - {{- /* Return the CronJob object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/daemonset/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/daemonset/_validate.tpl deleted file mode 100644 index 25a7408c8..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/daemonset/_validate.tpl +++ /dev/null @@ -1,7 +0,0 @@ -{{/* -Validate DaemonSet values -*/}} -{{- define "bjw-s.common.lib.daemonset.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $daemonsetValues := .object -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/daemonset/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/daemonset/_valuesToObject.tpl deleted file mode 100644 index 4593255b5..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/daemonset/_valuesToObject.tpl +++ /dev/null @@ -1,11 +0,0 @@ -{{/* -Convert DaemonSet values to an object -*/}} -{{- define "bjw-s.common.lib.daemonset.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Return the DaemonSet object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/deployment/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/deployment/_validate.tpl deleted file mode 100644 index c32100794..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/deployment/_validate.tpl +++ /dev/null @@ -1,11 +0,0 @@ -{{/* -Validate Deployment values -*/}} -{{- define "bjw-s.common.lib.deployment.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $deploymentValues := .object -}} - - {{- if and (ne $deploymentValues.strategy "Recreate") (ne $deploymentValues.strategy "RollingUpdate") -}} - {{- fail (printf "Not a valid strategy type for Deployment. (controller: %s, strategy: %s)" $deploymentValues.identifier $deploymentValues.strategy) }} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/deployment/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/deployment/_valuesToObject.tpl deleted file mode 100644 index 7e7ad9ae8..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/deployment/_valuesToObject.tpl +++ /dev/null @@ -1,14 +0,0 @@ -{{/* -Convert Deployment values to an object -*/}} -{{- define "bjw-s.common.lib.deployment.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- $strategy := default "Recreate" $objectValues.strategy -}} - {{- $_ := set $objectValues "strategy" $strategy -}} - - {{- /* Return the Deployment object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_primary.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_primary.tpl deleted file mode 100644 index 5198d09a4..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_primary.tpl +++ /dev/null @@ -1,21 +0,0 @@ -{{/* Return the name of the primary Ingress object */}} -{{- define "bjw-s.common.lib.ingress.primary" -}} - {{- $enabledIngresses := dict -}} - {{- range $name, $ingress := .Values.ingress -}} - {{- if $ingress.enabled -}} - {{- $_ := set $enabledIngresses $name . -}} - {{- end -}} - {{- end -}} - - {{- $result := "" -}} - {{- range $name, $ingress := $enabledIngresses -}} - {{- if and (hasKey $ingress "primary") $ingress.primary -}} - {{- $result = $name -}} - {{- end -}} - {{- end -}} - - {{- if not $result -}} - {{- $result = keys $enabledIngresses | first -}} - {{- end -}} - {{- $result -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_validate.tpl deleted file mode 100644 index 0078e86e6..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_validate.tpl +++ /dev/null @@ -1,15 +0,0 @@ -{{/* -Validate Ingress values -*/}} -{{- define "bjw-s.common.lib.ingress.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $ingressValues := .object -}} - - {{- range $ingressValues.hosts -}} - {{- range .paths -}} - {{- if empty (dig "service" "name" nil .) -}} - {{- fail (printf "No service name configured. (ingress: %s, path: %s)" $ingressValues.identifier .path) -}} - {{- end -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_valuesToObject.tpl deleted file mode 100644 index c9195cad4..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/ingress/_valuesToObject.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Convert ingress values to an object -*/}} -{{- define "bjw-s.common.lib.ingress.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Determine and inject the ingress name */ -}} - {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - - {{- if $objectValues.nameOverride -}} - {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} - {{- else -}} - {{- if ne $identifier "main" -}} - {{- $objectName = printf "%s-%s" $objectName $identifier -}} - {{- end -}} - {{- end -}} - {{- $_ := set $objectValues "name" $objectName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Return the ingress object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/job/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/job/_validate.tpl deleted file mode 100644 index 75f71917e..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/job/_validate.tpl +++ /dev/null @@ -1,12 +0,0 @@ -{{/* -Validate job values -*/}} -{{- define "bjw-s.common.lib.job.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $jobValues := .object -}} - - {{- $allowedRestartPolicy := list "Never" "OnFailure" -}} - {{- if not (has $jobValues.pod.restartPolicy $allowedRestartPolicy) -}} - {{- fail (printf "Not a valid restart policy for Job (controller: %s, strategy: %s)" $jobValues.identifier $jobValues.pod.restartPolicy) -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/job/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/job/_valuesToObject.tpl deleted file mode 100644 index 5886d6033..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/job/_valuesToObject.tpl +++ /dev/null @@ -1,14 +0,0 @@ -{{/* -Convert job values to an object -*/}} -{{- define "bjw-s.common.lib.job.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- $restartPolicy := default "Never" $objectValues.pod.restartPolicy -}} - {{- $_ := set $objectValues.pod "restartPolicy" $restartPolicy -}} - - {{- /* Return the Job object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_allLabels.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_allLabels.tpl deleted file mode 100644 index 330857b04..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_allLabels.tpl +++ /dev/null @@ -1,10 +0,0 @@ -{{/* Common labels shared across objects */}} -{{- define "bjw-s.common.lib.metadata.allLabels" -}} -helm.sh/chart: {{ include "bjw-s.common.lib.chart.names.chart" . }} -{{ include "bjw-s.common.lib.metadata.selectorLabels" . }} - {{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} - {{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{ include "bjw-s.common.lib.metadata.globalLabels" . }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_globalAnnotations.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_globalAnnotations.tpl deleted file mode 100644 index c7850c599..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_globalAnnotations.tpl +++ /dev/null @@ -1,10 +0,0 @@ -{{/* Common annotations shared across objects */}} -{{- define "bjw-s.common.lib.metadata.globalAnnotations" -}} - {{- with .Values.global.annotations }} - {{- range $k, $v := . }} - {{- $name := $k }} - {{- $value := tpl $v $ }} -{{ $name }}: {{ quote $value }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_globalLabels.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_globalLabels.tpl deleted file mode 100644 index 6b4c37709..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_globalLabels.tpl +++ /dev/null @@ -1,9 +0,0 @@ -{{- define "bjw-s.common.lib.metadata.globalLabels" -}} - {{- with .Values.global.labels }} - {{- range $k, $v := . }} - {{- $name := $k }} - {{- $value := tpl $v $ }} -{{ $name }}: {{ quote $value }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_selectorLabels.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_selectorLabels.tpl deleted file mode 100644 index 5174d999d..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/metadata/_selectorLabels.tpl +++ /dev/null @@ -1,5 +0,0 @@ -{{/* Selector labels shared across objects */}} -{{- define "bjw-s.common.lib.metadata.selectorLabels" -}} -app.kubernetes.io/name: {{ include "bjw-s.common.lib.chart.names.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/networkpolicy/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/networkpolicy/_validate.tpl deleted file mode 100644 index c490d1b70..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/networkpolicy/_validate.tpl +++ /dev/null @@ -1,22 +0,0 @@ -{{/* -Validate networkPolicy values -*/}} -{{- define "bjw-s.common.lib.networkpolicy.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $networkpolicyObject := .object -}} - - {{- if and (not (hasKey $networkpolicyObject "podSelector")) (empty (get $networkpolicyObject "controller")) -}} - {{- fail (printf "controller reference or podSelector is required for NetworkPolicy. (NetworkPolicy %s)" $networkpolicyObject.identifier) -}} - {{- end -}} - - {{- if empty (get $networkpolicyObject "policyTypes") -}} - {{- fail (printf "policyTypes is required for NetworkPolicy. (NetworkPolicy %s)" $networkpolicyObject.identifier) -}} - {{- end -}} - - {{- $allowedpolicyTypes := list "Ingress" "Egress" -}} - {{- range $networkpolicyObject.policyTypes -}} - {{- if not (has . $allowedpolicyTypes) -}} - {{- fail (printf "Not a valid policyType for NetworkPolicy. (NetworkPolicy %s, value %s)" $networkpolicyObject.identifier .) -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/networkpolicy/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/networkpolicy/_valuesToObject.tpl deleted file mode 100644 index 805f33a5a..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/networkpolicy/_valuesToObject.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Convert networkPolicy values to an object -*/}} -{{- define "bjw-s.common.lib.networkpolicy.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Determine and inject the networkPolicy name */ -}} - {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - - {{- if $objectValues.nameOverride -}} - {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} - {{- else -}} - {{- if ne $identifier "main" -}} - {{- $objectName = printf "%s-%s" $objectName $identifier -}} - {{- end -}} - {{- end -}} - {{- $_ := set $objectValues "name" $objectName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Return the networkPolicy object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/_getOption.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/_getOption.tpl deleted file mode 100644 index c436ee328..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/_getOption.tpl +++ /dev/null @@ -1,34 +0,0 @@ -{{- /* -Returns the value for the specified field -*/ -}} -{{- define "bjw-s.common.lib.pod.getOption" -}} - {{- $rootContext := .ctx.rootContext -}} - {{- $controllerObject := .ctx.controllerObject -}} - {{- $option := .option -}} - - {{- $value := "" -}} - - {{- /* Set to the default if it is set */ -}} - {{- $defaultOption := get $rootContext.Values.defaultPodOptions $option -}} - {{- if kindIs "bool" $defaultOption -}} - {{- $value = $defaultOption -}} - {{- else if not (empty $defaultOption) -}} - {{- $value = $defaultOption -}} - {{- end -}} - - {{- /* See if a pod-specific override is needed */ -}} - {{- if hasKey $controllerObject "pod" -}} - {{- $podOption := get $controllerObject.pod $option -}} - {{- if kindIs "bool" $podOption -}} - {{- $value = $podOption -}} - {{- else if not (empty $podOption) -}} - {{- $value = $podOption -}} - {{- end -}} - {{- end -}} - - {{- if kindIs "bool" $value -}} - {{- $value | toYaml -}} - {{- else if not (empty $value) -}} - {{- $value | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/_spec.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/_spec.tpl deleted file mode 100644 index 103acc3c7..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/_spec.tpl +++ /dev/null @@ -1,67 +0,0 @@ -{{- /* -The pod definition included in the controller. -*/ -}} -{{- define "bjw-s.common.lib.pod.spec" -}} - {{- $rootContext := .rootContext -}} - {{- $controllerObject := .controllerObject -}} - {{- $ctx := dict "rootContext" $rootContext "controllerObject" $controllerObject -}} - -enableServiceLinks: {{ $controllerObject.pod.enableServiceLinks }} -serviceAccountName: {{ include "bjw-s.common.lib.pod.field.serviceAccountName" (dict "ctx" $ctx) | trim }} -automountServiceAccountToken: {{ $controllerObject.pod.automountServiceAccountToken }} - {{- with ($controllerObject.pod.priorityClassName) }} -priorityClassName: {{ . | trim }} - {{- end -}} - {{- with ($controllerObject.pod.runtimeClassName) }} -runtimeClassName: {{ . | trim }} - {{- end -}} - {{- with ($controllerObject.pod.schedulerName) }} -schedulerName: {{ . | trim }} - {{- end -}} - {{- with ($controllerObject.pod.securityContext) }} -securityContext: {{ . | toYaml | nindent 2 }} - {{- end -}} - {{- with ($controllerObject.pod.hostname) }} -hostname: {{ . | trim }} - {{- end }} -hostIPC: {{ $controllerObject.pod.hostIPC }} -hostNetwork: {{ $controllerObject.pod.hostNetwork }} -hostPID: {{ $controllerObject.pod.hostPID }} -dnsPolicy: {{ include "bjw-s.common.lib.pod.field.dnsPolicy" (dict "ctx" $ctx) | trim }} - {{- with $controllerObject.pod.dnsConfig }} -dnsConfig: {{ . | toYaml | nindent 2 }} - {{- end -}} - {{- with $controllerObject.pod.hostAliases }} -hostAliases: {{ . | toYaml | nindent 2 }} - {{- end -}} - {{- with $controllerObject.pod.imagePullSecrets }} -imagePullSecrets: {{ . | toYaml | nindent 2 }} - {{- end -}} - {{- with $controllerObject.pod.terminationGracePeriodSeconds }} -terminationGracePeriodSeconds: {{ . | trim }} - {{- end -}} - {{- with $controllerObject.pod.restartPolicy }} -restartPolicy: {{ . | trim }} - {{- end -}} - {{- with $controllerObject.pod.nodeSelector }} -nodeSelector: {{ . | toYaml | nindent 2 }} - {{- end -}} - {{- with $controllerObject.pod.affinity }} -affinity: {{ . | toYaml | nindent 2 }} - {{- end -}} - {{- with $controllerObject.pod.topologySpreadConstraints }} -topologySpreadConstraints: {{ . | toYaml | nindent 2 }} - {{- end -}} - {{- with $controllerObject.pod.tolerations }} -tolerations: {{ . | toYaml | nindent 2 }} - {{- end }} - {{- with (include "bjw-s.common.lib.pod.field.initContainers" (dict "ctx" $ctx) | trim) }} -initContainers: {{ . | nindent 2 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.pod.field.containers" (dict "ctx" $ctx) | trim) }} -containers: {{ . | nindent 2 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.pod.field.volumes" (dict "ctx" $ctx) | trim) }} -volumes: {{ . | nindent 2 }} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_containers.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_containers.tpl deleted file mode 100644 index a20f7d413..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_containers.tpl +++ /dev/null @@ -1,71 +0,0 @@ -{{- /* -Returns the value for containers -*/ -}} -{{- define "bjw-s.common.lib.pod.field.containers" -}} - {{- $rootContext := .ctx.rootContext -}} - {{- $controllerObject := .ctx.controllerObject -}} - - {{- /* Default to empty list */ -}} - {{- $graph := dict -}} - {{- $containers := list -}} - - {{- /* Fetch configured containers for this controller */ -}} - {{- $enabledContainers := include "bjw-s.common.lib.controller.enabledContainers" (dict "rootContext" $rootContext "controllerObject" $controllerObject) | fromYaml }} - {{- $renderedContainers := dict -}} - - {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} - {{- $containersWithDependsOn := include "bjw-s.common.lib.getMapItemsWithKey" (dict "map" $enabledContainers "key" "dependsOn") | fromYaml | keys -}} - {{- $useDependsOn := gt (len $containersWithDependsOn) 0 -}} - - {{- range $key, $containerValues := $enabledContainers -}} - {{- /* Create object from the container values */ -}} - {{- $containerObject := (include "bjw-s.common.lib.container.valuesToObject" (dict "rootContext" $rootContext "id" $key "values" $containerValues)) | fromYaml -}} - - {{- /* Perform validations on the Container before rendering */ -}} - {{- include "bjw-s.common.lib.container.validate" (dict "rootContext" $ "controllerObject" $controllerObject "containerObject" $containerObject) -}} - - {{- /* Generate the Container spec */ -}} - {{- $renderedContainer := include "bjw-s.common.lib.container.spec" (dict "rootContext" $rootContext "controllerObject" $controllerObject "containerObject" $containerObject) | fromYaml -}} - {{- $_ := set $renderedContainers $key $renderedContainer -}} - - {{- /* Determine the Container order */ -}} - {{- if $useDependsOn -}} - {{- if empty (dig "dependsOn" nil $containerValues) -}} - {{- $_ := set $graph $key ( list ) -}} - {{- else if kindIs "string" $containerValues.dependsOn -}} - {{- $_ := set $graph $key ( list $containerValues.dependsOn ) -}} - {{- else if kindIs "slice" $containerValues.dependsOn -}} - {{- $_ := set $graph $key $containerValues.dependsOn -}} - {{- end -}} - {{- else -}} - {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} - {{- $containerOrder := (dig "order" 99 $containerValues) -}} - {{- $_ := set $graph $key $containerOrder -}} - {{- end -}} - {{- end -}} - - {{- /* Process graph */ -}} - {{- if $useDependsOn -}} - {{- $args := dict "graph" $graph "out" list -}} - {{- include "bjw-s.common.lib.kahn" $args -}} - - {{- range $name := $args.out -}} - {{- $containerItem := get $renderedContainers $name -}} - {{- $containers = append $containers $containerItem -}} - {{- end -}} - {{- else -}} - {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} - {{- $orderedContainers := dict -}} - {{- range $key, $order := $graph -}} - {{- $containerItem := get $renderedContainers $key -}} - {{- $_ := set $orderedContainers (printf "%v-%s" $order $key) $containerItem -}} - {{- end -}} - {{- range $key, $containerValues := $orderedContainers -}} - {{- $containers = append $containers $containerValues -}} - {{- end -}} - {{- end -}} - - {{- if not (empty $containers) -}} - {{- $containers | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_dnsPolicy.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_dnsPolicy.tpl deleted file mode 100644 index e82636d04..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_dnsPolicy.tpl +++ /dev/null @@ -1,25 +0,0 @@ -{{- /* -Returns the value for dnsPolicy -*/ -}} -{{- define "bjw-s.common.lib.pod.field.dnsPolicy" -}} - {{- $ctx := .ctx -}} - {{- $controllerObject := $ctx.controllerObject -}} - - {{- /* Default to "ClusterFirst" */ -}} - {{- $dnsPolicy := "ClusterFirst" -}} - - {{- /* Get hostNetwork value "" */ -}} - {{- $hostNetwork:= get $controllerObject.pod "hostNetwork" -}} - {{- if $hostNetwork -}} - {{- $dnsPolicy = "ClusterFirstWithHostNet" -}} - {{- end -}} - - {{- /* See if an override is desired */ -}} - {{- $override := get $controllerObject.pod "dnsPolicy" -}} - - {{- if not (empty $override) -}} - {{- $dnsPolicy = $override -}} - {{- end -}} - - {{- $dnsPolicy -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_initContainers.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_initContainers.tpl deleted file mode 100644 index 2d7800923..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_initContainers.tpl +++ /dev/null @@ -1,78 +0,0 @@ -{{- /* -Returns the value for initContainers -*/ -}} -{{- define "bjw-s.common.lib.pod.field.initContainers" -}} - {{- $rootContext := .ctx.rootContext -}} - {{- $controllerObject := .ctx.controllerObject -}} - - {{- /* Default to empty list */ -}} - {{- $graph := dict -}} - {{- $containers := list -}} - - {{- /* Fetch configured containers for this controller */ -}} - {{- $renderedContainers := dict -}} - - {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} - {{- $containersWithDependsOn := include "bjw-s.common.lib.getMapItemsWithKey" (dict "map" $controllerObject.initContainers "key" "dependsOn") | fromYaml | keys -}} - {{- $useDependsOn := gt (len $containersWithDependsOn) 0 -}} - - {{- range $key, $containerValues := $controllerObject.initContainers -}} - {{- /* Enable container by default, but allow override */ -}} - {{- $containerEnabled := true -}} - {{- if hasKey $containerValues "enabled" -}} - {{- $containerEnabled = $containerValues.enabled -}} - {{- end -}} - - {{- if $containerEnabled -}} - {{- /* Create object from the container values */ -}} - {{- $containerObject := (include "bjw-s.common.lib.container.valuesToObject" (dict "rootContext" $rootContext "id" $key "values" $containerValues)) | fromYaml -}} - - {{- /* Perform validations on the Container before rendering */ -}} - {{- include "bjw-s.common.lib.container.validate" (dict "rootContext" $ "controllerObject" $controllerObject "containerObject" $containerObject) -}} - - {{- /* Generate the Container spec */ -}} - {{- $renderedContainer := include "bjw-s.common.lib.container.spec" (dict "rootContext" $rootContext "controllerObject" $controllerObject "containerObject" $containerObject) | fromYaml -}} - {{- $_ := set $renderedContainers $key $renderedContainer -}} - - {{- /* Determine the Container order */ -}} - {{- if $useDependsOn -}} - {{- if empty (dig "dependsOn" nil $containerValues) -}} - {{- $_ := set $graph $key ( list ) -}} - {{- else if kindIs "string" $containerValues.dependsOn -}} - {{- $_ := set $graph $key ( list $containerValues.dependsOn ) -}} - {{- else if kindIs "slice" $containerValues.dependsOn -}} - {{- $_ := set $graph $key $containerValues.dependsOn -}} - {{- end -}} - {{- else -}} - {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} - {{- $containerOrder := (dig "order" 99 $containerValues) -}} - {{- $_ := set $graph $key $containerOrder -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- /* Process graph */ -}} - {{- if $useDependsOn -}} - {{- $args := dict "graph" $graph "out" list -}} - {{- include "bjw-s.common.lib.kahn" $args -}} - - {{- range $name := $args.out -}} - {{- $containerItem := get $renderedContainers $name -}} - {{- $containers = append $containers $containerItem -}} - {{- end -}} - {{- else -}} - {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} - {{- $orderedContainers := dict -}} - {{- range $key, $order := $graph -}} - {{- $containerItem := get $renderedContainers $key -}} - {{- $_ := set $orderedContainers (printf "%v-%s" $order $key) $containerItem -}} - {{- end -}} - {{- range $key, $containerValues := $orderedContainers -}} - {{- $containers = append $containers $containerValues -}} - {{- end -}} - {{- end -}} - - {{- if not (empty $containers) -}} - {{- $containers | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_serviceAccountName.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_serviceAccountName.tpl deleted file mode 100644 index 947a1a460..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_serviceAccountName.tpl +++ /dev/null @@ -1,11 +0,0 @@ -{{- /* -Returns the value for serviceAccountName -*/ -}} -{{- define "bjw-s.common.lib.pod.field.serviceAccountName" -}} - {{- $rootContext := .ctx.rootContext -}} - - {{- $serviceAccountValues := (mustDeepCopy $rootContext.Values.serviceAccount) -}} - {{- $serviceAccountObject := (include "bjw-s.common.lib.serviceAccount.valuesToObject" (dict "rootContext" $rootContext "id" "default" "values" $serviceAccountValues)) | fromYaml -}} - {{- $serviceAccountObject.name -}} - -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_volumes.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_volumes.tpl deleted file mode 100644 index 2e8836906..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/fields/_volumes.tpl +++ /dev/null @@ -1,125 +0,0 @@ -{{- /* -Returns the value for volumes -*/ -}} -{{- define "bjw-s.common.lib.pod.field.volumes" -}} - {{- $rootContext := .ctx.rootContext -}} - {{- $controllerObject := .ctx.controllerObject -}} - - {{- /* Default to empty list */ -}} - {{- $persistenceItemsToProcess := dict -}} - {{- $volumes := list -}} - - {{- /* Loop over persistence values */ -}} - {{- range $identifier, $persistenceValues := $rootContext.Values.persistence -}} - {{- /* Enable persistence item by default, but allow override */ -}} - {{- $persistenceEnabled := true -}} - {{- if hasKey $persistenceValues "enabled" -}} - {{- $persistenceEnabled = $persistenceValues.enabled -}} - {{- end -}} - - {{- if $persistenceEnabled -}} - {{- $hasglobalMounts := not (empty $persistenceValues.globalMounts) -}} - {{- $globalMounts := dig "globalMounts" list $persistenceValues -}} - - {{- $hasAdvancedMounts := not (empty $persistenceValues.advancedMounts) -}} - {{- $advancedMounts := dig "advancedMounts" $controllerObject.identifier list $persistenceValues -}} - - {{ if or - ($hasglobalMounts) - (and ($hasAdvancedMounts) (not (empty $advancedMounts))) - (and (not $hasglobalMounts) (not $hasAdvancedMounts)) - -}} - {{- $_ := set $persistenceItemsToProcess $identifier $persistenceValues -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- /* Loop over persistence items */ -}} - {{- range $identifier, $persistenceValues := $persistenceItemsToProcess -}} - {{- $volume := dict "name" $identifier -}} - - {{- /* PVC persistence type */ -}} - {{- if eq (default "persistentVolumeClaim" $persistenceValues.type) "persistentVolumeClaim" -}} - {{- $pvcName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - {{- if $persistenceValues.existingClaim -}} - {{- /* Always prefer an existingClaim if that is set */ -}} - {{- $pvcName = $persistenceValues.existingClaim -}} - {{- else -}} - {{- /* Otherwise refer to the PVC name */ -}} - {{- if $persistenceValues.nameOverride -}} - {{- if not (eq $persistenceValues.nameOverride "-") -}} - {{- $pvcName = (printf "%s-%s" (include "bjw-s.common.lib.chart.names.fullname" $rootContext) $persistenceValues.nameOverride) -}} - {{- end -}} - {{- else -}} - {{- $pvcName = (printf "%s-%s" (include "bjw-s.common.lib.chart.names.fullname" $rootContext) $identifier) -}} - {{- end -}} - {{- end -}} - {{- $_ := set $volume "persistentVolumeClaim" (dict "claimName" $pvcName) -}} - - {{- /* configMap persistence type */ -}} - {{- else if eq $persistenceValues.type "configMap" -}} - {{- $objectName := (required (printf "name not set for persistence item %s" $identifier) $persistenceValues.name) -}} - {{- $objectName = tpl $objectName $rootContext -}} - {{- $_ := set $volume "configMap" dict -}} - {{- $_ := set $volume.configMap "name" $objectName -}} - {{- with $persistenceValues.defaultMode -}} - {{- $_ := set $volume.configMap "defaultMode" . -}} - {{- end -}} - {{- with $persistenceValues.items -}} - {{- $_ := set $volume.configMap "items" . -}} - {{- end -}} - - {{- /* Secret persistence type */ -}} - {{- else if eq $persistenceValues.type "secret" -}} - {{- $objectName := (required (printf "name not set for persistence item %s" $identifier) $persistenceValues.name) -}} - {{- $objectName = tpl $objectName $rootContext -}} - {{- $_ := set $volume "secret" dict -}} - {{- $_ := set $volume.secret "secretName" $objectName -}} - {{- with $persistenceValues.defaultMode -}} - {{- $_ := set $volume.secret "defaultMode" . -}} - {{- end -}} - {{- with $persistenceValues.items -}} - {{- $_ := set $volume.secret "items" . -}} - {{- end -}} - - {{- /* emptyDir persistence type */ -}} - {{- else if eq $persistenceValues.type "emptyDir" -}} - {{- $_ := set $volume "emptyDir" dict -}} - {{- with $persistenceValues.medium -}} - {{- $_ := set $volume.emptyDir "medium" . -}} - {{- end -}} - {{- with $persistenceValues.sizeLimit -}} - {{- $_ := set $volume.emptyDir "sizeLimit" . -}} - {{- end -}} - - {{- /* hostPath persistence type */ -}} - {{- else if eq $persistenceValues.type "hostPath" -}} - {{- $_ := set $volume "hostPath" dict -}} - {{- $_ := set $volume.hostPath "path" (required "hostPath not set" $persistenceValues.hostPath) -}} - {{- with $persistenceValues.hostPathType }} - {{- $_ := set $volume.hostPath "type" . -}} - {{- end -}} - - {{- /* nfs persistence type */ -}} - {{- else if eq $persistenceValues.type "nfs" -}} - {{- $_ := set $volume "nfs" dict -}} - {{- $_ := set $volume.nfs "server" (required "server not set" $persistenceValues.server) -}} - {{- $_ := set $volume.nfs "path" (required "path not set" $persistenceValues.path) -}} - - {{- /* custom persistence type */ -}} - {{- else if eq $persistenceValues.type "custom" -}} - {{- $volume = $persistenceValues.volumeSpec -}} - {{- $_ := set $volume "name" $identifier -}} - - {{- /* Fail otherwise */ -}} - {{- else -}} - {{- fail (printf "Not a valid persistence.type (%s)" $persistenceValues.type) -}} - {{- end -}} - - {{- $volumes = append $volumes $volume -}} - {{- end -}} - - {{- if not (empty $volumes) -}} - {{- $volumes | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/metadata/_annotations.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/metadata/_annotations.tpl deleted file mode 100644 index 86e6d25ff..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/metadata/_annotations.tpl +++ /dev/null @@ -1,56 +0,0 @@ -{{- /* -Returns the value for annotations -*/ -}} -{{- define "bjw-s.common.lib.pod.metadata.annotations" -}} - {{- $rootContext := .rootContext -}} - {{- $controllerObject := .controllerObject -}} - - {{- /* Default annotations */ -}} - {{- $annotations := dict -}} - - {{- /* Set to the default if it is set */ -}} - {{- $defaultOption := get $rootContext.Values.defaultPodOptions "annotations" -}} - {{- if not (empty $defaultOption) -}} - {{- $annotations = merge $defaultOption $annotations -}} - {{- end -}} - - {{- /* See if a pod-specific override is set */ -}} - {{- if hasKey $controllerObject "pod" -}} - {{- $podOption := get $controllerObject.pod "annotations" -}} - {{- if not (empty $podOption) -}} - {{- $annotations = merge $podOption $annotations -}} - {{- end -}} - {{- end -}} - - {{- /* Add configMaps checksum */ -}} - {{- $configMapsFound := dict -}} - {{- range $name, $configmap := $rootContext.Values.configMaps -}} - {{- if $configmap.enabled -}} - {{- $_ := set $configMapsFound $name (toYaml $configmap.data | sha256sum) -}} - {{- end -}} - {{- end -}} - {{- if $configMapsFound -}} - {{- $annotations = merge - (dict "checksum/configMaps" (toYaml $configMapsFound | sha256sum)) - $annotations - -}} - {{- end -}} - - {{- /* Add Secrets checksum */ -}} - {{- $secretsFound := dict -}} - {{- range $name, $secret := $rootContext.Values.secrets -}} - {{- if $secret.enabled -}} - {{- $_ := set $secretsFound $name (toYaml $secret.stringData | sha256sum) -}} - {{- end -}} - {{- end -}} - {{- if $secretsFound -}} - {{- $annotations = merge - (dict "checksum/secrets" (toYaml $secretsFound | sha256sum)) - $annotations - -}} - {{- end -}} - - {{- if not (empty $annotations) -}} - {{- $annotations | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/metadata/_labels.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/metadata/_labels.tpl deleted file mode 100644 index 82a1731be..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pod/metadata/_labels.tpl +++ /dev/null @@ -1,36 +0,0 @@ -{{- /* -Returns the value for labels -*/ -}} -{{- define "bjw-s.common.lib.pod.metadata.labels" -}} - {{- $rootContext := .rootContext -}} - {{- $controllerObject := .controllerObject -}} - - {{- /* Default labels */ -}} - {{- $labels := merge - (dict "app.kubernetes.io/component" $controllerObject.identifier) - -}} - - {{- /* Fetch the Pod selectorLabels */ -}} - {{- $selectorLabels := include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | fromYaml -}} - {{- if not (empty $selectorLabels) -}} - {{- $labels = merge $selectorLabels $labels -}} - {{- end -}} - - {{- /* Set to the default if it is set */ -}} - {{- $defaultOption := get $rootContext.Values.defaultPodOptions "labels" -}} - {{- if not (empty $defaultOption) -}} - {{- $labels = merge $defaultOption $labels -}} - {{- end -}} - - {{- /* See if a pod-specific override is set */ -}} - {{- if hasKey $controllerObject "pod" -}} - {{- $podOption := get $controllerObject.pod "labels" -}} - {{- if not (empty $podOption) -}} - {{- $labels = merge $podOption $labels -}} - {{- end -}} - {{- end -}} - - {{- if not (empty $labels) -}} - {{- $labels | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pvc/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pvc/_validate.tpl deleted file mode 100644 index 23110faf0..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pvc/_validate.tpl +++ /dev/null @@ -1,7 +0,0 @@ -{{/* -Validate PVC values -*/}} -{{- define "bjw-s.common.lib.pvc.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $pvcObject := .object -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pvc/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pvc/_valuesToObject.tpl deleted file mode 100644 index 99878382a..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/pvc/_valuesToObject.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Convert PVC values to an object -*/}} -{{- define "bjw-s.common.lib.pvc.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Determine and inject the PVC name */ -}} - {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - - {{- if $objectValues.nameOverride -}} - {{- if ne $objectValues.nameOverride "-" -}} - {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} - {{- end -}} - {{- else -}} - {{- $objectName = printf "%s-%s" $objectName $identifier -}} - {{- end -}} - {{- $_ := set $objectValues "name" $objectName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Return the PVC object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_primary.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_primary.tpl deleted file mode 100644 index ba6cd1a40..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_primary.tpl +++ /dev/null @@ -1,21 +0,0 @@ -{{/* Return the name of the primary route object */}} -{{- define "bjw-s.common.lib.route.primary" -}} - {{- $enabledRoutes := dict -}} - {{- range $name, $route := .Values.route -}} - {{- if $route.enabled -}} - {{- $_ := set $enabledRoutes $name . -}} - {{- end -}} - {{- end -}} - - {{- $result := "" -}} - {{- range $name, $route := $enabledRoutes -}} - {{- if and (hasKey $route "primary") $route.primary -}} - {{- $result = $name -}} - {{- end -}} - {{- end -}} - - {{- if not $result -}} - {{- $result = keys $enabledRoutes | first -}} - {{- end -}} - {{- $result -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_validate.tpl deleted file mode 100644 index 776494c0a..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_validate.tpl +++ /dev/null @@ -1,25 +0,0 @@ -{{/* -Validate Route values -*/}} -{{- define "bjw-s.common.lib.route.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $routeObject := .object -}} - - {{/* Route Types */}} - {{- $routeKind := $routeObject.kind | default "HTTPRoute"}} - {{- if and (ne $routeKind "GRPCRoute") (ne $routeKind "HTTPRoute") (ne $routeKind "TCPRoute") (ne $routeKind "TLSRoute") (ne $routeKind "UDPRoute") }} - {{- fail (printf "Not a valid route kind (%s)" $routeKind) }} - {{- end }} - - {{/* Route Rules */}} - - {{- range $routeObject.rules }} - {{- if and (.filters) (.backendRefs) }} - {{- range .filters }} - {{- if eq .type "RequestRedirect" }} - {{- fail (printf "backend refs and request redirect filters cannot co-exist.")}} - {{- end }} - {{- end }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_valuesToObject.tpl deleted file mode 100644 index 1b4366312..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/routes/_valuesToObject.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Convert Route values to an object -*/}} -{{- define "bjw-s.common.lib.route.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Determine and inject the Route name */ -}} - {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - - {{- if $objectValues.nameOverride -}} - {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} - {{- else -}} - {{- if ne $identifier (include "bjw-s.common.lib.route.primary" $rootContext) -}} - {{- $objectName = printf "%s-%s" $objectName $identifier -}} - {{- end -}} - {{- end -}} - {{- $_ := set $objectValues "name" $objectName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Return the Route object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_getByIdentifier.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_getByIdentifier.tpl deleted file mode 100644 index ddcb4547a..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_getByIdentifier.tpl +++ /dev/null @@ -1,12 +0,0 @@ -{{/* -Return a secret Object by its Identifier. -*/}} -{{- define "bjw-s.common.lib.secret.getByIdentifier" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - - {{- $secretValues := dig $identifier nil $rootContext.Values.secrets -}} - {{- if not (empty $secretValues) -}} - {{- include "bjw-s.common.lib.secret.valuesToObject" (dict "rootContext" $rootContext "id" $identifier "values" $secretValues) -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_validate.tpl deleted file mode 100644 index 82603992f..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_validate.tpl +++ /dev/null @@ -1,7 +0,0 @@ -{{/* -Validate Secret values -*/}} -{{- define "bjw-s.common.lib.secret.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $secretValues := .object -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_valuesToObject.tpl deleted file mode 100644 index 59f89d17a..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/secret/_valuesToObject.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Convert Secret values to an object -*/}} -{{- define "bjw-s.common.lib.secret.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Determine and inject the Secret name */ -}} - {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - - {{- if $objectValues.nameOverride -}} - {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} - {{- else -}} - {{- if ne $identifier "main" -}} - {{- $objectName = printf "%s-%s" $objectName $identifier -}} - {{- end -}} - {{- end -}} - {{- $_ := set $objectValues "name" $objectName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Return the Secret object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_enabled_ports.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_enabled_ports.tpl deleted file mode 100644 index 6de6c1b08..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_enabled_ports.tpl +++ /dev/null @@ -1,22 +0,0 @@ -{{/* -Return the enabled ports for a given Service object. -*/}} -{{- define "bjw-s.common.lib.service.enabledPorts" -}} - {{- $rootContext := .rootContext -}} - {{- $serviceObject := .serviceObject -}} - - {{- $enabledPorts := dict -}} - - {{- range $name, $port := $serviceObject.ports -}} - {{- if kindIs "map" $port -}} - {{- $portEnabled := true -}} - {{- if hasKey $port "enabled" -}} - {{- $portEnabled = $port.enabled -}} - {{- end -}} - {{- if $portEnabled -}} - {{- $_ := set $enabledPorts $name . -}} - {{- end -}} - {{- end -}} - {{- end -}} - {{- $enabledPorts | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_enabled_services.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_enabled_services.tpl deleted file mode 100644 index 74b4ea901..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_enabled_services.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* -Return the enabled services. -*/}} -{{- define "bjw-s.common.lib.service.enabledServices" -}} - {{- $rootContext := .rootContext -}} - {{- $enabledServices := dict -}} - - {{- range $name, $service := $rootContext.Values.service -}} - {{- if kindIs "map" $service -}} - {{- /* Enable Service by default, but allow override */ -}} - {{- $serviceEnabled := true -}} - {{- if hasKey $service "enabled" -}} - {{- $serviceEnabled = $service.enabled -}} - {{- end -}} - - {{- if $serviceEnabled -}} - {{- $_ := set $enabledServices $name . -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- $enabledServices | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_getByIdentifier.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_getByIdentifier.tpl deleted file mode 100644 index c83351254..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_getByIdentifier.tpl +++ /dev/null @@ -1,13 +0,0 @@ -{{/* -Return a service Object by its Identifier. -*/}} -{{- define "bjw-s.common.lib.service.getByIdentifier" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - - {{- range $name, $serviceValues := $rootContext.Values.service -}} - {{- if eq $name $identifier -}} - {{- include "bjw-s.common.lib.service.valuesToObject" (dict "rootContext" $rootContext "id" $identifier "values" $serviceValues) -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_getPortNumberByName.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_getPortNumberByName.tpl deleted file mode 100644 index 0b9174702..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_getPortNumberByName.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{/* -Return a service port number by name for a Service object -*/}} -{{- define "bjw-s.common.lib.service.getPortNumberByName" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .serviceID -}} - {{- $portName := .portName -}} - - {{- $service := include "bjw-s.common.lib.service.getByIdentifier" (dict "rootContext" $rootContext "id" $identifier) | fromYaml -}} - - {{- if $service -}} - {{ $servicePort := dig "ports" $portName "port" nil $service -}} - {{- if not (eq $servicePort nil) -}} - {{- $servicePort -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_primaryForController.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_primaryForController.tpl deleted file mode 100644 index ebc07067f..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_primaryForController.tpl +++ /dev/null @@ -1,30 +0,0 @@ -{{/* -Return the primary service object for a controller -*/}} -{{- define "bjw-s.common.lib.service.primaryForController" -}} - {{- $rootContext := .rootContext -}} - {{- $controllerIdentifier := .controllerIdentifier -}} - - {{- $identifier := "" -}} - {{- $result := dict -}} - - {{- /* Loop over all enabled services */ -}} - {{- $enabledServices := (include "bjw-s.common.lib.service.enabledServices" (dict "rootContext" $rootContext) | fromYaml ) }} - {{- if $enabledServices -}} - {{- range $name, $service := $enabledServices -}} - {{- /* Determine the Service that has been marked as primary */ -}} - {{- if and (hasKey $service "primary") $service.primary -}} - {{- $identifier = $name -}} - {{- $result = $service -}} - {{- end -}} - {{- end -}} - - {{- /* Return the first Service if none has been explicitly marked as primary */ -}} - {{- if not $result -}} - {{- $identifier = keys $enabledServices | first -}} - {{- $result = get $enabledServices $identifier -}} - {{- end -}} - - {{- include "bjw-s.common.lib.service.valuesToObject" (dict "rootContext" $rootContext "id" $identifier "values" $result) -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_primary_port.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_primary_port.tpl deleted file mode 100644 index d921be1a7..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_primary_port.tpl +++ /dev/null @@ -1,25 +0,0 @@ -{{/* -Return the primary port for a given Service object. -*/}} -{{- define "bjw-s.common.lib.service.primaryPort" -}} - {{- $rootContext := .rootContext -}} - {{- $serviceObject := .serviceObject -}} - {{- $result := "" -}} - - {{- /* Loop over all enabled ports */ -}} - {{- $enabledPorts := include "bjw-s.common.lib.service.enabledPorts" (dict "rootContext" $rootContext "serviceObject" $serviceObject) | fromYaml }} - {{- range $name, $port := $enabledPorts -}} - {{- /* Determine the port that has been marked as primary */ -}} - {{- if and (hasKey $port "primary") $port.primary -}} - {{- $result = $port -}} - {{- end -}} - {{- end -}} - - {{- /* Return the first port if none has been explicitly marked as primary */ -}} - {{- if not $result -}} - {{- $firstPortKey := keys $enabledPorts | first -}} - {{- $result = get $enabledPorts $firstPortKey -}} - {{- end -}} - - {{- $result | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_validate.tpl deleted file mode 100644 index e9558cea3..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_validate.tpl +++ /dev/null @@ -1,37 +0,0 @@ -{{/* -Validate Service values -*/}} -{{- define "bjw-s.common.lib.service.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $serviceObject := .object -}} - - {{- if empty (get $serviceObject "controller") -}} - {{- fail (printf "controller field is required for Service. (service: %s)" $serviceObject.identifier) -}} - {{- end -}} - - {{- /* Validate Service type */ -}} - {{- $validServiceTypes := (list "ClusterIP" "LoadBalancer" "NodePort" "ExternalName" "ExternalIP") -}} - {{- if and $serviceObject.type (not (mustHas $serviceObject.type $validServiceTypes)) -}} - {{- fail ( - printf "invalid service type \"%s\" for Service with key \"%s\". Allowed values are [%s]" - $serviceObject.type - $serviceObject.identifier - (join ", " $validServiceTypes) - ) -}} - {{- end -}} - - {{- if ne $serviceObject.type "ExternalName" -}} - {{- $enabledPorts := include "bjw-s.common.lib.service.enabledPorts" (dict "rootContext" $rootContext "serviceObject" $serviceObject) | fromYaml }} - {{- /* Validate at least one port is enabled */ -}} - {{- if not $enabledPorts -}} - {{- fail (printf "no ports are enabled for Service with key \"%s\"" $serviceObject.identifier) -}} - {{- end -}} - - {{- range $name, $port := $enabledPorts -}} - {{- /* Validate a port number is configured */ -}} - {{- if not $port.port -}} - {{- fail (printf "no port number is configured for port \"%s\" under Service with key \"%s\"" $name $serviceObject.identifier) -}} - {{- end -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_valuesToObject.tpl deleted file mode 100644 index 2b1417cbe..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/service/_valuesToObject.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Convert Service values to an object -*/}} -{{- define "bjw-s.common.lib.service.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Determine and inject the Service name */ -}} - {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - - {{- if $objectValues.nameOverride -}} - {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} - {{- else -}} - {{- if not $objectValues.primary -}} - {{- $objectName = printf "%s-%s" $objectName $identifier -}} - {{- end -}} - {{- end -}} - {{- $_ := set $objectValues "name" $objectName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Return the Service object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceAccount/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceAccount/_validate.tpl deleted file mode 100644 index 8eeb37461..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceAccount/_validate.tpl +++ /dev/null @@ -1,7 +0,0 @@ -{{/* -Validate ServiceAccount values -*/}} -{{- define "bjw-s.common.lib.serviceAccount.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $serviceAccountValues := .object -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceAccount/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceAccount/_valuesToObject.tpl deleted file mode 100644 index 9451e1018..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceAccount/_valuesToObject.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* -Convert ServiceAccount values to an object -*/}} -{{- define "bjw-s.common.lib.serviceAccount.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Determine and inject the serviceAccount name */ -}} - {{- $serviceAccountName := "" -}} - {{- $defaultServiceAccountName := "default" -}} - {{- if $objectValues.create -}} - {{- $defaultServiceAccountName = (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - {{- end -}} - - {{- $serviceAccountName = default $defaultServiceAccountName $objectValues.name -}} - - {{- $_ := set $objectValues "name" $serviceAccountName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Return the serviceAccount object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceMonitor/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceMonitor/_validate.tpl deleted file mode 100644 index c63527a17..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceMonitor/_validate.tpl +++ /dev/null @@ -1,11 +0,0 @@ -{{/* -Validate serviceMonitor values -*/}} -{{- define "bjw-s.common.lib.serviceMonitor.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $serviceMonitorObject := .object -}} - - {{- if not $serviceMonitorObject.endpoints -}} - {{- fail (printf "endpoints are required for serviceMonitor with key \"%v\"" $serviceMonitorObject.identifier) -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceMonitor/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceMonitor/_valuesToObject.tpl deleted file mode 100644 index febce01da..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/serviceMonitor/_valuesToObject.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Convert ServiceMonitor values to an object -*/}} -{{- define "bjw-s.common.lib.serviceMonitor.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Determine and inject the ServiceMonitor name */ -}} - {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - - {{- if $objectValues.nameOverride -}} - {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} - {{- else -}} - {{- if ne $identifier "main" -}} - {{- $objectName = printf "%s-%s" $objectName $identifier -}} - {{- end -}} - {{- end -}} - {{- $_ := set $objectValues "name" $objectName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Return the ServiceMonitor object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_validate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_validate.tpl deleted file mode 100644 index 1bfcac738..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_validate.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* -Validate StatefulSet values -*/}} -{{- define "bjw-s.common.lib.statefulset.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $statefulsetValues := .object -}} - - {{- if and (ne $statefulsetValues.strategy "OnDelete") (ne $statefulsetValues.strategy "RollingUpdate") -}} - {{- fail (printf "Not a valid strategy type for StatefulSet. (controller: %s, strategy: %s)" $statefulsetValues.identifier $statefulsetValues.strategy) -}} - {{- end -}} - - {{- if not (empty (dig "statefulset" "volumeClaimTemplates" "" $statefulsetValues)) -}} - {{- range $index, $volumeClaimTemplate := $statefulsetValues.statefulset.volumeClaimTemplates -}} - {{- if empty (get . "size") -}} - {{- fail (printf "size is required for volumeClaimTemplate. (controller: %s, volumeClaimTemplate: %s)" $statefulsetValues.identifier $volumeClaimTemplate.name) -}} - {{- end -}} - - {{- if empty (get . "accessMode") -}} - {{- fail (printf "accessMode is required for volumeClaimTemplate. (controller: %s, volumeClaimTemplate: %s)" $statefulsetValues.identifier $volumeClaimTemplate.name) -}} - {{- end -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_valuesToObject.tpl deleted file mode 100644 index 687f4ed86..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_valuesToObject.tpl +++ /dev/null @@ -1,14 +0,0 @@ -{{/* -Convert StatefulSet values to an object -*/}} -{{- define "bjw-s.common.lib.statefulset.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- $strategy := default "RollingUpdate" $objectValues.strategy -}} - {{- $_ := set $objectValues "strategy" $strategy -}} - - {{- /* Return the StatefulSet object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_volumeClaimTemplates.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_volumeClaimTemplates.tpl deleted file mode 100644 index ab96ae799..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/lib/statefulset/_volumeClaimTemplates.tpl +++ /dev/null @@ -1,51 +0,0 @@ -{{/* -Basic VolumeClaimTemplate template -*/}} -{{- define "bjw-s.common.lib.statefulset.volumeclaimtemplate" -}} - {{- $rootContext := .rootContext -}} - {{- $values := .values -}} - -metadata: - name: {{ $values.name }} - {{- with ($values.labels | default dict) }} - labels: {{- toYaml . | nindent 10 }} - {{- end }} - {{- with ($values.annotations | default dict) }} - annotations: {{- toYaml . | nindent 10 }} - {{- end }} -spec: - accessModes: - - {{ $values.accessMode | quote }} - resources: - requests: - storage: {{ $values.size | quote }} - {{- if $values.storageClass }} - storageClassName: {{ if (eq "-" $values.storageClass) }}""{{- else }}{{ $values.storageClass | quote }}{{- end }} - {{- end }} - {{- with $values.dataSource }} - dataSource: {{- tpl (toYaml .) $rootContext | nindent 10 }} - {{- end }} - {{- with $values.dataSourceRef }} - dataSourceRef: {{- tpl (toYaml .) $rootContext | nindent 10 }} - {{- end }} -{{- end -}} - -{{/* -VolumeClaimTemplates for StatefulSet -*/}} -{{- define "bjw-s.common.lib.statefulset.volumeclaimtemplates" -}} - {{- $rootContext := .rootContext -}} - {{- $statefulsetObject := .statefulsetObject -}} - - {{- /* Default to empty list */ -}} - {{- $volumeClaimTemplates := list -}} - - {{- range $index, $volumeClaimTemplate := (dig "statefulset" "volumeClaimTemplates" list $statefulsetObject) }} - {{- $vct := include "bjw-s.common.lib.statefulset.volumeclaimtemplate" (dict "rootContext" $rootContext "values" $volumeClaimTemplate) -}} - {{- $volumeClaimTemplates = append $volumeClaimTemplates ($vct | fromYaml) -}} - {{- end -}} - - {{- if not (empty $volumeClaimTemplates) -}} - {{ $volumeClaimTemplates | toYaml }} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_all.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_all.tpl deleted file mode 100644 index f0b700788..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_all.tpl +++ /dev/null @@ -1,10 +0,0 @@ -{{/* -Main entrypoint for the common library chart. It will render all underlying templates based on the provided values. -*/}} -{{- define "bjw-s.common.loader.all" -}} - {{- /* Generate chart and dependency values */ -}} - {{- include "bjw-s.common.loader.init" . -}} - - {{- /* Generate remaining objects */ -}} - {{- include "bjw-s.common.loader.generate" . -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_generate.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_generate.tpl deleted file mode 100644 index 43750162a..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_generate.tpl +++ /dev/null @@ -1,16 +0,0 @@ -{{/* -Secondary entrypoint and primary loader for the common chart -*/}} -{{- define "bjw-s.common.loader.generate" -}} - {{- /* Build the templates */ -}} - {{- include "bjw-s.common.render.pvcs" . | nindent 0 -}} - {{- include "bjw-s.common.render.serviceAccount" . | nindent 0 -}} - {{- include "bjw-s.common.render.controllers" . | nindent 0 -}} - {{- include "bjw-s.common.render.services" . | nindent 0 -}} - {{- include "bjw-s.common.render.ingresses" . | nindent 0 -}} - {{- include "bjw-s.common.render.serviceMonitors" . | nindent 0 -}} - {{- include "bjw-s.common.render.routes" . | nindent 0 -}} - {{- include "bjw-s.common.render.configMaps" . | nindent 0 -}} - {{- include "bjw-s.common.render.secrets" . | nindent 0 -}} - {{- include "bjw-s.common.render.networkpolicies" . | nindent 0 -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_init.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_init.tpl deleted file mode 100644 index 95f63f62c..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/loader/_init.tpl +++ /dev/null @@ -1,4 +0,0 @@ -{{- define "bjw-s.common.loader.init" -}} - {{- /* Merge the local chart values and the common chart defaults */ -}} - {{- include "bjw-s.common.values.init" . }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_configmaps.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_configmaps.tpl deleted file mode 100644 index 7d69205df..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_configmaps.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{{/* -Renders the configMap objects required by the chart. -*/}} -{{- define "bjw-s.common.render.configMaps" -}} - {{- /* Generate named configMaps as required */ -}} - {{- range $key, $configMap := .Values.configMaps }} - {{- /* Enable configMap by default, but allow override */ -}} - {{- $configMapEnabled := true -}} - {{- if hasKey $configMap "enabled" -}} - {{- $configMapEnabled = $configMap.enabled -}} - {{- end -}} - - {{- if $configMapEnabled -}} - {{- $configMapValues := (mustDeepCopy $configMap) -}} - - {{- /* Create object from the raw configMap values */ -}} - {{- $configMapObject := (include "bjw-s.common.lib.configMap.valuesToObject" (dict "rootContext" $ "id" $key "values" $configMapValues)) | fromYaml -}} - - {{- /* Perform validations on the configMap before rendering */ -}} - {{- include "bjw-s.common.lib.configMap.validate" (dict "rootContext" $ "object" $configMapObject) -}} - - {{/* Include the configMap class */}} - {{- include "bjw-s.common.class.configMap" (dict "rootContext" $ "object" $configMapObject) | nindent 0 -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_controllers.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_controllers.tpl deleted file mode 100644 index 0d58998f4..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_controllers.tpl +++ /dev/null @@ -1,45 +0,0 @@ -{{/* -Renders the controller objects required by the chart. -*/}} -{{- define "bjw-s.common.render.controllers" -}} - {{- /* Generate named controller objects as required */ -}} - {{- range $key, $controller := .Values.controllers -}} - {{- /* Enable controller by default, but allow override */ -}} - {{- $controllerEnabled := true -}} - {{- if hasKey $controller "enabled" -}} - {{- $controllerEnabled = $controller.enabled -}} - {{- end -}} - - {{- if $controllerEnabled -}} - {{- $controllerValues := $controller -}} - - {{- /* Create object from the raw controller values */ -}} - {{- $controllerObject := (include "bjw-s.common.lib.controller.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerValues)) | fromYaml -}} - - {{- /* Perform validations on the controller before rendering */ -}} - {{- include "bjw-s.common.lib.controller.validate" (dict "rootContext" $ "object" $controllerObject) -}} - - {{- if eq $controllerObject.type "deployment" -}} - {{- $deploymentObject := (include "bjw-s.common.lib.deployment.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} - {{- include "bjw-s.common.lib.deployment.validate" (dict "rootContext" $ "object" $deploymentObject) -}} - {{- include "bjw-s.common.class.deployment" (dict "rootContext" $ "object" $deploymentObject) | nindent 0 -}} - {{- else if eq $controllerObject.type "cronjob" -}} - {{- $cronjobObject := (include "bjw-s.common.lib.cronjob.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} - {{- include "bjw-s.common.lib.cronjob.validate" (dict "rootContext" $ "object" $cronjobObject) -}} - {{- include "bjw-s.common.class.cronjob" (dict "rootContext" $ "object" $cronjobObject) | nindent 0 -}} - {{- else if eq $controllerObject.type "daemonset" -}} - {{- $daemonsetObject := (include "bjw-s.common.lib.daemonset.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} - {{- include "bjw-s.common.lib.daemonset.validate" (dict "rootContext" $ "object" $daemonsetObject) -}} - {{- include "bjw-s.common.class.daemonset" (dict "rootContext" $ "object" $daemonsetObject) | nindent 0 -}} - {{- else if eq $controllerObject.type "statefulset" -}} - {{- $statefulsetObject := (include "bjw-s.common.lib.statefulset.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} - {{- include "bjw-s.common.lib.statefulset.validate" (dict "rootContext" $ "object" $statefulsetObject) -}} - {{- include "bjw-s.common.class.statefulset" (dict "rootContext" $ "object" $statefulsetObject) | nindent 0 -}} - {{- else if eq $controllerObject.type "job" -}} - {{- $jobObject := (include "bjw-s.common.lib.job.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} - {{- include "bjw-s.common.lib.job.validate" (dict "rootContext" $ "object" $jobObject) -}} - {{- include "bjw-s.common.class.job" (dict "rootContext" $ "object" $jobObject) | nindent 0 -}} - {{- end -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_ingresses.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_ingresses.tpl deleted file mode 100644 index c0cbc24a0..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_ingresses.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{{/* -Renders the Ingress objects required by the chart. -*/}} -{{- define "bjw-s.common.render.ingresses" -}} - {{- /* Generate named Ingresses as required */ -}} - {{- range $key, $ingress := .Values.ingress }} - {{- /* Enable Ingress by default, but allow override */ -}} - {{- $ingressEnabled := true -}} - {{- if hasKey $ingress "enabled" -}} - {{- $ingressEnabled = $ingress.enabled -}} - {{- end -}} - - {{- if $ingressEnabled -}} - {{- $ingressValues := (mustDeepCopy $ingress) -}} - - {{- /* Create object from the raw ingress values */ -}} - {{- $ingressObject := (include "bjw-s.common.lib.ingress.valuesToObject" (dict "rootContext" $ "id" $key "values" $ingressValues)) | fromYaml -}} - - {{- /* Perform validations on the ingress before rendering */ -}} - {{- include "bjw-s.common.lib.ingress.validate" (dict "rootContext" $ "object" $ingressObject) -}} - - {{/* Include the ingress class */}} - {{- include "bjw-s.common.class.ingress" (dict "rootContext" $ "object" $ingressObject) | nindent 0 -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_networkpolicies.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_networkpolicies.tpl deleted file mode 100644 index d35a591ba..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_networkpolicies.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{{/* -Renders the networkPolicy objects required by the chart. -*/}} -{{- define "bjw-s.common.render.networkpolicies" -}} - {{- /* Generate named networkPolicy as required */ -}} - {{- range $key, $networkPolicy := .Values.networkpolicies }} - {{- /* Enable networkPolicy by default, but allow override */ -}} - {{- $networkPolicyEnabled := true -}} - {{- if hasKey $networkPolicy "enabled" -}} - {{- $networkPolicyEnabled = $networkPolicy.enabled -}} - {{- end -}} - - {{- if $networkPolicyEnabled -}} - {{- $networkPolicyValues := (mustDeepCopy $networkPolicy) -}} - - {{- /* Create object from the raw networkPolicy values */ -}} - {{- $networkPolicyObject := (include "bjw-s.common.lib.networkpolicy.valuesToObject" (dict "rootContext" $ "id" $key "values" $networkPolicyValues)) | fromYaml -}} - - {{- /* Perform validations on the networkPolicy before rendering */ -}} - {{- include "bjw-s.common.lib.networkpolicy.validate" (dict "rootContext" $ "object" $networkPolicyObject) -}} - - {{/* Include the networkPolicy class */}} - {{- include "bjw-s.common.class.networkpolicy" (dict "rootContext" $ "object" $networkPolicyObject) | nindent 0 -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_pvcs.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_pvcs.tpl deleted file mode 100644 index 98d7df5e3..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_pvcs.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{{/* -Renders the Persistent Volume Claim objects required by the chart. -*/}} -{{- define "bjw-s.common.render.pvcs" -}} - {{- /* Generate pvc as required */ -}} - {{- range $key, $pvc := .Values.persistence -}} - {{- /* Enable PVC by default, but allow override */ -}} - {{- $pvcEnabled := true -}} - {{- if hasKey $pvc "enabled" -}} - {{- $pvcEnabled = $pvc.enabled -}} - {{- end -}} - - {{- if and $pvcEnabled (eq (default "persistentVolumeClaim" $pvc.type) "persistentVolumeClaim") (not $pvc.existingClaim) -}} - {{- $pvcValues := (mustDeepCopy $pvc) -}} - - {{- /* Create object from the raw PVC values */ -}} - {{- $pvcObject := (include "bjw-s.common.lib.pvc.valuesToObject" (dict "rootContext" $ "id" $key "values" $pvcValues)) | fromYaml -}} - - {{- /* Perform validations on the PVC before rendering */ -}} - {{- include "bjw-s.common.lib.pvc.validate" (dict "rootContext" $ "object" $pvcValues) -}} - - {{- /* Include the PVC class */ -}} - {{- include "bjw-s.common.class.pvc" (dict "rootContext" $ "object" $pvcValues) | nindent 0 -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_routes.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_routes.tpl deleted file mode 100644 index 12e89caac..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_routes.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* Renders the Route objects required by the chart */}} -{{- define "bjw-s.common.render.routes" -}} - {{- /* Generate named routes as required */ -}} - {{- range $key, $route := .Values.route }} - {{- /* Enable Route by default, but allow override */ -}} - {{- $routeEnabled := true -}} - {{- if hasKey $route "enabled" -}} - {{- $routeEnabled = $route.enabled -}} - {{- end -}} - - {{- if $routeEnabled -}} - {{- $routeValues := (mustDeepCopy $route) -}} - - {{- /* Create object from the raw Route values */ -}} - {{- $routeObject := (include "bjw-s.common.lib.route.valuesToObject" (dict "rootContext" $ "id" $key "values" $routeValues)) | fromYaml -}} - - {{- /* Perform validations on the Route before rendering */ -}} - {{- include "bjw-s.common.lib.route.validate" (dict "rootContext" $ "object" $routeObject) -}} - - {{- /* Include the Route class */ -}} - {{- include "bjw-s.common.class.route" (dict "rootContext" $ "object" $routeObject) | nindent 0 -}} - {{- end }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_secrets.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_secrets.tpl deleted file mode 100644 index feaaed2db..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_secrets.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{{/* -Renders the Secret objects required by the chart. -*/}} -{{- define "bjw-s.common.render.secrets" -}} - {{- /* Generate named Secrets as required */ -}} - {{- range $key, $secret := .Values.secrets }} - {{- /* Enable Secret by default, but allow override */ -}} - {{- $secretEnabled := true -}} - {{- if hasKey $secret "enabled" -}} - {{- $secretEnabled = $secret.enabled -}} - {{- end -}} - - {{- if $secretEnabled -}} - {{- $secretValues := (mustDeepCopy $secret) -}} - - {{- /* Create object from the raw Secret values */ -}} - {{- $secretObject := (include "bjw-s.common.lib.secret.valuesToObject" (dict "rootContext" $ "id" $key "values" $secretValues)) | fromYaml -}} - - {{- /* Perform validations on the Secret before rendering */ -}} - {{- include "bjw-s.common.lib.secret.validate" (dict "rootContext" $ "object" $secretObject) -}} - - {{/* Include the Secret class */}} - {{- include "bjw-s.common.class.secret" (dict "rootContext" $ "object" $secretObject) | nindent 0 -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_serviceMonitors.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_serviceMonitors.tpl deleted file mode 100644 index ab8c1ff24..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_serviceMonitors.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{{/* -Renders the serviceMonitor objects required by the chart. -*/}} -{{- define "bjw-s.common.render.serviceMonitors" -}} - {{- /* Generate named serviceMonitors as required */ -}} - {{- range $key, $serviceMonitor := .Values.serviceMonitor -}} - {{- /* Enable ServiceMonitor by default, but allow override */ -}} - {{- $serviceMonitorEnabled := true -}} - {{- if hasKey $serviceMonitor "enabled" -}} - {{- $serviceMonitorEnabled = $serviceMonitor.enabled -}} - {{- end -}} - - {{- if $serviceMonitorEnabled -}} - {{- $serviceMonitorValues := (mustDeepCopy $serviceMonitor) -}} - - {{- /* Create object from the raw ServiceMonitor values */ -}} - {{- $serviceMonitorObject := (include "bjw-s.common.lib.serviceMonitor.valuesToObject" (dict "rootContext" $ "id" $key "values" $serviceMonitorValues)) | fromYaml -}} - - {{- /* Perform validations on the serviceMonitor before rendering */ -}} - {{- include "bjw-s.common.lib.serviceMonitor.validate" (dict "rootContext" $ "object" $serviceMonitorObject) -}} - - {{/* Include the serviceMonitor class */}} - {{- include "bjw-s.common.class.serviceMonitor" (dict "rootContext" $ "object" $serviceMonitorObject) | nindent 0 -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_serviceaccount.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_serviceaccount.tpl deleted file mode 100644 index ad6f49a65..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_serviceaccount.tpl +++ /dev/null @@ -1,20 +0,0 @@ -{{/* -Renders the serviceAccount object required by the chart. -*/}} -{{- define "bjw-s.common.render.serviceAccount" -}} - {{- if .Values.serviceAccount.create -}} - {{- $serviceAccountValues := (mustDeepCopy .Values.serviceAccount) -}} - - {{- /* Create object from the raw ServiceAccount values */ -}} - {{- $serviceAccountObject := (include "bjw-s.common.lib.serviceAccount.valuesToObject" (dict "rootContext" $ "id" "default" "values" $serviceAccountValues)) | fromYaml -}} - - {{- /* Perform validations on the ServiceAccount before rendering */ -}} - {{- include "bjw-s.common.lib.serviceAccount.validate" (dict "rootContext" $ "object" $serviceAccountObject) -}} - - {{/* Include the serviceAccount class */}} - {{- include "bjw-s.common.class.serviceAccount" (dict "rootContext" $ "object" $serviceAccountObject) | nindent 0 -}} - - {{- /* Create a service account secret */ -}} - {{- $_ := set .Values.secrets "sa-token" (dict "enabled" true "annotations" (dict "kubernetes.io/service-account.name" $serviceAccountObject.name) "type" "kubernetes.io/service-account-token") -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_services.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_services.tpl deleted file mode 100644 index cf6f6ee8b..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/render/_services.tpl +++ /dev/null @@ -1,19 +0,0 @@ -{{/* -Renders the Service objects required by the chart. -*/}} -{{- define "bjw-s.common.render.services" -}} - {{- /* Generate named Services as required */ -}} - {{- $enabledServices := (include "bjw-s.common.lib.service.enabledServices" (dict "rootContext" $) | fromYaml ) -}} - {{- range $key, $svc := $enabledServices -}} - {{- $serviceValues := (mustDeepCopy $svc) -}} - - {{- /* Create object from the raw Service values */ -}} - {{- $serviceObject := (include "bjw-s.common.lib.service.valuesToObject" (dict "rootContext" $ "id" $key "values" $serviceValues)) | fromYaml -}} - - {{- /* Perform validations on the Service before rendering */ -}} - {{- include "bjw-s.common.lib.service.validate" (dict "rootContext" $ "object" $serviceObject) -}} - - {{- /* Include the Service class */ -}} - {{- include "bjw-s.common.class.service" (dict "rootContext" $ "object" $serviceObject) | nindent 0 -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/values/_init.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/values/_init.tpl deleted file mode 100644 index e9a7af8f1..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/templates/values/_init.tpl +++ /dev/null @@ -1,11 +0,0 @@ -{{/* -Merge the local chart values and the common chart defaults -*/}} -{{- define "bjw-s.common.values.init" -}} - {{- if .Values.common -}} - {{- $defaultValues := deepCopy .Values.common -}} - {{- $userValues := deepCopy (omit .Values "common") -}} - {{- $mergedValues := mustMergeOverwrite $defaultValues $userValues -}} - {{- $_ := set . "Values" (deepCopy $mergedValues) -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/values.yaml b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/values.yaml deleted file mode 100644 index 30b1bd135..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/charts/common/values.yaml +++ /dev/null @@ -1,740 +0,0 @@ ---- -global: - # -- Set an override for the prefix of the fullname - nameOverride: - # -- Set the entire name definition - fullnameOverride: - # -- Set additional global labels. Helm templates can be used. - labels: {} - # -- Set additional global annotations. Helm templates can be used. - annotations: {} - -# -- Set default options for all controllers / pods here -# Each of these options can be overridden on a Controller level -defaultPodOptions: - # -- Defines affinity constraint rules. - # [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity) - affinity: {} - - # -- Set annotations on the Pod. Pod-specific values will be merged with this. - annotations: {} - - # -- Specifies whether a service account token should be automatically mounted. - automountServiceAccountToken: true - - # -- Configuring the ndots option may resolve nslookup issues on some Kubernetes setups. - dnsConfig: - {} - # options: - # - name: ndots - # value: "1" - - # -- Defaults to "ClusterFirst" if hostNetwork is false - # and "ClusterFirstWithHostNet" if hostNetwork is true. - dnsPolicy: # ClusterFirst - - # -- Enable/disable the generation of environment variables for services. - # [[ref]](https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#accessing-the-service) - enableServiceLinks: true - - # -- Allows specifying explicit hostname setting - hostname: - - # -- Use hostAliases to add custom entries to /etc/hosts - mapping IP addresses to hostnames. - # [[ref]](https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/) - hostAliases: [] - # - ip: "192.168.1.100" - # hostnames: - # - "example.com" - # - "www.example.com" - - # -- Use the host's ipc namespace - hostIPC: false - - # -- When using hostNetwork make sure you set dnsPolicy to `ClusterFirstWithHostNet` - hostNetwork: false - - # -- Use the host's pid namespace - hostPID: false - - # -- Set image pull secrets - imagePullSecrets: [] - - # -- Set labels on the Pod. Pod-specific values will be merged with this. - labels: {} - - # -- Node selection constraint - # [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector) - nodeSelector: {} - - # -- Custom priority class for different treatment by the scheduler - priorityClassName: # system-node-critical - - # -- Set Container restart policy. - # @default -- `Always`. When `controller.type` is `cronjob` it defaults to `Never`. - restartPolicy: - - # -- Allow specifying a runtimeClassName other than the default one (ie: nvidia) - runtimeClassName: # nvidia - - # -- Allows specifying a custom scheduler name - schedulerName: # awkward-dangerous-scheduler - - # -- Configure the Security Context for the Pod - securityContext: {} - - # -- Duration in seconds the pod needs to terminate gracefully - # -- [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle)] - terminationGracePeriodSeconds: - - # -- Specify taint tolerations - # [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) - tolerations: [] - - # -- Defines topologySpreadConstraint rules. - # [[ref]](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) - topologySpreadConstraints: [] - # - maxSkew: - # topologyKey: - # whenUnsatisfiable: - # labelSelector: - -controllers: - main: - # -- enable the controller. - enabled: true - - # -- Set the controller type. - # Valid options are deployment, daemonset, statefulset, cronjob or job - type: deployment - # -- Set annotations on the deployment/statefulset/daemonset/cronjob/job - annotations: {} - # -- Set labels on the deployment/statefulset/daemonset/cronjob/job - labels: {} - # -- Number of desired pods. When using a HorizontalPodAutoscaler, set this to `null`. - replicas: 1 - # -- Set the controller upgrade strategy - # For Deployments, valid values are Recreate (default) and RollingUpdate. - # For StatefulSets, valid values are OnDelete and RollingUpdate (default). - # DaemonSets/CronJobs/Jobs ignore this. - strategy: - - rollingUpdate: - # -- Set deployment RollingUpdate max unavailable - unavailable: - # -- Set deployment RollingUpdate max surge - surge: - # -- Set statefulset RollingUpdate partition - partition: - # -- ReplicaSet revision history limit - revisionHistoryLimit: 3 - - # -- CronJob configuration. Required only when using `controller.type: cronjob`. - # @default -- See below - cronjob: - # -- Suspends the CronJob - # [[ref]](https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#schedule-suspension) - # @default -- false - suspend: - # -- Specifies how to treat concurrent executions of a job that is created by this cron job - # valid values are Allow, Forbid or Replace - concurrencyPolicy: Forbid - # -- Sets the CronJob timezone (only works in Kubernetes >= 1.27) - timeZone: - # -- Sets the CronJob time when to execute your jobs - schedule: "*/20 * * * *" - # -- The deadline in seconds for starting the job if it misses its scheduled time for any reason - startingDeadlineSeconds: 30 - # -- The number of succesful Jobs to keep - successfulJobsHistory: 1 - # -- The number of failed Jobs to keep - failedJobsHistory: 1 - # -- If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to - # be automatically deleted. - ttlSecondsAfterFinished: - # -- Limits the number of times a failed job will be retried - backoffLimit: 6 - - # -- Job configuration. Required only when using `controller.type: job`. - # @default -- See below - job: - # -- Suspends the Job - # [[ref]](https://kubernetes.io/docs/concepts/workloads/controllers/job/#suspending-a-job) - # @default -- false - suspend: - # -- If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to - # be automatically deleted. - ttlSecondsAfterFinished: - # -- Limits the number of times a failed job will be retried - backoffLimit: 6 - - # -- StatefulSet configuration. Required only when using `controller.type: statefulset`. - statefulset: - # -- Set podManagementPolicy, valid values are Parallel and OrderedReady (default). - podManagementPolicy: - - # -- Used to create individual disks for each instance. - volumeClaimTemplates: [] - # - name: data - # labels: {} - # annotations: {} - # globalMounts: - # - path: /data - # accessMode: "ReadWriteOnce" - # dataSourceRef: - # apiGroup: snapshot.storage.k8s.io - # kind: VolumeSnapshot - # name: MySnapshot - # size: 1Gi - # - name: backup - # labels: {} - # annotations: {} - # globalMounts: - # - path: /backup - # subPath: theSubPath - # accessMode: "ReadWriteOnce" - # size: 2Gi - # storageClass: cheap-storage-class - - # Controller-specific overrides for `defaultPodOptions` keys - pod: {} - - containers: - main: - # -- Override the container name - nameOverride: - - # -- Override the default container order - # Containers get sorted alphanumerically by the `-` combination. - # @default -- 99 - order: 1 - - # -- Specify if this container depends on any other containers - # This is used to determine the order in which the containers are rendered. - # The use of "dependsOn" completely disables the "order" field within the controller. - dependsOn: [] - - image: - # -- image repository - repository: - # -- image tag - tag: - # -- image pull policy - pullPolicy: - - # -- Override the command(s) for the default container - command: [] - # -- Override the args for the default container - args: [] - # -- Override the working directory for the default container - workingDir: - - # -- Environment variables. Template enabled. - # Syntax options: - # A) TZ: UTC - # B) PASSWD: '{{ .Release.Name }}' - # B) TZ: - # value: UTC - # dependsOn: otherVar - # D) PASSWD: - # configMapKeyRef: - # name: config-map-name - # key: key-name - # E) PASSWD: - # dependsOn: - # - otherVar1 - # - otherVar2 - # valueFrom: - # secretKeyRef: - # name: secret-name - # key: key-name - # ... - # F) - name: TZ - # value: UTC - # G) - name: TZ - # value: '{{ .Release.Name }}' - env: - - # -- Secrets and/or ConfigMaps that will be loaded as environment variables. - # Syntax options: - # A) Pass an app-template configMap identifier: - # - config: config - # B) Pass any configMap name that is not also an identifier (Template enabled): - # - config: random-configmap-name - # C) Pass an app-template configMap identifier, explicit syntax: - # - configMapRef: - # identifier: config - # D) Pass any configMap name, explicit syntax (Template enabled): - # - configMapRef: - # name: "{{ .Release.Name }}-config" - # E) Pass an app-template secret identifier: - # - secret: secret - # F) Pass any secret name that is not also an identifier (Template enabled): - # - secret: random-secret-name - # G) Pass an app-template secret identifier, explicit syntax: - # - secretRef: - # identifier: secret - # H) Pass any secret name, explicit syntax (Template enabled): - # - secretRef: - # name: "{{ .Release.Name }}-secret" - envFrom: [] - - # -- Probe configuration - # -- [[ref]](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) - # @default -- See below - probes: - # -- Liveness probe configuration - # @default -- See below - liveness: - # -- Enable the liveness probe - enabled: true - # -- Set this to `true` if you wish to specify your own livenessProbe - custom: false - # -- sets the probe type when not using a custom probe - # @default -- "TCP" - type: TCP - # -- The spec field contains the values for the default livenessProbe. - # If you selected `custom: true`, this field holds the definition of the livenessProbe. - # @default -- See below - spec: - initialDelaySeconds: 0 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - - # -- Redainess probe configuration - # @default -- See below - readiness: - # -- Enable the readiness probe - enabled: true - # -- Set this to `true` if you wish to specify your own readinessProbe - custom: false - # -- sets the probe type when not using a custom probe - # @default -- "TCP" - type: TCP - # -- The spec field contains the values for the default readinessProbe. - # If you selected `custom: true`, this field holds the definition of the readinessProbe. - # @default -- See below - spec: - initialDelaySeconds: 0 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - - # -- Startup probe configuration - # @default -- See below - startup: - # -- Enable the startup probe - enabled: true - # -- Set this to `true` if you wish to specify your own startupProbe - custom: false - # -- sets the probe type when not using a custom probe - # @default -- "TCP" - type: TCP - # -- The spec field contains the values for the default startupProbe. - # If you selected `custom: true`, this field holds the definition of the startupProbe. - # @default -- See below - spec: - initialDelaySeconds: 0 - timeoutSeconds: 1 - ## This means it has a maximum of 5*30=150 seconds to start up before it fails - periodSeconds: 5 - failureThreshold: 30 - - # -- Set the resource requests / limits for the container. - resources: - {} - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - # limits: - # cpu: 100m - # memory: 128Mi - # requests: - # cpu: 100m - # memory: 128Mi - - # -- Configure the Security Context for the container - securityContext: {} - - # -- Configure the lifecycle event hooks for the container - # -- [[ref](https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/)] - lifecycle: {} - - # -- Configure the path at which the file to which the containers termination message will be written. - # -- [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle-1)] - terminationMessagePath: - - # -- Indicate how the containers termination message should be populated. - # Valid options are `File` and `FallbackToLogsOnError`. - # -- [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle-1)] - terminationMessagePolicy: - - # -- Specify any initContainers here as dictionary items. - # Each initContainer should have its own key - # initContainers get sorted alphanumerically by the `-` combination - # if no order or dependsOn has been configured for them. - initContainers: {} - -serviceAccount: - # -- Specifies whether a service account should be created - create: false - - # -- Annotations to add to the service account - annotations: {} - - # -- Labels to add to the service account - labels: {} - - # -- The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: "" - -# -- Use this to populate secrets with the values you specify. -# Be aware that these values are not encrypted by default, and could therefore visible -# to anybody with access to the values.yaml file. -# Additional Secrets can be added by adding a dictionary key similar to the 'secret' object. -# @default -- See below -secrets: - secret: - # -- Enables or disables the Secret - enabled: false - # -- Labels to add to the Secret - labels: {} - # -- Annotations to add to the Secret - annotations: {} - # -- Secret stringData content. Helm template enabled. - stringData: - {} - # foo: bar - -# -- Configure configMaps for the chart here. -# Additional configMaps can be added by adding a dictionary key similar to the 'config' object. -# @default -- See below -configMaps: - config: - # -- Enables or disables the configMap - enabled: false - # -- Labels to add to the configMap - labels: {} - # -- Annotations to add to the configMap - annotations: {} - # -- configMap data content. Helm template enabled. - data: - {} - # foo: bar - -# -- Configure the services for the chart here. -# Additional services can be added by adding a dictionary key similar to the 'main' service. -# @default -- See below -service: - main: - # -- Enables or disables the service - enabled: true - - # -- Override the name suffix that is used for this service - nameOverride: - - # -- Configure which controller this service should target - controller: main - - # -- Make this the primary service for this controller (used in probes, notes, etc...). - # If there is more than 1 service targeting the controller, make sure that only 1 service is - # marked as primary. - primary: true - - # -- Set the service type - type: ClusterIP - - # -- Specify the externalTrafficPolicy for the service. Options: Cluster, Local - # -- [[ref](https://kubernetes.io/docs/tutorials/services/source-ip/)] - externalTrafficPolicy: - - # -- Specify the ip policy. Options: SingleStack, PreferDualStack, RequireDualStack - ipFamilyPolicy: - # -- The ip families that should be used. Options: IPv4, IPv6 - ipFamilies: [] - - # -- Provide additional annotations which may be required. - annotations: {} - - # -- Provide additional labels which may be required. - labels: {} - - # -- Allow adding additional match labels - extraSelectorLabels: {} - - # -- Configure the Service port information here. - # Additional ports can be added by adding a dictionary key similar to the 'http' service. - # @default -- See below - ports: - http: - # -- Enables or disables the port - enabled: true - - # -- Make this the primary port (used in probes, notes, etc...) - # If there is more than 1 service, make sure that only 1 port is marked as primary. - primary: true - - # -- The port number - port: - - # -- Port protocol. - # Support values are `HTTP`, `HTTPS`, `TCP` and `UDP`. - # HTTP and HTTPS spawn a TCP service and get used for internal URL and name generation - protocol: HTTP - - # -- Specify a service targetPort if you wish to differ the service port from the application port. - # If `targetPort` is specified, this port number is used in the container definition instead of - # the `port` value. Therefore named ports are not supported for this field. - targetPort: - - # -- Specify the nodePort value for the LoadBalancer and NodePort service types. - # [[ref]](https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport) - nodePort: - - # -- Specify the appProtocol value for the Service. - # [[ref]](https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol) - appProtocol: - -# -- Configure the ServiceMonitors for the chart here. -# Additional ServiceMonitors can be added by adding a dictionary key similar to the 'main' ServiceMonitors. -# @default -- See below -serviceMonitor: - main: - # -- Enables or disables the serviceMonitor. - enabled: false - - # -- Override the name suffix that is used for this serviceMonitor. - nameOverride: - - # -- Provide additional annotations which may be required. - annotations: {} - - # -- Provide additional labels which may be required. - labels: {} - - # -- Configures a custom selector for the serviceMonitor, this takes precedence over - # specifying a service name. - # Helm templates can be used. - selector: {} - - # -- Configures the target Service for the serviceMonitor. Helm templates can be used. - serviceName: '{{ include "bjw-s.common.lib.chart.names.fullname" $ }}' - - # -- Configures the endpoints for the serviceMonitor. - # @default -- See values.yaml - endpoints: - - port: http - scheme: http - path: /metrics - interval: 1m - scrapeTimeout: 10s - - # -- Configures custom targetLabels for the serviceMonitor. (All collected - # meterics will have these labels, taking the value from the target service) - # [[ref]](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#servicemonitorspec/) - targetLabels: [] - -# -- Configure the ingresses for the chart here. -# Additional ingresses can be added by adding a dictionary key similar to the 'main' ingress. -# @default -- See below -ingress: - main: - # -- Enables or disables the ingress - enabled: false - - # -- Make this the primary ingress (used in probes, notes, etc...). - # If there is more than 1 ingress, make sure that only 1 ingress is marked as primary. - primary: true - - # -- Override the name suffix that is used for this ingress. - nameOverride: - - # -- Provide additional annotations which may be required. - annotations: - {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - - # -- Provide additional labels which may be required. - labels: {} - - # -- Set the ingressClass that is used for this ingress. - className: # "nginx" - - # -- Configure the defaultBackend for this ingress. This will disable any other rules for the ingress. - defaultBackend: - - ## Configure the hosts for the ingress - hosts: - - # -- Host address. Helm template can be passed. - host: chart-example.local - ## Configure the paths for the host - paths: - - # -- Path. Helm template can be passed. - path: / - pathType: Prefix - service: - # -- Overrides the service name reference for this path - # This can be an actual service name, or reference a service identifier - # from this values.yaml - name: main - # -- Overrides the service port number reference for this path - port: - - # -- Configure TLS for the ingress. Both secretName and hosts can process a Helm template. - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - -# -- Configure the gateway routes for the chart here. -# Additional routes can be added by adding a dictionary key similar to the 'main' route. -# [[ref]](https://gateway-api.sigs.k8s.io/references/spec/) -# @default -- See below -route: - main: - # -- Enables or disables the route - enabled: false - - # -- Set the route kind - # Valid options are GRPCRoute, HTTPRoute, TCPRoute, TLSRoute, UDPRoute - kind: HTTPRoute - - # -- Override the name suffix that is used for this route. - nameOverride: - - # -- Provide additional annotations which may be required. - annotations: {} - - # -- Provide additional labels which may be required. - labels: {} - - # -- Configure the resource the route attaches to. - parentRefs: - - # Group of the referent resource. - group: gateway.networking.k8s.io - # Kind of the referent resource. - kind: Gateway - # Name of the referent resource - name: - # Namespace of the referent resource - namespace: - # Name of the section within the target resource. - sectionName: - - # -- Host addresses. Helm template can be passed. - hostnames: [] - - # -- Configure rules for routing. Defaults to the primary service. - rules: - - # -- Configure backends where matching requests should be sent. - backendRefs: [] - ## Configure conditions used for matching incoming requests. Only for HTTPRoutes - matches: - - path: - type: PathPrefix - value: / - ## Request filters that are applied to the rules. - filters: [] - ## Request timeout that are applied to the rules. - timeouts: {} - -# -- Configure persistence for the chart here. -# Additional items can be added by adding a dictionary key similar to the 'config' key. -# [[ref]](https://bjw-s.github.io/helm-charts/docs/common-library/common-library-storage) -# @default -- See below -persistence: - config: - # -- Enables or disables the persistence item. Defaults to true - enabled: false - - # -- Sets the persistence type - # Valid options are persistentVolumeClaim, emptyDir, nfs, hostPath, secret, configMap or custom - type: persistentVolumeClaim - - # -- Storage Class for the config volume. - # If set to `-`, dynamic provisioning is disabled. - # If set to something else, the given storageClass is used. - # If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. - storageClass: # "-" - - # -- If you want to reuse an existing claim, the name of the existing PVC can be passed here. - existingClaim: # your-claim - - # -- The optional data source for the persistentVolumeClaim. - # [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-populators-and-data-sources) - dataSource: {} - - # -- The optional volume populator for the persistentVolumeClaim. - # [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-populators-and-data-sources) - dataSourceRef: {} - - # -- AccessMode for the persistent volume. - # Make sure to select an access mode that is supported by your storage provider! - # [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes) - accessMode: ReadWriteOnce - - # -- The amount of storage that is requested for the persistent volume. - size: 1Gi - - # -- Set to true to retain the PVC upon `helm uninstall` - retain: false - - # -- Configure mounts to all controllers and containers. By default the persistence item - # will be mounted to `/`. - # Example: - # globalMounts: - # - path: /config - # readOnly: false - globalMounts: [] - - # -- Explicitly configure mounts for specific controllers and containers. - # Example: - # advancedMounts: - # main: # the controller with the "main" identifier - # main: # the container with the "main" identifier - # - path: /data/config.yaml - # readOnly: true - # mountPropagation: None - # subPath: config.yaml - # second-container: # the container with the "second-container" identifier - # - path: /appdata/config - # readOnly: true - # second-controller: # the controller with the "second-controller" identifier - # main: # the container with the "main" identifier - # - path: /data/config.yaml - # readOnly: false - # subPath: config.yaml - advancedMounts: {} - -# -- Configure the networkPolicies for the chart here. -# Additional networkPolicies can be added by adding a dictionary key similar to the 'main' networkPolicy. -# @default -- See below -networkpolicies: - main: - # -- Enables or disables the networkPolicy item. Defaults to true - enabled: false - - # -- Configure which controller this networkPolicy should target - controller: main - - # -- Define a custom podSelector for the networkPolicy. This takes precedence over targeting a controller. - # podSelector: {} - - # -- The policyTypes for this networkPolicy - policyTypes: - - Ingress - - Egress - - # -- The rulesets for this networkPolicy - # [[ref]](https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource) - rules: - # -- The ingress rules for this networkPolicy. Allows all ingress traffic by default. - ingress: - - {} - # -- The egress rules for this networkPolicy. Allows all egress traffic by default. - egress: - - {} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/templates/_helpers.tpl b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/templates/_helpers.tpl deleted file mode 100644 index 7e385d4af..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/templates/_helpers.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{- define "blobcache.init" -}} - {{/* Make sure all variables are set properly */}} - {{- include "bjw-s.common.loader.init" . }} - - {{/* Apply enforced values */}} - {{- $_ := include "blobcache.image.tag" . | fromYaml | merge .Values -}} -{{- end -}} - -{{- define "blobcache.image.tag" -}} -global: - fullnameOverride: {{ .Values.global.fullnameOverride | default "blobcache" }} -controllers: - main: - enabled: true - type: deployment - containers: - main: - command: - - blobcache - image: - repository: {{ .Values.image.repository }} - tag: "{{ .Values.image.tag | default .Chart.AppVersion }}" -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/templates/common.yaml b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/templates/common.yaml deleted file mode 100644 index 0c5c3201f..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/templates/common.yaml +++ /dev/null @@ -1,6 +0,0 @@ ---- -{{/* Set all variables properly */}} -{{- include "blobcache.init" . -}} - -{{/* Render the templates */}} -{{- include "bjw-s.common.loader.all" . -}} diff --git a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/values.yaml b/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/values.yaml deleted file mode 100644 index 58893d39b..000000000 --- a/thunder_deployment/infra/beta9/charts/beam-blobcache-chart/values.yaml +++ /dev/null @@ -1,60 +0,0 @@ ---- -# -- See the common values.yaml for all the options you can set. -# https://github.com/bjw-s/helm-charts/blob/common-2.5.0/charts/library/common/values.yaml -global: - fullnameOverride: - -image: - repository: public.ecr.aws/n4e0e1y0/beam-blobcache - tag: 0.1.2 - -controllers: - main: - annotations: {} - labels: {} - replicas: 1 - strategy: Recreate # Can be Recreate or RollingUpdate - rollingUpdate: - unavailable: - surge: - containers: - main: - resources: - limits: {} - requests: {} - # cpu: 8000m - # memory: 64Gi - -persistence: - cache: - enabled: true - type: emptyDir - medium: Memory - sizeLimit: 60Gi - -service: - main: - enabled: true - annotations: {} - labels: {} - ports: - http: - port: 2049 - targetPort: 2049 - protocol: TCP - -ingress: - main: - enabled: false - annotations: {} - labels: {} - className: # nginx, traefik, etc. - hosts: - - host: blobcache.local - paths: - - path: / - pathType: Prefix - service: - name: main # Refers to service key - port: 2049 - tls: [] diff --git a/thunder_deployment/infra/beta9/charts/common/.helmignore b/thunder_deployment/infra/beta9/charts/common/.helmignore deleted file mode 100644 index c62cbf857..000000000 --- a/thunder_deployment/infra/beta9/charts/common/.helmignore +++ /dev/null @@ -1,28 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ -# OWNERS file for Kubernetes -OWNERS -# helm-docs templates -*.gotmpl -# Test files -tests/ diff --git a/thunder_deployment/infra/beta9/charts/common/Chart.yaml b/thunder_deployment/infra/beta9/charts/common/Chart.yaml deleted file mode 100644 index 442854507..000000000 --- a/thunder_deployment/infra/beta9/charts/common/Chart.yaml +++ /dev/null @@ -1,33 +0,0 @@ -annotations: - artifacthub.io/changes: |- - - kind: fixed - description: |- - PersistentVolumeClaims now properly created based on `persistence.x.enabled` value - - kind: added - description: |- - Support suspending CronJobs - - kind: added - description: |- - Add support for targetLabels in ServiceMonitor - - kind: added - description: |- - Re-add support for setting mountPropagation on volumemounts - - kind: added - description: |- - Support `envFrom` identifiers and name templates for Secrets and ConfigMaps - - kind: added - description: |- - Support the `job` controller type to generate one-off jobs. -apiVersion: v2 -description: Function library for Helm charts -home: https://github.com/bjw-s/helm-charts/tree/main/charts/library/common -keywords: -- common -- library -kubeVersion: '>=1.22.0-0' -maintainers: -- email: me@bjw-s.dev - name: bjw-s -name: common -type: library -version: 2.5.0 diff --git a/thunder_deployment/infra/beta9/charts/common/README.md b/thunder_deployment/infra/beta9/charts/common/README.md deleted file mode 100644 index 76cef450e..000000000 --- a/thunder_deployment/infra/beta9/charts/common/README.md +++ /dev/null @@ -1,234 +0,0 @@ -# common - -![Version: 2.5.0](https://img.shields.io/badge/Version-2.5.0-informational?style=flat-square) ![Type: library](https://img.shields.io/badge/Type-library-informational?style=flat-square) - -Function library for Helm charts - -## Requirements - -Kubernetes: `>=1.22.0-0` - -## Dependencies - -| Repository | Name | Version | -|------------|------|---------| - -## Installing the Chart - -This is a [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm). - -**🚨 WARNING: THIS CHART IS NOT MEANT TO BE INSTALLED DIRECTLY** - -## Using this library - -Include this chart as a dependency in your `Chart.yaml` e.g. - -```yaml -# Chart.yaml -dependencies: - - name: common - version: 2.5.0 - repository: https://bjw-s.github.io/helm-charts/ -``` - -For more information, take a look at the [Docs](http://bjw-s.github.io/helm-charts/docs/common-library/introduction/). - -## Configuration - -Read through the [values.yaml](./values.yaml) file. It has several commented out suggested values. - -## Values - -**Important**: When deploying an application Helm chart you can add more values from the common library chart [here](https://github.com/bjw-s/helm-charts/tree/main/charts/library/common) - -The following table contains an overview of available values and their descriptions / default values. - -
-Expand - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| configMaps | object | See below | Configure configMaps for the chart here. Additional configMaps can be added by adding a dictionary key similar to the 'config' object. | -| configMaps.config.annotations | object | `{}` | Annotations to add to the configMap | -| configMaps.config.data | object | `{}` | configMap data content. Helm template enabled. | -| configMaps.config.enabled | bool | `false` | Enables or disables the configMap | -| configMaps.config.labels | object | `{}` | Labels to add to the configMap | -| controllers.main.annotations | object | `{}` | Set annotations on the deployment/statefulset/daemonset/cronjob/job | -| controllers.main.containers.main.args | list | `[]` | Override the args for the default container | -| controllers.main.containers.main.command | list | `[]` | Override the command(s) for the default container | -| controllers.main.containers.main.dependsOn | list | `[]` | Specify if this container depends on any other containers This is used to determine the order in which the containers are rendered. The use of "dependsOn" completely disables the "order" field within the controller. | -| controllers.main.containers.main.env | string | `nil` | Environment variables. Template enabled. Syntax options: A) TZ: UTC B) PASSWD: '{{ .Release.Name }}' B) TZ: value: UTC dependsOn: otherVar D) PASSWD: configMapKeyRef: name: config-map-name key: key-name E) PASSWD: dependsOn: - otherVar1 - otherVar2 valueFrom: secretKeyRef: name: secret-name key: key-name ... F) - name: TZ value: UTC G) - name: TZ value: '{{ .Release.Name }}' | -| controllers.main.containers.main.envFrom | list | `[]` | Secrets and/or ConfigMaps that will be loaded as environment variables. Syntax options: A) Pass an app-template configMap identifier: - config: config B) Pass any configMap name that is not also an identifier (Template enabled): - config: random-configmap-name C) Pass an app-template configMap identifier, explicit syntax: - configMapRef: identifier: config D) Pass any configMap name, explicit syntax (Template enabled): - configMapRef: name: "{{ .Release.Name }}-config" E) Pass an app-template secret identifier: - secret: secret F) Pass any secret name that is not also an identifier (Template enabled): - secret: random-secret-name G) Pass an app-template secret identifier, explicit syntax: - secretRef: identifier: secret H) Pass any secret name, explicit syntax (Template enabled): - secretRef: name: "{{ .Release.Name }}-secret" | -| controllers.main.containers.main.image.pullPolicy | string | `nil` | image pull policy | -| controllers.main.containers.main.image.repository | string | `nil` | image repository | -| controllers.main.containers.main.image.tag | string | `nil` | image tag | -| controllers.main.containers.main.lifecycle | object | `{}` | [[ref](https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/)] | -| controllers.main.containers.main.nameOverride | string | `nil` | Override the container name | -| controllers.main.containers.main.order | int | 99 | Override the default container order Containers get sorted alphanumerically by the `-` combination. | -| controllers.main.containers.main.probes | object | See below | [[ref]](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) | -| controllers.main.containers.main.probes.liveness | object | See below | Liveness probe configuration | -| controllers.main.containers.main.probes.liveness.custom | bool | `false` | Set this to `true` if you wish to specify your own livenessProbe | -| controllers.main.containers.main.probes.liveness.enabled | bool | `true` | Enable the liveness probe | -| controllers.main.containers.main.probes.liveness.spec | object | See below | The spec field contains the values for the default livenessProbe. If you selected `custom: true`, this field holds the definition of the livenessProbe. | -| controllers.main.containers.main.probes.liveness.type | string | "TCP" | sets the probe type when not using a custom probe | -| controllers.main.containers.main.probes.readiness | object | See below | Redainess probe configuration | -| controllers.main.containers.main.probes.readiness.custom | bool | `false` | Set this to `true` if you wish to specify your own readinessProbe | -| controllers.main.containers.main.probes.readiness.enabled | bool | `true` | Enable the readiness probe | -| controllers.main.containers.main.probes.readiness.spec | object | See below | The spec field contains the values for the default readinessProbe. If you selected `custom: true`, this field holds the definition of the readinessProbe. | -| controllers.main.containers.main.probes.readiness.type | string | "TCP" | sets the probe type when not using a custom probe | -| controllers.main.containers.main.probes.startup | object | See below | Startup probe configuration | -| controllers.main.containers.main.probes.startup.custom | bool | `false` | Set this to `true` if you wish to specify your own startupProbe | -| controllers.main.containers.main.probes.startup.enabled | bool | `true` | Enable the startup probe | -| controllers.main.containers.main.probes.startup.spec | object | See below | The spec field contains the values for the default startupProbe. If you selected `custom: true`, this field holds the definition of the startupProbe. | -| controllers.main.containers.main.probes.startup.type | string | "TCP" | sets the probe type when not using a custom probe | -| controllers.main.containers.main.resources | object | `{}` | Set the resource requests / limits for the container. | -| controllers.main.containers.main.securityContext | object | `{}` | Configure the Security Context for the container | -| controllers.main.containers.main.terminationMessagePath | string | `nil` | [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle-1)] | -| controllers.main.containers.main.terminationMessagePolicy | string | `nil` | [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle-1)] | -| controllers.main.containers.main.workingDir | string | `nil` | Override the working directory for the default container | -| controllers.main.cronjob | object | See below | CronJob configuration. Required only when using `controller.type: cronjob`. | -| controllers.main.cronjob.backoffLimit | int | `6` | Limits the number of times a failed job will be retried | -| controllers.main.cronjob.concurrencyPolicy | string | `"Forbid"` | Specifies how to treat concurrent executions of a job that is created by this cron job valid values are Allow, Forbid or Replace | -| controllers.main.cronjob.failedJobsHistory | int | `1` | The number of failed Jobs to keep | -| controllers.main.cronjob.schedule | string | `"*/20 * * * *"` | Sets the CronJob time when to execute your jobs | -| controllers.main.cronjob.startingDeadlineSeconds | int | `30` | The deadline in seconds for starting the job if it misses its scheduled time for any reason | -| controllers.main.cronjob.successfulJobsHistory | int | `1` | The number of succesful Jobs to keep | -| controllers.main.cronjob.suspend | string | false | Suspends the CronJob [[ref]](https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#schedule-suspension) | -| controllers.main.cronjob.timeZone | string | `nil` | Sets the CronJob timezone (only works in Kubernetes >= 1.27) | -| controllers.main.cronjob.ttlSecondsAfterFinished | string | `nil` | If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to be automatically deleted. | -| controllers.main.enabled | bool | `true` | enable the controller. | -| controllers.main.initContainers | object | `{}` | Specify any initContainers here as dictionary items. Each initContainer should have its own key initContainers get sorted alphanumerically by the `-` combination if no order or dependsOn has been configured for them. | -| controllers.main.job | object | See below | Job configuration. Required only when using `controller.type: job`. | -| controllers.main.job.backoffLimit | int | `6` | Limits the number of times a failed job will be retried | -| controllers.main.job.suspend | string | false | Suspends the Job [[ref]](https://kubernetes.io/docs/concepts/workloads/controllers/job/#suspending-a-job) | -| controllers.main.job.ttlSecondsAfterFinished | string | `nil` | If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to be automatically deleted. | -| controllers.main.labels | object | `{}` | Set labels on the deployment/statefulset/daemonset/cronjob/job | -| controllers.main.pod | object | `{}` | | -| controllers.main.replicas | int | `1` | Number of desired pods. When using a HorizontalPodAutoscaler, set this to `null`. | -| controllers.main.revisionHistoryLimit | int | `3` | ReplicaSet revision history limit | -| controllers.main.rollingUpdate.partition | string | `nil` | Set statefulset RollingUpdate partition | -| controllers.main.rollingUpdate.surge | string | `nil` | Set deployment RollingUpdate max surge | -| controllers.main.rollingUpdate.unavailable | string | `nil` | Set deployment RollingUpdate max unavailable | -| controllers.main.statefulset | object | `{"podManagementPolicy":null,"volumeClaimTemplates":[]}` | StatefulSet configuration. Required only when using `controller.type: statefulset`. | -| controllers.main.statefulset.podManagementPolicy | string | `nil` | Set podManagementPolicy, valid values are Parallel and OrderedReady (default). | -| controllers.main.statefulset.volumeClaimTemplates | list | `[]` | Used to create individual disks for each instance. | -| controllers.main.strategy | string | `nil` | Set the controller upgrade strategy For Deployments, valid values are Recreate (default) and RollingUpdate. For StatefulSets, valid values are OnDelete and RollingUpdate (default). DaemonSets/CronJobs/Jobs ignore this. | -| controllers.main.type | string | `"deployment"` | Set the controller type. Valid options are deployment, daemonset, statefulset, cronjob or job | -| defaultPodOptions | object | `{"affinity":{},"annotations":{},"automountServiceAccountToken":true,"dnsConfig":{},"dnsPolicy":null,"enableServiceLinks":true,"hostAliases":[],"hostIPC":false,"hostNetwork":false,"hostPID":false,"hostname":null,"imagePullSecrets":[],"labels":{},"nodeSelector":{},"priorityClassName":null,"restartPolicy":null,"runtimeClassName":null,"schedulerName":null,"securityContext":{},"terminationGracePeriodSeconds":null,"tolerations":[],"topologySpreadConstraints":[]}` | Set default options for all controllers / pods here Each of these options can be overridden on a Controller level | -| defaultPodOptions.affinity | object | `{}` | Defines affinity constraint rules. [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity) | -| defaultPodOptions.annotations | object | `{}` | Set annotations on the Pod. Pod-specific values will be merged with this. | -| defaultPodOptions.automountServiceAccountToken | bool | `true` | Specifies whether a service account token should be automatically mounted. | -| defaultPodOptions.dnsConfig | object | `{}` | Configuring the ndots option may resolve nslookup issues on some Kubernetes setups. | -| defaultPodOptions.dnsPolicy | string | `nil` | Defaults to "ClusterFirst" if hostNetwork is false and "ClusterFirstWithHostNet" if hostNetwork is true. | -| defaultPodOptions.enableServiceLinks | bool | `true` | Enable/disable the generation of environment variables for services. [[ref]](https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#accessing-the-service) | -| defaultPodOptions.hostAliases | list | `[]` | Use hostAliases to add custom entries to /etc/hosts - mapping IP addresses to hostnames. [[ref]](https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/) | -| defaultPodOptions.hostIPC | bool | `false` | Use the host's ipc namespace | -| defaultPodOptions.hostNetwork | bool | `false` | When using hostNetwork make sure you set dnsPolicy to `ClusterFirstWithHostNet` | -| defaultPodOptions.hostPID | bool | `false` | Use the host's pid namespace | -| defaultPodOptions.hostname | string | `nil` | Allows specifying explicit hostname setting | -| defaultPodOptions.imagePullSecrets | list | `[]` | Set image pull secrets | -| defaultPodOptions.labels | object | `{}` | Set labels on the Pod. Pod-specific values will be merged with this. | -| defaultPodOptions.nodeSelector | object | `{}` | Node selection constraint [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector) | -| defaultPodOptions.priorityClassName | string | `nil` | Custom priority class for different treatment by the scheduler | -| defaultPodOptions.restartPolicy | string | `Always`. When `controller.type` is `cronjob` it defaults to `Never`. | Set Container restart policy. | -| defaultPodOptions.runtimeClassName | string | `nil` | Allow specifying a runtimeClassName other than the default one (ie: nvidia) | -| defaultPodOptions.schedulerName | string | `nil` | Allows specifying a custom scheduler name | -| defaultPodOptions.securityContext | object | `{}` | Configure the Security Context for the Pod | -| defaultPodOptions.terminationGracePeriodSeconds | string | `nil` | [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle)] | -| defaultPodOptions.tolerations | list | `[]` | Specify taint tolerations [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) | -| defaultPodOptions.topologySpreadConstraints | list | `[]` | Defines topologySpreadConstraint rules. [[ref]](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) | -| global.annotations | object | `{}` | Set additional global annotations. Helm templates can be used. | -| global.fullnameOverride | string | `nil` | Set the entire name definition | -| global.labels | object | `{}` | Set additional global labels. Helm templates can be used. | -| global.nameOverride | string | `nil` | Set an override for the prefix of the fullname | -| ingress | object | See below | Configure the ingresses for the chart here. Additional ingresses can be added by adding a dictionary key similar to the 'main' ingress. | -| ingress.main.annotations | object | `{}` | Provide additional annotations which may be required. | -| ingress.main.className | string | `nil` | Set the ingressClass that is used for this ingress. | -| ingress.main.defaultBackend | string | `nil` | Configure the defaultBackend for this ingress. This will disable any other rules for the ingress. | -| ingress.main.enabled | bool | `false` | Enables or disables the ingress | -| ingress.main.hosts[0].host | string | `"chart-example.local"` | Host address. Helm template can be passed. | -| ingress.main.hosts[0].paths[0].path | string | `"/"` | Path. Helm template can be passed. | -| ingress.main.hosts[0].paths[0].service.name | string | `"main"` | Overrides the service name reference for this path This can be an actual service name, or reference a service identifier from this values.yaml | -| ingress.main.hosts[0].paths[0].service.port | string | `nil` | Overrides the service port number reference for this path | -| ingress.main.labels | object | `{}` | Provide additional labels which may be required. | -| ingress.main.nameOverride | string | `nil` | Override the name suffix that is used for this ingress. | -| ingress.main.primary | bool | `true` | Make this the primary ingress (used in probes, notes, etc...). If there is more than 1 ingress, make sure that only 1 ingress is marked as primary. | -| ingress.main.tls | list | `[]` | Configure TLS for the ingress. Both secretName and hosts can process a Helm template. | -| networkpolicies | object | See below | Configure the networkPolicies for the chart here. Additional networkPolicies can be added by adding a dictionary key similar to the 'main' networkPolicy. | -| networkpolicies.main.controller | string | `"main"` | Configure which controller this networkPolicy should target | -| networkpolicies.main.enabled | bool | `false` | Enables or disables the networkPolicy item. Defaults to true | -| networkpolicies.main.policyTypes | list | `["Ingress","Egress"]` | The policyTypes for this networkPolicy | -| networkpolicies.main.rules | object | `{"egress":[{}],"ingress":[{}]}` | The rulesets for this networkPolicy [[ref]](https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource) | -| networkpolicies.main.rules.egress | list | `[{}]` | The egress rules for this networkPolicy. Allows all egress traffic by default. | -| networkpolicies.main.rules.ingress | list | `[{}]` | The ingress rules for this networkPolicy. Allows all ingress traffic by default. | -| persistence | object | See below | Configure persistence for the chart here. Additional items can be added by adding a dictionary key similar to the 'config' key. [[ref]](https://bjw-s.github.io/helm-charts/docs/common-library/common-library-storage) | -| persistence.config.accessMode | string | `"ReadWriteOnce"` | AccessMode for the persistent volume. Make sure to select an access mode that is supported by your storage provider! [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes) | -| persistence.config.advancedMounts | object | `{}` | Explicitly configure mounts for specific controllers and containers. Example: advancedMounts: main: # the controller with the "main" identifier main: # the container with the "main" identifier - path: /data/config.yaml readOnly: true mountPropagation: None subPath: config.yaml second-container: # the container with the "second-container" identifier - path: /appdata/config readOnly: true second-controller: # the controller with the "second-controller" identifier main: # the container with the "main" identifier - path: /data/config.yaml readOnly: false subPath: config.yaml | -| persistence.config.dataSource | object | `{}` | The optional data source for the persistentVolumeClaim. [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-populators-and-data-sources) | -| persistence.config.dataSourceRef | object | `{}` | The optional volume populator for the persistentVolumeClaim. [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-populators-and-data-sources) | -| persistence.config.enabled | bool | `false` | Enables or disables the persistence item. Defaults to true | -| persistence.config.existingClaim | string | `nil` | If you want to reuse an existing claim, the name of the existing PVC can be passed here. | -| persistence.config.globalMounts | list | `[]` | Configure mounts to all controllers and containers. By default the persistence item will be mounted to `/`. Example: globalMounts: - path: /config readOnly: false | -| persistence.config.retain | bool | `false` | Set to true to retain the PVC upon `helm uninstall` | -| persistence.config.size | string | `"1Gi"` | The amount of storage that is requested for the persistent volume. | -| persistence.config.storageClass | string | `nil` | Storage Class for the config volume. If set to `-`, dynamic provisioning is disabled. If set to something else, the given storageClass is used. If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. | -| persistence.config.type | string | `"persistentVolumeClaim"` | Sets the persistence type Valid options are persistentVolumeClaim, emptyDir, nfs, hostPath, secret, configMap or custom | -| route | object | See below | Configure the gateway routes for the chart here. Additional routes can be added by adding a dictionary key similar to the 'main' route. [[ref]](https://gateway-api.sigs.k8s.io/references/spec/) | -| route.main.annotations | object | `{}` | Provide additional annotations which may be required. | -| route.main.enabled | bool | `false` | Enables or disables the route | -| route.main.hostnames | list | `[]` | Host addresses. Helm template can be passed. | -| route.main.kind | string | `"HTTPRoute"` | Set the route kind Valid options are GRPCRoute, HTTPRoute, TCPRoute, TLSRoute, UDPRoute | -| route.main.labels | object | `{}` | Provide additional labels which may be required. | -| route.main.nameOverride | string | `nil` | Override the name suffix that is used for this route. | -| route.main.parentRefs | list | `[{"group":"gateway.networking.k8s.io","kind":"Gateway","name":null,"namespace":null,"sectionName":null}]` | Configure the resource the route attaches to. | -| route.main.rules | list | `[{"backendRefs":[],"filters":[],"matches":[{"path":{"type":"PathPrefix","value":"/"}}],"timeouts":{}}]` | Configure rules for routing. Defaults to the primary service. | -| route.main.rules[0].backendRefs | list | `[]` | Configure backends where matching requests should be sent. | -| secrets | object | See below | Use this to populate secrets with the values you specify. Be aware that these values are not encrypted by default, and could therefore visible to anybody with access to the values.yaml file. Additional Secrets can be added by adding a dictionary key similar to the 'secret' object. | -| secrets.secret.annotations | object | `{}` | Annotations to add to the Secret | -| secrets.secret.enabled | bool | `false` | Enables or disables the Secret | -| secrets.secret.labels | object | `{}` | Labels to add to the Secret | -| secrets.secret.stringData | object | `{}` | Secret stringData content. Helm template enabled. | -| service | object | See below | Configure the services for the chart here. Additional services can be added by adding a dictionary key similar to the 'main' service. | -| service.main.annotations | object | `{}` | Provide additional annotations which may be required. | -| service.main.controller | string | `"main"` | Configure which controller this service should target | -| service.main.enabled | bool | `true` | Enables or disables the service | -| service.main.externalTrafficPolicy | string | `nil` | [[ref](https://kubernetes.io/docs/tutorials/services/source-ip/)] | -| service.main.extraSelectorLabels | object | `{}` | Allow adding additional match labels | -| service.main.ipFamilies | list | `[]` | The ip families that should be used. Options: IPv4, IPv6 | -| service.main.ipFamilyPolicy | string | `nil` | Specify the ip policy. Options: SingleStack, PreferDualStack, RequireDualStack | -| service.main.labels | object | `{}` | Provide additional labels which may be required. | -| service.main.nameOverride | string | `nil` | Override the name suffix that is used for this service | -| service.main.ports | object | See below | Configure the Service port information here. Additional ports can be added by adding a dictionary key similar to the 'http' service. | -| service.main.ports.http.appProtocol | string | `nil` | Specify the appProtocol value for the Service. [[ref]](https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol) | -| service.main.ports.http.enabled | bool | `true` | Enables or disables the port | -| service.main.ports.http.nodePort | string | `nil` | Specify the nodePort value for the LoadBalancer and NodePort service types. [[ref]](https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport) | -| service.main.ports.http.port | string | `nil` | The port number | -| service.main.ports.http.primary | bool | `true` | Make this the primary port (used in probes, notes, etc...) If there is more than 1 service, make sure that only 1 port is marked as primary. | -| service.main.ports.http.protocol | string | `"HTTP"` | Port protocol. Support values are `HTTP`, `HTTPS`, `TCP` and `UDP`. HTTP and HTTPS spawn a TCP service and get used for internal URL and name generation | -| service.main.ports.http.targetPort | string | `nil` | Specify a service targetPort if you wish to differ the service port from the application port. If `targetPort` is specified, this port number is used in the container definition instead of the `port` value. Therefore named ports are not supported for this field. | -| service.main.primary | bool | `true` | Make this the primary service for this controller (used in probes, notes, etc...). If there is more than 1 service targeting the controller, make sure that only 1 service is marked as primary. | -| service.main.type | string | `"ClusterIP"` | Set the service type | -| serviceAccount.annotations | object | `{}` | Annotations to add to the service account | -| serviceAccount.create | bool | `false` | Specifies whether a service account should be created | -| serviceAccount.labels | object | `{}` | Labels to add to the service account | -| serviceAccount.name | string | `""` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template | -| serviceMonitor | object | See below | Configure the ServiceMonitors for the chart here. Additional ServiceMonitors can be added by adding a dictionary key similar to the 'main' ServiceMonitors. | -| serviceMonitor.main.annotations | object | `{}` | Provide additional annotations which may be required. | -| serviceMonitor.main.enabled | bool | `false` | Enables or disables the serviceMonitor. | -| serviceMonitor.main.endpoints | list | See values.yaml | Configures the endpoints for the serviceMonitor. | -| serviceMonitor.main.labels | object | `{}` | Provide additional labels which may be required. | -| serviceMonitor.main.nameOverride | string | `nil` | Override the name suffix that is used for this serviceMonitor. | -| serviceMonitor.main.selector | object | `{}` | Configures a custom selector for the serviceMonitor, this takes precedence over specifying a service name. Helm templates can be used. | -| serviceMonitor.main.serviceName | string | `"{{ include \"bjw-s.common.lib.chart.names.fullname\" $ }}"` | Configures the target Service for the serviceMonitor. Helm templates can be used. | -| serviceMonitor.main.targetLabels | list | `[]` | Configures custom targetLabels for the serviceMonitor. (All collected meterics will have these labels, taking the value from the target service) [[ref]](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#servicemonitorspec/) | - -
- -## Support - -- See the [Docs](http://bjw-s.github.io/helm-charts/docs/) -- Open an [issue](https://github.com/bjw-s/helm-charts/issues/new/choose) -- Join the k8s-at-home [Discord](https://discord.gg/k8s-at-home) community - ----------------------------------------------- -Autogenerated from chart metadata using [helm-docs v1.11.3](https://github.com/norwoodj/helm-docs/releases/v1.11.3) diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_configmap.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_configmap.tpl deleted file mode 100644 index 3aa492e62..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/classes/_configmap.tpl +++ /dev/null @@ -1,32 +0,0 @@ -{{/* -This template serves as a blueprint for all configMap objects that are created -within the common library. -*/}} -{{- define "bjw-s.common.class.configMap" -}} - {{- $rootContext := .rootContext -}} - {{- $configMapObject := .object -}} - - {{- $labels := merge - ($configMapObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($configMapObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ $configMapObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -data: - {{- with $configMapObject.data }} - {{- tpl (toYaml .) $rootContext | nindent 2 }} - {{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_cronjob.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_cronjob.tpl deleted file mode 100644 index 829f54fc0..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/classes/_cronjob.tpl +++ /dev/null @@ -1,61 +0,0 @@ -{{/* -This template serves as a blueprint for Cronjob objects that are created -using the common library. -*/}} -{{- define "bjw-s.common.class.cronjob" -}} - {{- $rootContext := .rootContext -}} - {{- $cronjobObject := .object -}} - - {{- $timeZone := "" -}} - {{- if ge (int $rootContext.Capabilities.KubeVersion.Minor) 27 }} - {{- $timeZone = dig "cronjob" "timeZone" "" $cronjobObject -}} - {{- end -}} - - {{- $labels := merge - (dict "app.kubernetes.io/component" $cronjobObject.identifier) - ($cronjobObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($cronjobObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: batch/v1 -kind: CronJob -metadata: - name: {{ $cronjobObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - {{- with $cronjobObject.cronjob.suspend }} - suspend: {{ ternary "true" "false" . }} - {{- end }} - concurrencyPolicy: "{{ $cronjobObject.cronjob.concurrencyPolicy }}" - startingDeadlineSeconds: {{ $cronjobObject.cronjob.startingDeadlineSeconds }} - {{- with $timeZone }} - timeZone: "{{ . }}" - {{- end }} - schedule: "{{ $cronjobObject.cronjob.schedule }}" - successfulJobsHistoryLimit: {{ $cronjobObject.cronjob.successfulJobsHistory }} - failedJobsHistoryLimit: {{ $cronjobObject.cronjob.failedJobsHistory }} - jobTemplate: - spec: - {{- with $cronjobObject.cronjob.ttlSecondsAfterFinished }} - ttlSecondsAfterFinished: {{ . }} - {{- end }} - backoffLimit: {{ $cronjobObject.cronjob.backoffLimit }} - template: - metadata: - {{- with (include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $cronjobObject)) }} - annotations: {{ . | nindent 12 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $cronjobObject)) }} - labels: {{ . | nindent 12 }} - {{- end }} - spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $cronjobObject) | nindent 10 }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_daemonset.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_daemonset.tpl deleted file mode 100644 index cdb26fb84..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/classes/_daemonset.tpl +++ /dev/null @@ -1,40 +0,0 @@ -{{/* -This template serves as the blueprint for the DaemonSet objects that are created -within the common library. -*/}} -{{- define "bjw-s.common.class.daemonset" -}} - {{- $rootContext := .rootContext -}} - {{- $daemonsetObject := .object -}} - - {{- $labels := merge - (dict "app.kubernetes.io/component" $daemonsetObject.identifier) - ($daemonsetObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($daemonsetObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: {{ $daemonsetObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - revisionHistoryLimit: {{ $daemonsetObject.revisionHistoryLimit }} - selector: - matchLabels: - app.kubernetes.io/component: {{ $daemonsetObject.identifier }} - {{- include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | nindent 6 }} - template: - metadata: - annotations: {{ include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $daemonsetObject) | nindent 8 }} - labels: {{ include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $daemonsetObject) | nindent 8 }} - spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $daemonsetObject) | nindent 6 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_deployment.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_deployment.tpl deleted file mode 100644 index ee0a829c4..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/classes/_deployment.tpl +++ /dev/null @@ -1,60 +0,0 @@ -{{/* -This template serves as a blueprint for Deployment objects that are created -using the common library. -*/}} -{{- define "bjw-s.common.class.deployment" -}} - {{- $rootContext := .rootContext -}} - {{- $deploymentObject := .object -}} - - {{- $labels := merge - (dict "app.kubernetes.io/component" $deploymentObject.identifier) - ($deploymentObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($deploymentObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ $deploymentObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - revisionHistoryLimit: {{ $deploymentObject.revisionHistoryLimit }} - {{- if not (eq $deploymentObject.replicas nil) }} - replicas: {{ $deploymentObject.replicas }} - {{- end }} - strategy: - type: {{ $deploymentObject.strategy }} - {{- with $deploymentObject.rollingUpdate }} - {{- if and (eq $deploymentObject.strategy "RollingUpdate") (or .surge .unavailable) }} - rollingUpdate: - {{- with .unavailable }} - maxUnavailable: {{ . }} - {{- end }} - {{- with .surge }} - maxSurge: {{ . }} - {{- end }} - {{- end }} - {{- end }} - selector: - matchLabels: - app.kubernetes.io/component: {{ $deploymentObject.identifier }} - {{- include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | nindent 6 }} - template: - metadata: - {{- with (include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $deploymentObject)) }} - annotations: {{ . | nindent 8 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $deploymentObject)) }} - labels: {{ . | nindent 8 }} - {{- end }} - spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $deploymentObject) | nindent 6 }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_ingress.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_ingress.tpl deleted file mode 100644 index 841cd33e2..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/classes/_ingress.tpl +++ /dev/null @@ -1,85 +0,0 @@ -{{/* -This template serves as a blueprint for all Ingress objects that are created -within the common library. -*/}} - -{{- define "bjw-s.common.class.ingress" -}} - {{- $rootContext := .rootContext -}} - {{- $ingressObject := .object -}} - - {{- $labels := merge - ($ingressObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($ingressObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: {{ $ingressObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - {{- if $ingressObject.className }} - ingressClassName: {{ $ingressObject.className }} - {{- end }} - {{- if $ingressObject.tls }} - tls: - {{- range $ingressObject.tls }} - - hosts: - {{- range .hosts }} - - {{ tpl . $rootContext | quote }} - {{- end }} - {{- $secretName := tpl (default "" .secretName) $rootContext }} - {{- if $secretName }} - secretName: {{ $secretName | quote}} - {{- end }} - {{- end }} - {{- end }} - {{- if $ingressObject.defaultBackend }} - defaultBackend: {{ $ingressObject.defaultBackend }} - {{- else }} - rules: - {{- range $ingressObject.hosts }} - - host: {{ tpl .host $rootContext | quote }} - http: - paths: - {{- range .paths }} - - path: {{ tpl .path $rootContext | quote }} - pathType: {{ default "Prefix" .pathType }} - backend: - service: - {{ $service := include "bjw-s.common.lib.service.getByIdentifier" (dict "rootContext" $rootContext "id" .service.name) | fromYaml -}} - {{ $servicePort := 0 -}} - - {{ if empty (dig "port" nil .service) -}} - {{/* Default to the Service primary port if no port has been specified */ -}} - {{ if $service -}} - {{ $defaultServicePort := include "bjw-s.common.lib.service.primaryPort" (dict "rootContext" $rootContext "serviceObject" $service) | fromYaml -}} - {{ if $defaultServicePort -}} - {{ $servicePort = $defaultServicePort.port -}} - {{ end -}} - {{ end -}} - {{ else -}} - {{/* If a port number is given, use that */ -}} - {{ if kindIs "float64" .service.port -}} - {{ $servicePort = .service.port -}} - {{ else if kindIs "string" .service.port -}} - {{/* If a port name is given, try to resolve to a number */ -}} - {{ $servicePort = include "bjw-s.common.lib.service.getPortNumberByName" (dict "rootContext" $rootContext "serviceID" .service.name "portName" .service.port) -}} - {{ end -}} - {{ end -}} - name: {{ default .service.name $service.name }} - port: - number: {{ $servicePort }} - {{- end }} - {{- end }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_job.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_job.tpl deleted file mode 100644 index 9c8a99ece..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/classes/_job.tpl +++ /dev/null @@ -1,46 +0,0 @@ -{{/* -This template serves as the blueprint for the job objects that are created -within the common library. -*/}} -{{- define "bjw-s.common.class.job" -}} - {{- $rootContext := .rootContext -}} - {{- $jobObject := .object -}} - - {{- $labels := merge - (dict "app.kubernetes.io/component" $jobObject.identifier) - ($jobObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($jobObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ $jobObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - {{- with $jobObject.job.suspend }} - suspend: {{ ternary "true" "false" . }} - {{- end }} - {{- with $jobObject.job.ttlSecondsAfterFinished }} - ttlSecondsAfterFinished: {{ . }} - {{- end }} - backoffLimit: {{ $jobObject.job.backoffLimit }} - template: - metadata: - {{- with (include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $jobObject)) }} - annotations: {{ . | nindent 8 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $jobObject)) }} - labels: {{ . | nindent 8 }} - {{- end }} - spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $jobObject) | nindent 6 }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_networkpolicy.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_networkpolicy.tpl deleted file mode 100644 index 0854d145e..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/classes/_networkpolicy.tpl +++ /dev/null @@ -1,49 +0,0 @@ -{{/* -This template serves as a blueprint for all networkPolicy objects that are created -within the common library. -*/}} -{{- define "bjw-s.common.class.networkpolicy" -}} - {{- $rootContext := .rootContext -}} - {{- $networkPolicyObject := .object -}} - - {{- $labels := merge - ($networkPolicyObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($networkPolicyObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} - {{- $podSelector := dict -}} - {{- if (hasKey $networkPolicyObject "podSelector") -}} - {{- $podSelector = $networkPolicyObject.podSelector -}} - {{- else -}} - {{- $podSelector = dict "matchLabels" (merge - ($networkPolicyObject.extraSelectorLabels | default dict) - (dict "app.kubernetes.io/component" $networkPolicyObject.controller) - (include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | fromYaml) - ) -}} - {{- end -}} ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: {{ $networkPolicyObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - podSelector: {{- toYaml $podSelector | nindent 4 }} - {{- with $networkPolicyObject.policyTypes }} - policyTypes: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $networkPolicyObject.rules.ingress }} - ingress: {{- tpl (toYaml .) $rootContext | nindent 4 -}} - {{- end }} - {{- with $networkPolicyObject.rules.egress }} - egress: {{- tpl (toYaml .) $rootContext | nindent 4 -}} - {{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_pvc.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_pvc.tpl deleted file mode 100644 index 1c6ee9c17..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/classes/_pvc.tpl +++ /dev/null @@ -1,53 +0,0 @@ -{{/* -This template serves as a blueprint for all PersistentVolumeClaim objects that are created -within the common library. -*/}} -{{- define "bjw-s.common.class.pvc" -}} - {{- $rootContext := .rootContext -}} - {{- $pvcObject := .object -}} - - {{- $labels := merge - ($pvcObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($pvcObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} - {{- if $pvcObject.retain }} - {{- $annotations = merge - (dict "helm.sh/resource-policy" "keep") - $annotations - -}} - {{- end -}} - ---- -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ $pvcObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - accessModes: - - {{ required (printf "accessMode is required for PVC %v" $pvcObject.name) $pvcObject.accessMode | quote }} - resources: - requests: - storage: {{ required (printf "size is required for PVC %v" $pvcObject.name) $pvcObject.size | quote }} - {{- if $pvcObject.storageClass }} - storageClassName: {{ if (eq "-" $pvcObject.storageClass) }}""{{- else }}{{ $pvcObject.storageClass | quote }}{{- end }} - {{- end }} - {{- if $pvcObject.volumeName }} - volumeName: {{ $pvcObject.volumeName | quote }} - {{- end }} - {{- with $pvcObject.dataSource }} - dataSource: {{- tpl (toYaml .) $rootContext | nindent 10 }} - {{- end }} - {{- with $pvcObject.dataSourceRef }} - dataSourceRef: {{- tpl (toYaml .) $rootContext | nindent 10 }} - {{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_route.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_route.tpl deleted file mode 100644 index 123bc5fef..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/classes/_route.tpl +++ /dev/null @@ -1,86 +0,0 @@ -{{/* -This template serves as a blueprint for all Route objects that are created -within the common library. -*/}} -{{- define "bjw-s.common.class.route" -}} - {{- $rootContext := .rootContext -}} - {{- $routeObject := .object -}} - - {{- $routeKind := $routeObject.kind | default "HTTPRoute" -}} - {{- $apiVersion := "gateway.networking.k8s.io/v1alpha2" -}} - {{- if $rootContext.Capabilities.APIVersions.Has (printf "gateway.networking.k8s.io/v1beta1/%s" $routeKind) }} - {{- $apiVersion = "gateway.networking.k8s.io/v1beta1" -}} - {{- end -}} - {{- if $rootContext.Capabilities.APIVersions.Has (printf "gateway.networking.k8s.io/v1/%s" $routeKind) }} - {{- $apiVersion = "gateway.networking.k8s.io/v1" -}} - {{- end -}} - {{- $labels := merge - ($routeObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($routeObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: {{ $apiVersion }} -kind: {{ $routeKind }} -metadata: - name: {{ $routeObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - parentRefs: - {{- range $routeObject.parentRefs }} - - group: {{ default "gateway.networking.k8s.io" .group }} - kind: {{ default "Gateway" .kind }} - name: {{ required (printf "parentRef name is required for %v %v" $routeKind $routeObject.name) .name }} - namespace: {{ required (printf "parentRef namespace is required for %v %v" $routeKind $routeObject.name) .namespace }} - {{- if .sectionName }} - sectionName: {{ .sectionName | quote }} - {{- end }} - {{- end }} - {{- if and (ne $routeKind "TCPRoute") (ne $routeKind "UDPRoute") $routeObject.hostnames }} - hostnames: - {{- range $routeObject.hostnames }} - - {{ tpl . $rootContext | quote }} - {{- end }} - {{- end }} - rules: - {{- range $routeObject.rules }} - - backendRefs: - {{- range .backendRefs }} - {{ $service := include "bjw-s.common.lib.service.getByIdentifier" (dict "rootContext" $rootContext "id" .name) | fromYaml -}} - {{ $servicePrimaryPort := dict -}} - {{ if $service -}} - {{ $servicePrimaryPort = include "bjw-s.common.lib.service.primaryPort" (dict "rootContext" $rootContext "serviceObject" $service) | fromYaml -}} - {{- end }} - - group: {{ default "" .group | quote}} - kind: {{ default "Service" .kind }} - name: {{ default .name $service.name }} - namespace: {{ default $rootContext.Release.Namespace .namespace }} - port: {{ default .port $servicePrimaryPort.port }} - weight: {{ default 1 .weight }} - {{- end }} - {{- if or (eq $routeKind "HTTPRoute") (eq $routeKind "GRPCRoute") }} - {{- with .matches }} - matches: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .filters }} - filters: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- end }} - {{- if (eq $routeKind "HTTPRoute") }} - {{- with .timeouts }} - timeouts: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- end }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_secret.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_secret.tpl deleted file mode 100644 index a46fe534d..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/classes/_secret.tpl +++ /dev/null @@ -1,39 +0,0 @@ -{{/* -This template serves as a blueprint for all Secret objects that are created -within the common library. -*/}} -{{- define "bjw-s.common.class.secret" -}} - {{- $rootContext := .rootContext -}} - {{- $secretObject := .object -}} - - {{- $labels := merge - ($secretObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($secretObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} - - {{- $stringData := "" -}} - {{- with $secretObject.stringData -}} - {{- $stringData = (toYaml $secretObject.stringData) | trim -}} - {{- end -}} ---- -apiVersion: v1 -kind: Secret -{{- with $secretObject.type }} -type: {{ . }} -{{- end }} -metadata: - name: {{ $secretObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -{{- with $stringData }} -stringData: {{- tpl $stringData $rootContext | nindent 2 }} -{{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_service.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_service.tpl deleted file mode 100644 index 223e82b7f..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/classes/_service.tpl +++ /dev/null @@ -1,104 +0,0 @@ -{{/* -This template serves as a blueprint for all Service objects that are created -within the common library. -*/}} -{{- define "bjw-s.common.class.service" -}} - {{- $rootContext := .rootContext -}} - {{- $serviceObject := .object -}} - - {{- $svcType := $serviceObject.type | default "" -}} - {{- $enabledPorts := include "bjw-s.common.lib.service.enabledPorts" (dict "rootContext" $rootContext "serviceObject" $serviceObject) | fromYaml }} - {{- $labels := merge - (dict "app.kubernetes.io/service" $serviceObject.name) - ($serviceObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($serviceObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ $serviceObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - {{- if (or (eq $svcType "ClusterIP") (empty $svcType)) }} - type: ClusterIP - {{- if $serviceObject.clusterIP }} - clusterIP: {{ $serviceObject.clusterIP }} - {{end}} - {{- else if eq $svcType "LoadBalancer" }} - type: {{ $svcType }} - {{- if $serviceObject.loadBalancerIP }} - loadBalancerIP: {{ $serviceObject.loadBalancerIP }} - {{- end }} - {{- if $serviceObject.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{ toYaml $serviceObject.loadBalancerSourceRanges | nindent 4 }} - {{- end -}} - {{- else }} - type: {{ $svcType }} - {{- end }} - {{- if $serviceObject.externalTrafficPolicy }} - externalTrafficPolicy: {{ $serviceObject.externalTrafficPolicy }} - {{- end }} - {{- if hasKey $serviceObject "allocateLoadBalancerNodePorts" }} - allocateLoadBalancerNodePorts: {{ $serviceObject.allocateLoadBalancerNodePorts }} - {{- end }} - {{- if $serviceObject.sessionAffinity }} - sessionAffinity: {{ $serviceObject.sessionAffinity }} - {{- if $serviceObject.sessionAffinityConfig }} - sessionAffinityConfig: - {{ toYaml $serviceObject.sessionAffinityConfig | nindent 4 }} - {{- end -}} - {{- end }} - {{- with $serviceObject.externalIPs }} - externalIPs: - {{- toYaml . | nindent 4 }} - {{- end }} - {{- if $serviceObject.publishNotReadyAddresses }} - publishNotReadyAddresses: {{ $serviceObject.publishNotReadyAddresses }} - {{- end }} - {{- if $serviceObject.ipFamilyPolicy }} - ipFamilyPolicy: {{ $serviceObject.ipFamilyPolicy }} - {{- end }} - {{- with $serviceObject.ipFamilies }} - ipFamilies: - {{ toYaml . | nindent 4 }} - {{- end }} - ports: - {{- range $name, $port := $enabledPorts }} - - port: {{ $port.port }} - targetPort: {{ $port.targetPort | default $port.port }} - {{- if $port.protocol }} - {{- if or ( eq $port.protocol "HTTP" ) ( eq $port.protocol "HTTPS" ) ( eq $port.protocol "TCP" ) }} - protocol: TCP - {{- else }} - protocol: {{ $port.protocol }} - {{- end }} - {{- else }} - protocol: TCP - {{- end }} - name: {{ $name }} - {{- if (and (eq $svcType "NodePort") (not (empty $port.nodePort))) }} - nodePort: {{ $port.nodePort }} - {{ end }} - {{- if (not (empty $port.appProtocol)) }} - appProtocol: {{ $port.appProtocol }} - {{ end }} - {{- end -}} - {{- with (merge - ($serviceObject.extraSelectorLabels | default dict) - (dict "app.kubernetes.io/component" $serviceObject.controller) - (include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | fromYaml) - ) }} - selector: {{- toYaml . | nindent 4 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_serviceAccount.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_serviceAccount.tpl deleted file mode 100644 index 2b109ad0c..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/classes/_serviceAccount.tpl +++ /dev/null @@ -1,30 +0,0 @@ -{{/* -This template serves as a blueprint for ServiceAccount objects that are created -using the common library. -*/}} -{{- define "bjw-s.common.class.serviceAccount" -}} - {{- $rootContext := .rootContext -}} - {{- $serviceAccountObject := .object -}} - - {{- $labels := merge - ($serviceAccountObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($serviceAccountObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ $serviceAccountObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -secrets: - - name: {{ include "bjw-s.common.lib.chart.names.fullname" $rootContext }}-sa-token -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_serviceMonitor.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_serviceMonitor.tpl deleted file mode 100644 index b14186081..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/classes/_serviceMonitor.tpl +++ /dev/null @@ -1,37 +0,0 @@ -{{- define "bjw-s.common.class.serviceMonitor" -}} - {{- $rootContext := .rootContext -}} - {{- $serviceMonitorObject := .object -}} - {{- $labels := merge - ($serviceMonitorObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($serviceMonitorObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ $serviceMonitorObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - selector: - {{- if $serviceMonitorObject.selector -}} - {{- tpl ($serviceMonitorObject.selector | toYaml) $rootContext | nindent 4}} - {{- else }} - matchLabels: - app.kubernetes.io/service: {{ tpl $serviceMonitorObject.serviceName $rootContext }} - {{- include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | nindent 6 }} - {{- end }} - endpoints: {{- toYaml $serviceMonitorObject.endpoints | nindent 4 }} - {{- if not (empty $serviceMonitorObject.targetLabels )}} - targetLabels: - {{- toYaml $serviceMonitorObject.targetLabels | nindent 4 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/classes/_statefulset.tpl b/thunder_deployment/infra/beta9/charts/common/templates/classes/_statefulset.tpl deleted file mode 100644 index bdcf48a3f..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/classes/_statefulset.tpl +++ /dev/null @@ -1,56 +0,0 @@ -{{/* -This template serves as the blueprint for the StatefulSet objects that are created -within the common library. -*/}} -{{- define "bjw-s.common.class.statefulset" -}} - {{- $rootContext := .rootContext -}} - {{- $statefulsetObject := .object -}} - - {{- $labels := merge - (dict "app.kubernetes.io/component" $statefulsetObject.identifier) - ($statefulsetObject.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $rootContext | fromYaml) - -}} - {{- $annotations := merge - ($statefulsetObject.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $rootContext | fromYaml) - -}} ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ $statefulsetObject.name }} - {{- with $labels }} - labels: {{- toYaml . | nindent 4 -}} - {{- end }} - {{- with $annotations }} - annotations: {{- toYaml . | nindent 4 -}} - {{- end }} -spec: - revisionHistoryLimit: {{ $statefulsetObject.revisionHistoryLimit }} - replicas: {{ $statefulsetObject.replicas }} - podManagementPolicy: {{ dig "statefulset" "podManagementPolicy" "OrderedReady" $statefulsetObject }} - updateStrategy: - type: {{ $statefulsetObject.strategy }} - {{- if and (eq $statefulsetObject.strategy "RollingUpdate") (dig "rollingUpdate" "partition" nil $statefulsetObject) }} - rollingUpdate: - partition: {{ $statefulsetObject.rollingUpdate.partition }} - {{- end }} - selector: - matchLabels: - app.kubernetes.io/component: {{ $statefulsetObject.identifier }} - {{- include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | nindent 6 }} - serviceName: {{ include "bjw-s.common.lib.chart.names.fullname" $rootContext }} - template: - metadata: - {{- with (include "bjw-s.common.lib.pod.metadata.annotations" (dict "rootContext" $rootContext "controllerObject" $statefulsetObject)) }} - annotations: {{ . | nindent 8 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.pod.metadata.labels" (dict "rootContext" $rootContext "controllerObject" $statefulsetObject)) }} - labels: {{ . | nindent 8 }} - {{- end }} - spec: {{ include "bjw-s.common.lib.pod.spec" (dict "rootContext" $rootContext "controllerObject" $statefulsetObject) | nindent 6 }} - {{- with (include "bjw-s.common.lib.statefulset.volumeclaimtemplates" (dict "rootContext" $rootContext "statefulsetObject" $statefulsetObject)) }} - volumeClaimTemplates: {{ . | nindent 4 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_getMapItemsWithKey.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_getMapItemsWithKey.tpl deleted file mode 100644 index 0a65d4dc8..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_getMapItemsWithKey.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{/* -Returns the items in a map that have a certain key -*/}} -{{- define "bjw-s.common.lib.getMapItemsWithKey" -}} - {{- $map := .map -}} - {{- $keyToFind := .key -}} - {{- $output := dict -}} - - {{- if not (empty $keyToFind) -}} - {{- range $key, $item := $map -}} - {{- if not (empty (dig $keyToFind nil $item)) -}} - {{- $_ := set $output $key $item -}} - {{- end -}} - {{- end -}} - {{- end -}} - {{- $output | toYaml -}} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_kahn.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_kahn.tpl deleted file mode 100644 index 319a05c87..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_kahn.tpl +++ /dev/null @@ -1,35 +0,0 @@ -{{/* -Implementation of Kahn's algorithm based on -https://en.wikipedia.org/wiki/Topological_sorting#Kahn's_algorithm - -source: https://github.com/dastrobu/helm-charts/blob/main/environment-variables/templates/_kahn.tpl -*/}} -{{- define "bjw-s.common.lib.kahn" -}} - {{- $graph := .graph -}} - {{- if empty $graph -}} - {{- $_ := set . "out" list -}} - {{- else -}} - {{- $S := list -}} - - {{- range $node, $edges := $graph -}} - {{- if empty $edges -}} - {{- $S = append $S $node -}} - {{- end -}} - {{- end -}} - - {{- if empty $S -}} - {{- fail (printf "graph is cyclic or has bad edge definitions. Remaining graph is:\n%s" ( .graph | toYaml ) ) }} - {{- end -}} - - {{- $n := first $S -}} - {{- $_ := unset $graph $n -}} - - {{- range $node, $edges := $graph -}} - {{- $_ := set $graph $node ( without $edges $n ) -}} - {{- end -}} - - {{- $args := dict "graph" $graph "out" list -}} - {{- include "bjw-s.common.lib.kahn" $args -}} - {{- $_ = set . "out" ( concat ( list $n ) $args.out ) -}} - {{- end -}} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_names.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_names.tpl deleted file mode 100644 index 15725e512..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/chart/_names.tpl +++ /dev/null @@ -1,35 +0,0 @@ -{{/* Expand the name of the chart */}} -{{- define "bjw-s.common.lib.chart.names.name" -}} - {{- $globalNameOverride := get .Values.global "nameOverride" -}} - {{- $nameOverride := get .Values "nameOverride" -}} - {{- $name := $globalNameOverride | default $nameOverride | default .Chart.Name -}} - {{- $name | toString | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "bjw-s.common.lib.chart.names.fullname" -}} - {{- $name := include "bjw-s.common.lib.chart.names.name" . -}} - {{- $globalFullNameOverride := get .Values.global "fullnameOverride" -}} - {{- $fullNameOverride := get .Values "fullnameOverride" -}} - - {{- if or $fullNameOverride $globalFullNameOverride -}} - {{- $name = ($globalFullNameOverride | default $fullNameOverride) -}} - {{- else -}} - {{- if contains $name .Release.Name -}} - {{- $name = .Release.Name -}} - {{- else -}} - {{- $name = printf "%s-%s" .Release.Name $name -}} - {{- end -}} - {{- end -}} - - {{- $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* Create chart name and version as used by the chart label */}} -{{- define "bjw-s.common.lib.chart.names.chart" -}} - {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_getByIdentifier.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_getByIdentifier.tpl deleted file mode 100644 index 87b10a3b1..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_getByIdentifier.tpl +++ /dev/null @@ -1,12 +0,0 @@ -{{/* -Return a configMap Object by its Identifier. -*/}} -{{- define "bjw-s.common.lib.configMap.getByIdentifier" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - - {{- $configMapValues := dig $identifier nil $rootContext.Values.configMaps -}} - {{- if not (empty $configMapValues) -}} - {{- include "bjw-s.common.lib.configMap.valuesToObject" (dict "rootContext" $rootContext "id" $identifier "values" $configMapValues) -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_validate.tpl deleted file mode 100644 index c61c70441..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_validate.tpl +++ /dev/null @@ -1,7 +0,0 @@ -{{/* -Validate configMap values -*/}} -{{- define "bjw-s.common.lib.configMap.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $configMapValues := .object -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_valuesToObject.tpl deleted file mode 100644 index 1cad88337..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/configMap/_valuesToObject.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Convert configMap values to an object -*/}} -{{- define "bjw-s.common.lib.configMap.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Determine and inject the configMap name */ -}} - {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - - {{- if $objectValues.nameOverride -}} - {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} - {{- else -}} - {{- if ne $identifier "main" -}} - {{- $objectName = printf "%s-%s" $objectName $identifier -}} - {{- end -}} - {{- end -}} - {{- $_ := set $objectValues "name" $objectName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Return the configMap object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/_spec.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/_spec.tpl deleted file mode 100644 index 9dfd3d43c..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/_spec.tpl +++ /dev/null @@ -1,54 +0,0 @@ -{{- /* -The container definition included in the Pod. -*/ -}} -{{- define "bjw-s.common.lib.container.spec" -}} - {{- $rootContext := .rootContext -}} - {{- $controllerObject := .controllerObject -}} - {{- $containerObject := .containerObject -}} - {{- $ctx := dict "rootContext" $rootContext "controllerObject" $controllerObject "containerObject" $containerObject -}} - -name: {{ include "bjw-s.common.lib.container.field.name" (dict "ctx" $ctx) | trim }} -image: {{ include "bjw-s.common.lib.container.field.image" (dict "ctx" $ctx) | trim }} - {{- with $containerObject.image.pullPolicy }} -imagePullPolicy: {{ . | trim }} - {{- end -}} - {{- with (include "bjw-s.common.lib.container.field.command" (dict "ctx" $ctx) | trim) }} -command: {{ . | trim | nindent 2 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.container.field.args" (dict "ctx" $ctx) | trim) }} -args: {{ . | trim | nindent 2 }} - {{- end -}} - {{- with $containerObject.workingDir }} -workingDir: {{ . | trim }} - {{- end -}} - {{- with $containerObject.securityContext }} -securityContext: {{ toYaml . | trim | nindent 2 }} - {{- end -}} - {{- with $containerObject.lifecycle }} -lifecycle: {{ toYaml . | trim | nindent 2 }} - {{- end -}} - {{- with $containerObject.terminationMessagePath }} -terminationMessagePath: {{ . | trim }} - {{- end -}} - {{- with $containerObject.terminationMessagePolicy }} -terminationMessagePolicy: {{ . | trim }} - {{- end -}} - {{- with (include "bjw-s.common.lib.container.field.env" (dict "ctx" $ctx) | trim) }} -env: {{ . | trim | nindent 2 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.container.field.envFrom" (dict "ctx" $ctx) | trim) }} -envFrom: {{ . | trim | nindent 2 }} - {{- end -}} - {{- with $containerObject.ports }} -ports: {{ toYaml . | trim | nindent 2 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.container.field.probes" (dict "ctx" $ctx) | trim) }} - {{- . | trim | nindent 0 -}} - {{- end -}} - {{- with $containerObject.resources }} -resources: {{ toYaml . | trim | nindent 2 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.container.field.volumeMounts" (dict "ctx" $ctx) | trim) }} -volumeMounts: {{ . | trim | nindent 2 }} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/_validate.tpl deleted file mode 100644 index 6b3176bee..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/_validate.tpl +++ /dev/null @@ -1,20 +0,0 @@ -{{/* -Validate container values -*/}} -{{- define "bjw-s.common.lib.container.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $controllerObject := .controllerObject -}} - {{- $containerObject := .containerObject -}} - - {{- if not (kindIs "map" $containerObject.image) -}} - {{- fail (printf "Image required to be a dictionary with repository and tag fields. (controller %s, container %s)" $controllerObject.identifier $containerObject.identifier) }} - {{- end -}} - - {{- if empty (dig "image" "repository" nil $containerObject) -}} - {{- fail (printf "No image repository specified for container. (controller %s, container %s)" $controllerObject.identifier $containerObject.identifier) }} - {{- end -}} - - {{- if empty (dig "image" "tag" nil $containerObject) -}} - {{- fail (printf "No image tag specified for container. (controller %s, container %s)" $controllerObject.identifier $containerObject.identifier) }} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/_valuesToObject.tpl deleted file mode 100644 index 50b9e2f50..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/_valuesToObject.tpl +++ /dev/null @@ -1,27 +0,0 @@ -{{/* -Convert container values to an object -*/}} -{{- define "bjw-s.common.lib.container.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Process image tags */ -}} - {{- if kindIs "map" $objectValues.image -}} - {{- $imageTag := dig "image" "tag" "" $objectValues -}} - {{- /* Convert float64 image tags to string */ -}} - {{- if kindIs "float64" $imageTag -}} - {{- $imageTag = $imageTag | toString -}} - {{- end -}} - - {{- /* Process any templates in the tag */ -}} - {{- $imageTag = tpl $imageTag $rootContext -}} - - {{- $_ := set $objectValues.image "tag" $imageTag -}} - {{- end -}} - - {{- /* Return the container object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_args.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_args.tpl deleted file mode 100644 index 172e444ee..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_args.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{{/* -Args used by the container. -*/}} -{{- define "bjw-s.common.lib.container.field.args" -}} - {{- $ctx := .ctx -}} - {{- $containerObject := $ctx.containerObject -}} - - {{- /* Default to empty list */ -}} - {{- $args := list -}} - - {{- /* See if an override is desired */ -}} - {{- if not (empty (get $containerObject "args")) -}} - {{- $option := get $containerObject "args" -}} - {{- if not (empty $option) -}} - {{- if kindIs "string" $option -}} - {{- $args = append $args $option -}} - {{- else -}} - {{- $args = $option -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- if not (empty $args) -}} - {{- $args | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_command.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_command.tpl deleted file mode 100644 index 67e3b65bc..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_command.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{{/* -Command used by the container. -*/}} -{{- define "bjw-s.common.lib.container.field.command" -}} - {{- $ctx := .ctx -}} - {{- $containerObject := $ctx.containerObject -}} - - {{- /* Default to empty list */ -}} - {{- $command := list -}} - - {{- /* See if an override is desired */ -}} - {{- if not (empty (get $containerObject "command")) -}} - {{- $option := get $containerObject "command" -}} - {{- if not (empty $option) -}} - {{- if kindIs "string" $option -}} - {{- $command = append $command $option -}} - {{- else -}} - {{- $command = $option -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- if not (empty $command) -}} - {{- $command | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_env.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_env.tpl deleted file mode 100644 index 72973fb2a..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_env.tpl +++ /dev/null @@ -1,82 +0,0 @@ -{{/* -Env field used by the container. -*/}} -{{- define "bjw-s.common.lib.container.field.env" -}} - {{- $ctx := .ctx -}} - {{- $rootContext := $ctx.rootContext -}} - {{- $containerObject := $ctx.containerObject -}} - - {{- /* Default to empty list */ -}} - {{- $envList := list -}} - - {{- /* See if an override is desired */ -}} - {{- if not (empty (get $containerObject "env")) -}} - {{- if kindIs "slice" $containerObject.env -}} - {{- /* Env is a list so we assume the order is already as desired */ -}} - {{- range $name, $var := $containerObject.env -}} - {{- if kindIs "int" $name -}} - {{- $name = required "environment variables as a list of maps require a name field" $var.name -}} - {{- end -}} - {{- end -}} - {{- $envList = $containerObject.env -}} - {{- else -}} - {{- /* Env is a map so we must check if ordering is desired */ -}} - {{- $graph := dict -}} - - {{- range $name, $var := $containerObject.env -}} - {{- if kindIs "map" $var -}} - {{- /* Value is a map so ordering can be specified */ -}} - {{- if empty (dig "dependsOn" nil $var) -}} - {{- $_ := set $graph $name ( list ) -}} - {{- else if kindIs "string" $var.dependsOn -}} - {{- $_ := set $graph $name ( list $var.dependsOn ) -}} - {{- else if kindIs "slice" $var.dependsOn -}} - {{- $_ := set $graph $name $var.dependsOn -}} - {{- end -}} - {{- else -}} - {{- /* Value is not a map so no ordering can be specified */ -}} - {{- $_ := set $graph $name ( list ) -}} - {{- end -}} - {{- end -}} - - {{- $args := dict "graph" $graph "out" list -}} - {{- include "bjw-s.common.lib.kahn" $args -}} - - {{- range $name := $args.out -}} - {{- $envItem := dict "name" $name -}} - {{- $envValue := get $containerObject.env $name -}} - - {{- if kindIs "map" $envValue -}} - {{- $envItem := merge $envItem (omit $envValue "dependsOn") -}} - {{- else -}} - {{- $_ := set $envItem "value" $envValue -}} - {{- end -}} - - {{- $envList = append $envList $envItem -}} - {{- end -}} - - {{- $args = dict -}} - {{- end -}} - {{- end -}} - - {{- if not (empty $envList) -}} - {{- $output := list -}} - {{- range $envList -}} - {{- if hasKey . "value" -}} - {{- if kindIs "string" .value -}} - {{- $output = append $output (dict "name" .name "value" (tpl .value $rootContext)) -}} - {{- else if or (kindIs "float64" .value) (kindIs "bool" .value) -}} - {{- $output = append $output (dict "name" .name "value" (.value | toString)) -}} - {{- else -}} - {{- $output = append $output (dict "name" .name "value" .value) -}} - {{- end -}} - {{- else if hasKey . "valueFrom" -}} - {{- $parsedValue := (tpl (.valueFrom | toYaml) $rootContext) | fromYaml -}} - {{- $output = append $output (dict "name" .name "valueFrom" $parsedValue) -}} - {{- else -}} - {{- $output = append $output (dict "name" .name "valueFrom" (omit . "name")) -}} - {{- end -}} - {{- end -}} - {{- $output | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_envFrom.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_envFrom.tpl deleted file mode 100644 index 84e731291..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_envFrom.tpl +++ /dev/null @@ -1,58 +0,0 @@ -{{/* -Env field used by the container. -*/}} -{{- define "bjw-s.common.lib.container.field.envFrom" -}} - {{- $ctx := .ctx -}} - {{- $rootContext := $ctx.rootContext -}} - {{- $containerObject := $ctx.containerObject -}} - - {{- if not (empty (get $containerObject "envFrom")) -}} - {{- $envFrom := list -}} - {{- range $containerObject.envFrom -}} - {{- $item := dict -}} - - {{- if hasKey . "configMap" -}} - {{- $configMap := include "bjw-s.common.lib.configMap.getByIdentifier" (dict "rootContext" $rootContext "id" .configMap) | fromYaml -}} - {{- $configMapName := default (tpl .configMap $rootContext) $configMap.name -}} - {{- $_ := set $item "configMapRef" (dict "name" $configMapName) -}} - {{- else if hasKey . "configMapRef" -}} - {{- if not (empty (dig "identifier" nil .configMapRef)) -}} - {{- $configMap := include "bjw-s.common.lib.configMap.getByIdentifier" (dict "rootContext" $rootContext "id" .configMapRef.identifier) | fromYaml -}} - {{- if empty $configMap -}} - {{- fail (printf "No configMap configured with identifier '%s'" .configMapRef.identifier) -}} - {{- end -}} - - {{- $_ := set $item "configMapRef" (dict "name" $configMap.name) -}} - {{- else -}} - {{- $_ := set $item "configMapRef" (dict "name" (tpl .configMapRef.name $rootContext)) -}} - {{- end -}} - - {{- else if hasKey . "secret" -}} - {{- $secret := include "bjw-s.common.lib.secret.getByIdentifier" (dict "rootContext" $rootContext "id" .secret) | fromYaml -}} - {{- $secretName := default (tpl .secret $rootContext) $secret.name -}} - {{- $_ := set $item "secretRef" (dict "name" $secretName) -}} - {{- else if hasKey . "secretRef" -}} - {{- if not (empty (dig "identifier" nil .secretRef)) -}} - {{- $secret := include "bjw-s.common.lib.secret.getByIdentifier" (dict "rootContext" $rootContext "id" .secretRef.identifier) | fromYaml -}} - {{- if empty $secret -}} - {{- fail (printf "No secret configured with identifier '%s'" .secretRef.identifier) -}} - {{- end -}} - - {{- $_ := set $item "secretRef" (dict "name" $secret.name) -}} - {{- else -}} - {{- $_ := set $item "secretRef" (dict "name" (tpl .secretRef.name $rootContext)) -}} - {{- end -}} - {{- end -}} - - {{- if not (empty (dig "prefix" nil .)) -}} - {{- $_ := set $item "prefix" .prefix -}} - {{- end -}} - - {{- if not (empty $item) -}} - {{- $envFrom = append $envFrom $item -}} - {{- end -}} - {{- end -}} - - {{- $envFrom | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_image.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_image.tpl deleted file mode 100644 index 327ea627d..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_image.tpl +++ /dev/null @@ -1,15 +0,0 @@ -{{/* -Image used by the container. -*/}} -{{- define "bjw-s.common.lib.container.field.image" -}} - {{- $ctx := .ctx -}} - {{- $rootContext := $ctx.rootContext -}} - {{- $containerObject := $ctx.containerObject -}} - - {{- $imageRepo := $containerObject.image.repository -}} - {{- $imageTag := $containerObject.image.tag -}} - - {{- if and $imageRepo $imageTag -}} - {{- printf "%s:%s" $imageRepo $imageTag -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_name.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_name.tpl deleted file mode 100644 index 7695f39b9..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_name.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Name used by the container. -*/}} -{{- define "bjw-s.common.lib.container.field.name" -}} - {{- $ctx := .ctx -}} - {{- $rootContext := $ctx.rootContext -}} - {{- $containerObject := $ctx.containerObject -}} - - {{- /* Default to container identifier */ -}} - {{- $name := $containerObject.identifier -}} - - {{- /* See if an override is desired */ -}} - {{- if hasKey $containerObject "nameOverride" -}} - {{- $option := get $containerObject "nameOverride" -}} - {{- if not (empty $option) -}} - {{- $name = $option -}} - {{- end -}} - {{- end -}} - - {{- /* Parse any templates */ -}} - {{- $name = tpl $name $rootContext -}} - - {{- $name | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_probes.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_probes.tpl deleted file mode 100644 index 5f6d60e10..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_probes.tpl +++ /dev/null @@ -1,83 +0,0 @@ -{{/* -Probes used by the container. -*/}} -{{- define "bjw-s.common.lib.container.field.probes" -}} - {{- $ctx := .ctx -}} - {{- $rootContext := $ctx.rootContext -}} - {{- $controllerObject := $ctx.controllerObject -}} - {{- $containerObject := $ctx.containerObject -}} - - {{- /* Default to empty dict */ -}} - {{- $enabledProbes := dict -}} - - {{- range $probeName, $probeValues := $containerObject.probes -}} - {{- /* Disable probe by default, but allow override */ -}} - {{- $probeEnabled := false -}} - {{- if hasKey $probeValues "enabled" -}} - {{- $probeEnabled = $probeValues.enabled -}} - {{- end -}} - - {{- if $probeEnabled -}} - {{- $probeDefinition := dict -}} - - {{- if $probeValues.custom -}} - {{- $parsedProbeSpec := tpl ($probeValues.spec | toYaml) $rootContext -}} - {{- $probeDefinition = $parsedProbeSpec | fromYaml -}} - {{- else -}} - {{- $primaryService := include "bjw-s.common.lib.service.primaryForController" (dict "rootContext" $rootContext "controllerIdentifier" $controllerObject.identifier) | fromYaml -}} - {{- $primaryServiceDefaultPort := dict -}} - {{- if $primaryService -}} - {{- $primaryServiceDefaultPort = include "bjw-s.common.lib.service.primaryPort" (dict "rootContext" $rootContext "serviceObject" $primaryService) | fromYaml -}} - {{- end -}} - {{- if $primaryServiceDefaultPort -}} - {{- $probeType := "" -}} - {{- if eq $probeValues.type "AUTO" -}} - {{- $probeType = $primaryServiceDefaultPort.protocol -}} - {{- else -}} - {{- $probeType = $probeValues.type | default "TCP" -}} - {{- end -}} - - {{- $_ := set $probeDefinition "initialDelaySeconds" $probeValues.spec.initialDelaySeconds -}} - {{- $_ := set $probeDefinition "failureThreshold" $probeValues.spec.failureThreshold -}} - {{- $_ := set $probeDefinition "timeoutSeconds" $probeValues.spec.timeoutSeconds -}} - {{- $_ := set $probeDefinition "periodSeconds" $probeValues.spec.periodSeconds -}} - - {{- $probeHeader := "" -}} - {{- if or ( eq $probeType "HTTPS" ) ( eq $probeType "HTTP" ) -}} - {{- $probeHeader = "httpGet" -}} - - {{- $_ := set $probeDefinition $probeHeader ( - dict - "path" $probeValues.path - "scheme" $probeType - ) - -}} - {{- else }} - {{- $probeHeader = "tcpSocket" -}} - {{- $_ := set $probeDefinition $probeHeader dict -}} - {{- end -}} - - {{- if $probeValues.port -}} - {{- if kindIs "float64" $probeValues.port -}} - {{- $_ := set (index $probeDefinition $probeHeader) "port" $probeValues.port -}} - {{- else if kindIs "string" $probeValues.port -}} - {{- $_ := set (index $probeDefinition $probeHeader) "port" (tpl ( $probeValues.port | toString ) $rootContext) -}} - {{- end -}} - {{- else if $primaryServiceDefaultPort.targetPort -}} - {{- $_ := set (index $probeDefinition $probeHeader) "port" $primaryServiceDefaultPort.targetPort -}} - {{- else -}} - {{- $_ := set (index $probeDefinition $probeHeader) "port" ($primaryServiceDefaultPort.port | toString | atoi ) -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- if $probeDefinition -}} - {{- $_ := set $enabledProbes (printf "%sProbe" $probeName) $probeDefinition -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- with $enabledProbes -}} - {{- . | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_volumeMounts.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_volumeMounts.tpl deleted file mode 100644 index 5139866b2..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/container/fields/_volumeMounts.tpl +++ /dev/null @@ -1,115 +0,0 @@ -{{/* -volumeMounts used by the container. -*/}} -{{- define "bjw-s.common.lib.container.field.volumeMounts" -}} - {{- $ctx := .ctx -}} - {{- $rootContext := $ctx.rootContext -}} - {{- $controllerObject := $ctx.controllerObject -}} - {{- $containerObject := $ctx.containerObject -}} - - {{- /* Default to empty dict */ -}} - {{- $persistenceItemsToProcess := dict -}} - {{- $enabledVolumeMounts := list -}} - - {{- /* Collect regular persistence items */ -}} - {{- range $identifier, $persistenceValues := $rootContext.Values.persistence -}} - {{- /* Enable persistence item by default, but allow override */ -}} - {{- $persistenceEnabled := true -}} - {{- if hasKey $persistenceValues "enabled" -}} - {{- $persistenceEnabled = $persistenceValues.enabled -}} - {{- end -}} - - {{- if $persistenceEnabled -}} - {{- $_ := set $persistenceItemsToProcess $identifier $persistenceValues -}} - {{- end -}} - {{- end -}} - - {{- /* Collect volumeClaimTemplates */ -}} - {{- if not (empty (dig "statefulset" "volumeClaimTemplates" nil $controllerObject)) -}} - {{- range $persistenceValues := $controllerObject.statefulset.volumeClaimTemplates -}} - {{- /* Enable persistence item by default, but allow override */ -}} - {{- $persistenceEnabled := true -}} - {{- if hasKey $persistenceValues "enabled" -}} - {{- $persistenceEnabled = $persistenceValues.enabled -}} - {{- end -}} - - {{- if $persistenceEnabled -}} - {{- $mountValues := dict -}} - {{- if not (empty (dig "globalMounts" nil $persistenceValues)) -}} - {{- $_ := set $mountValues "globalMounts" $persistenceValues.globalMounts -}} - {{- end -}} - {{- if not (empty (dig "advancedMounts" nil $persistenceValues)) -}} - {{- $_ := set $mountValues "advancedMounts" (dict $controllerObject.identifier $persistenceValues.advancedMounts) -}} - {{- end -}} - {{- $_ := set $persistenceItemsToProcess $persistenceValues.name $mountValues -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- range $identifier, $persistenceValues := $persistenceItemsToProcess -}} - {{- /* Set some default values */ -}} - - {{- /* Set the default mountPath to / */ -}} - {{- $mountPath := (printf "/%v" $identifier) -}} - {{- if eq "hostPath" (default "pvc" $persistenceValues.type) -}} - {{- $mountPath = $persistenceValues.hostPath -}} - {{- end -}} - - {{- /* Process configured mounts */ -}} - {{- if or .globalMounts .advancedMounts -}} - {{- $mounts := list -}} - {{- if hasKey . "globalMounts" -}} - {{- $mounts = .globalMounts -}} - {{- end -}} - - {{- if hasKey . "advancedMounts" -}} - {{- $advancedMounts := dig $controllerObject.identifier $containerObject.identifier list .advancedMounts -}} - {{- range $advancedMounts -}} - {{- $mounts = append $mounts . -}} - {{- end -}} - {{- end -}} - - {{- range $mounts -}} - {{- $volumeMount := dict -}} - {{- $_ := set $volumeMount "name" $identifier -}} - - {{- /* Use the specified mountPath if provided */ -}} - {{- with .path -}} - {{- $mountPath = . -}} - {{- end -}} - {{- $_ := set $volumeMount "mountPath" $mountPath -}} - - {{- /* Use the specified subPath if provided */ -}} - {{- with .subPath -}} - {{- $subPath := . -}} - {{- $_ := set $volumeMount "subPath" $subPath -}} - {{- end -}} - - {{- /* Use the specified readOnly setting if provided */ -}} - {{- with .readOnly -}} - {{- $readOnly := . -}} - {{- $_ := set $volumeMount "readOnly" $readOnly -}} - {{- end -}} - - {{- /* Use the specified mountPropagation setting if provided */ -}} - {{- with .mountPropagation -}} - {{- $mountPropagation := . -}} - {{- $_ := set $volumeMount "mountPropagation" $mountPropagation -}} - {{- end -}} - - {{- $enabledVolumeMounts = append $enabledVolumeMounts $volumeMount -}} - {{- end -}} - - {{- /* Mount to default path if no mounts are configured */ -}} - {{- else -}} - {{- $volumeMount := dict -}} - {{- $_ := set $volumeMount "name" $identifier -}} - {{- $_ := set $volumeMount "mountPath" $mountPath -}} - {{- $enabledVolumeMounts = append $enabledVolumeMounts $volumeMount -}} - {{- end -}} - {{- end -}} - - {{- with $enabledVolumeMounts -}} - {{- . | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_enabled_containers.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_enabled_containers.tpl deleted file mode 100644 index a49104968..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_enabled_containers.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Return the enabled containers for a controller. -*/}} -{{- define "bjw-s.common.lib.controller.enabledContainers" -}} - {{- $rootContext := .rootContext -}} - {{- $controllerObject := .controllerObject -}} - - {{- $enabledContainers := dict -}} - {{- range $name, $container := $controllerObject.containers -}} - {{- if kindIs "map" $container -}} - {{- /* Enable container by default, but allow override */ -}} - {{- $containerEnabled := true -}} - {{- if hasKey $container "enabled" -}} - {{- $containerEnabled = $container.enabled -}} - {{- end -}} - - {{- if $containerEnabled -}} - {{- $_ := set $enabledContainers $name $container -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- $enabledContainers | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_metadata.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_metadata.tpl deleted file mode 100644 index 0d759d6d4..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_metadata.tpl +++ /dev/null @@ -1,25 +0,0 @@ -{{- define "bjw-s.common.lib.controller.metadata.labels" -}} - {{- - $labels := ( - merge - (.Values.controller.labels | default dict) - (include "bjw-s.common.lib.metadata.allLabels" $ | fromYaml) - ) - -}} - {{- with $labels -}} - {{- toYaml . -}} - {{- end -}} -{{- end -}} - -{{- define "bjw-s.common.lib.controller.metadata.annotations" -}} - {{- - $annotations := ( - merge - (.Values.controller.annotations | default dict) - (include "bjw-s.common.lib.metadata.globalAnnotations" $ | fromYaml) - ) - -}} - {{- with $annotations -}} - {{- toYaml . -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_validate.tpl deleted file mode 100644 index 5d61d1a00..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_validate.tpl +++ /dev/null @@ -1,18 +0,0 @@ -{{/* -Validate controller values -*/}} -{{- define "bjw-s.common.lib.controller.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $controllerValues := .object -}} - - {{- $allowedControllerTypes := list "deployment" "daemonset" "statefulset" "cronjob" "job" -}} - {{- if not (has $controllerValues.type $allowedControllerTypes) -}} - {{- fail (printf "Not a valid controller.type (%s)" $controllerValues.type) -}} - {{- end -}} - - {{- $enabledContainers := include "bjw-s.common.lib.controller.enabledContainers" (dict "rootContext" $rootContext "controllerObject" $controllerValues) | fromYaml }} - {{- /* Validate at least one container is enabled */ -}} - {{- if not $enabledContainers -}} - {{- fail (printf "No containers enabled for controller (%s)" $controllerValues.identifier) -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_valuesToObject.tpl deleted file mode 100644 index 6badac92c..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/controller/_valuesToObject.tpl +++ /dev/null @@ -1,41 +0,0 @@ -{{/* -Convert controller values to an object -*/}} -{{- define "bjw-s.common.lib.controller.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Default the controller type to Deployment */ -}} - {{- if empty (dig "type" nil $objectValues) -}} - {{- $_ := set $objectValues "type" "deployment" -}} - {{- end -}} - - {{- /* Determine and inject the controller name */ -}} - {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - - {{- if $objectValues.nameOverride -}} - {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} - {{- else -}} - {{- if ne $identifier "main" -}} - {{- $objectName = printf "%s-%s" $objectName $identifier -}} - {{- end -}} - {{- end -}} - {{- $_ := set $objectValues "name" $objectName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Set the default Pod options for the controller */ -}} - {{- range $index, $key := keys $rootContext.Values.defaultPodOptions -}} - {{- if not (hasKey $objectValues "pod") -}} - {{- $_ := set $objectValues "pod" dict -}} - {{- end -}} - - {{- $defaultValue := get $rootContext.Values.defaultPodOptions $key -}} - {{- if not (hasKey $objectValues.pod $key) -}} - {{- $_ := set $objectValues.pod $key $defaultValue -}} - {{- end -}} - {{- end -}} - - {{- /* Return the controller object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/cronjob/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/cronjob/_validate.tpl deleted file mode 100644 index 37cb7b20e..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/cronjob/_validate.tpl +++ /dev/null @@ -1,11 +0,0 @@ -{{/* -Validate CronJob values -*/}} -{{- define "bjw-s.common.lib.cronjob.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $cronjobValues := .object -}} - - {{- if and (ne $cronjobValues.pod.restartPolicy "Never") (ne $cronjobValues.pod.restartPolicy "OnFailure") -}} - {{- fail (printf "Not a valid restartPolicy type for CronJob. (controller: %s, restartPolicy: %s)" $cronjobValues.identifier $cronjobValues.pod.restartPolicy) }} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/cronjob/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/cronjob/_valuesToObject.tpl deleted file mode 100644 index 5657be59e..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/cronjob/_valuesToObject.tpl +++ /dev/null @@ -1,18 +0,0 @@ -{{/* -Convert Cronjob values to an object -*/}} -{{- define "bjw-s.common.lib.cronjob.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- if not (hasKey $objectValues "pod") -}} - {{- $_ := set $objectValues "pod" dict -}} - {{- end -}} - - {{- $restartPolicy := default "Never" $objectValues.pod.restartPolicy -}} - {{- $_ := set $objectValues.pod "restartPolicy" $restartPolicy -}} - - {{- /* Return the CronJob object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/daemonset/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/daemonset/_validate.tpl deleted file mode 100644 index 25a7408c8..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/daemonset/_validate.tpl +++ /dev/null @@ -1,7 +0,0 @@ -{{/* -Validate DaemonSet values -*/}} -{{- define "bjw-s.common.lib.daemonset.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $daemonsetValues := .object -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/daemonset/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/daemonset/_valuesToObject.tpl deleted file mode 100644 index 4593255b5..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/daemonset/_valuesToObject.tpl +++ /dev/null @@ -1,11 +0,0 @@ -{{/* -Convert DaemonSet values to an object -*/}} -{{- define "bjw-s.common.lib.daemonset.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Return the DaemonSet object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/deployment/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/deployment/_validate.tpl deleted file mode 100644 index c32100794..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/deployment/_validate.tpl +++ /dev/null @@ -1,11 +0,0 @@ -{{/* -Validate Deployment values -*/}} -{{- define "bjw-s.common.lib.deployment.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $deploymentValues := .object -}} - - {{- if and (ne $deploymentValues.strategy "Recreate") (ne $deploymentValues.strategy "RollingUpdate") -}} - {{- fail (printf "Not a valid strategy type for Deployment. (controller: %s, strategy: %s)" $deploymentValues.identifier $deploymentValues.strategy) }} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/deployment/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/deployment/_valuesToObject.tpl deleted file mode 100644 index 7e7ad9ae8..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/deployment/_valuesToObject.tpl +++ /dev/null @@ -1,14 +0,0 @@ -{{/* -Convert Deployment values to an object -*/}} -{{- define "bjw-s.common.lib.deployment.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- $strategy := default "Recreate" $objectValues.strategy -}} - {{- $_ := set $objectValues "strategy" $strategy -}} - - {{- /* Return the Deployment object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_primary.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_primary.tpl deleted file mode 100644 index 5198d09a4..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_primary.tpl +++ /dev/null @@ -1,21 +0,0 @@ -{{/* Return the name of the primary Ingress object */}} -{{- define "bjw-s.common.lib.ingress.primary" -}} - {{- $enabledIngresses := dict -}} - {{- range $name, $ingress := .Values.ingress -}} - {{- if $ingress.enabled -}} - {{- $_ := set $enabledIngresses $name . -}} - {{- end -}} - {{- end -}} - - {{- $result := "" -}} - {{- range $name, $ingress := $enabledIngresses -}} - {{- if and (hasKey $ingress "primary") $ingress.primary -}} - {{- $result = $name -}} - {{- end -}} - {{- end -}} - - {{- if not $result -}} - {{- $result = keys $enabledIngresses | first -}} - {{- end -}} - {{- $result -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_validate.tpl deleted file mode 100644 index 0078e86e6..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_validate.tpl +++ /dev/null @@ -1,15 +0,0 @@ -{{/* -Validate Ingress values -*/}} -{{- define "bjw-s.common.lib.ingress.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $ingressValues := .object -}} - - {{- range $ingressValues.hosts -}} - {{- range .paths -}} - {{- if empty (dig "service" "name" nil .) -}} - {{- fail (printf "No service name configured. (ingress: %s, path: %s)" $ingressValues.identifier .path) -}} - {{- end -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_valuesToObject.tpl deleted file mode 100644 index c9195cad4..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/ingress/_valuesToObject.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Convert ingress values to an object -*/}} -{{- define "bjw-s.common.lib.ingress.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Determine and inject the ingress name */ -}} - {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - - {{- if $objectValues.nameOverride -}} - {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} - {{- else -}} - {{- if ne $identifier "main" -}} - {{- $objectName = printf "%s-%s" $objectName $identifier -}} - {{- end -}} - {{- end -}} - {{- $_ := set $objectValues "name" $objectName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Return the ingress object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/job/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/job/_validate.tpl deleted file mode 100644 index 75f71917e..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/job/_validate.tpl +++ /dev/null @@ -1,12 +0,0 @@ -{{/* -Validate job values -*/}} -{{- define "bjw-s.common.lib.job.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $jobValues := .object -}} - - {{- $allowedRestartPolicy := list "Never" "OnFailure" -}} - {{- if not (has $jobValues.pod.restartPolicy $allowedRestartPolicy) -}} - {{- fail (printf "Not a valid restart policy for Job (controller: %s, strategy: %s)" $jobValues.identifier $jobValues.pod.restartPolicy) -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/job/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/job/_valuesToObject.tpl deleted file mode 100644 index 5886d6033..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/job/_valuesToObject.tpl +++ /dev/null @@ -1,14 +0,0 @@ -{{/* -Convert job values to an object -*/}} -{{- define "bjw-s.common.lib.job.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- $restartPolicy := default "Never" $objectValues.pod.restartPolicy -}} - {{- $_ := set $objectValues.pod "restartPolicy" $restartPolicy -}} - - {{- /* Return the Job object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_allLabels.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_allLabels.tpl deleted file mode 100644 index 330857b04..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_allLabels.tpl +++ /dev/null @@ -1,10 +0,0 @@ -{{/* Common labels shared across objects */}} -{{- define "bjw-s.common.lib.metadata.allLabels" -}} -helm.sh/chart: {{ include "bjw-s.common.lib.chart.names.chart" . }} -{{ include "bjw-s.common.lib.metadata.selectorLabels" . }} - {{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} - {{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{ include "bjw-s.common.lib.metadata.globalLabels" . }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_globalAnnotations.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_globalAnnotations.tpl deleted file mode 100644 index c7850c599..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_globalAnnotations.tpl +++ /dev/null @@ -1,10 +0,0 @@ -{{/* Common annotations shared across objects */}} -{{- define "bjw-s.common.lib.metadata.globalAnnotations" -}} - {{- with .Values.global.annotations }} - {{- range $k, $v := . }} - {{- $name := $k }} - {{- $value := tpl $v $ }} -{{ $name }}: {{ quote $value }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_globalLabels.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_globalLabels.tpl deleted file mode 100644 index 6b4c37709..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_globalLabels.tpl +++ /dev/null @@ -1,9 +0,0 @@ -{{- define "bjw-s.common.lib.metadata.globalLabels" -}} - {{- with .Values.global.labels }} - {{- range $k, $v := . }} - {{- $name := $k }} - {{- $value := tpl $v $ }} -{{ $name }}: {{ quote $value }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_selectorLabels.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_selectorLabels.tpl deleted file mode 100644 index 5174d999d..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/metadata/_selectorLabels.tpl +++ /dev/null @@ -1,5 +0,0 @@ -{{/* Selector labels shared across objects */}} -{{- define "bjw-s.common.lib.metadata.selectorLabels" -}} -app.kubernetes.io/name: {{ include "bjw-s.common.lib.chart.names.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/networkpolicy/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/networkpolicy/_validate.tpl deleted file mode 100644 index c490d1b70..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/networkpolicy/_validate.tpl +++ /dev/null @@ -1,22 +0,0 @@ -{{/* -Validate networkPolicy values -*/}} -{{- define "bjw-s.common.lib.networkpolicy.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $networkpolicyObject := .object -}} - - {{- if and (not (hasKey $networkpolicyObject "podSelector")) (empty (get $networkpolicyObject "controller")) -}} - {{- fail (printf "controller reference or podSelector is required for NetworkPolicy. (NetworkPolicy %s)" $networkpolicyObject.identifier) -}} - {{- end -}} - - {{- if empty (get $networkpolicyObject "policyTypes") -}} - {{- fail (printf "policyTypes is required for NetworkPolicy. (NetworkPolicy %s)" $networkpolicyObject.identifier) -}} - {{- end -}} - - {{- $allowedpolicyTypes := list "Ingress" "Egress" -}} - {{- range $networkpolicyObject.policyTypes -}} - {{- if not (has . $allowedpolicyTypes) -}} - {{- fail (printf "Not a valid policyType for NetworkPolicy. (NetworkPolicy %s, value %s)" $networkpolicyObject.identifier .) -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/networkpolicy/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/networkpolicy/_valuesToObject.tpl deleted file mode 100644 index 805f33a5a..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/networkpolicy/_valuesToObject.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Convert networkPolicy values to an object -*/}} -{{- define "bjw-s.common.lib.networkpolicy.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Determine and inject the networkPolicy name */ -}} - {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - - {{- if $objectValues.nameOverride -}} - {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} - {{- else -}} - {{- if ne $identifier "main" -}} - {{- $objectName = printf "%s-%s" $objectName $identifier -}} - {{- end -}} - {{- end -}} - {{- $_ := set $objectValues "name" $objectName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Return the networkPolicy object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/_getOption.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/_getOption.tpl deleted file mode 100644 index c436ee328..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/_getOption.tpl +++ /dev/null @@ -1,34 +0,0 @@ -{{- /* -Returns the value for the specified field -*/ -}} -{{- define "bjw-s.common.lib.pod.getOption" -}} - {{- $rootContext := .ctx.rootContext -}} - {{- $controllerObject := .ctx.controllerObject -}} - {{- $option := .option -}} - - {{- $value := "" -}} - - {{- /* Set to the default if it is set */ -}} - {{- $defaultOption := get $rootContext.Values.defaultPodOptions $option -}} - {{- if kindIs "bool" $defaultOption -}} - {{- $value = $defaultOption -}} - {{- else if not (empty $defaultOption) -}} - {{- $value = $defaultOption -}} - {{- end -}} - - {{- /* See if a pod-specific override is needed */ -}} - {{- if hasKey $controllerObject "pod" -}} - {{- $podOption := get $controllerObject.pod $option -}} - {{- if kindIs "bool" $podOption -}} - {{- $value = $podOption -}} - {{- else if not (empty $podOption) -}} - {{- $value = $podOption -}} - {{- end -}} - {{- end -}} - - {{- if kindIs "bool" $value -}} - {{- $value | toYaml -}} - {{- else if not (empty $value) -}} - {{- $value | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/_spec.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/_spec.tpl deleted file mode 100644 index 103acc3c7..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/_spec.tpl +++ /dev/null @@ -1,67 +0,0 @@ -{{- /* -The pod definition included in the controller. -*/ -}} -{{- define "bjw-s.common.lib.pod.spec" -}} - {{- $rootContext := .rootContext -}} - {{- $controllerObject := .controllerObject -}} - {{- $ctx := dict "rootContext" $rootContext "controllerObject" $controllerObject -}} - -enableServiceLinks: {{ $controllerObject.pod.enableServiceLinks }} -serviceAccountName: {{ include "bjw-s.common.lib.pod.field.serviceAccountName" (dict "ctx" $ctx) | trim }} -automountServiceAccountToken: {{ $controllerObject.pod.automountServiceAccountToken }} - {{- with ($controllerObject.pod.priorityClassName) }} -priorityClassName: {{ . | trim }} - {{- end -}} - {{- with ($controllerObject.pod.runtimeClassName) }} -runtimeClassName: {{ . | trim }} - {{- end -}} - {{- with ($controllerObject.pod.schedulerName) }} -schedulerName: {{ . | trim }} - {{- end -}} - {{- with ($controllerObject.pod.securityContext) }} -securityContext: {{ . | toYaml | nindent 2 }} - {{- end -}} - {{- with ($controllerObject.pod.hostname) }} -hostname: {{ . | trim }} - {{- end }} -hostIPC: {{ $controllerObject.pod.hostIPC }} -hostNetwork: {{ $controllerObject.pod.hostNetwork }} -hostPID: {{ $controllerObject.pod.hostPID }} -dnsPolicy: {{ include "bjw-s.common.lib.pod.field.dnsPolicy" (dict "ctx" $ctx) | trim }} - {{- with $controllerObject.pod.dnsConfig }} -dnsConfig: {{ . | toYaml | nindent 2 }} - {{- end -}} - {{- with $controllerObject.pod.hostAliases }} -hostAliases: {{ . | toYaml | nindent 2 }} - {{- end -}} - {{- with $controllerObject.pod.imagePullSecrets }} -imagePullSecrets: {{ . | toYaml | nindent 2 }} - {{- end -}} - {{- with $controllerObject.pod.terminationGracePeriodSeconds }} -terminationGracePeriodSeconds: {{ . | trim }} - {{- end -}} - {{- with $controllerObject.pod.restartPolicy }} -restartPolicy: {{ . | trim }} - {{- end -}} - {{- with $controllerObject.pod.nodeSelector }} -nodeSelector: {{ . | toYaml | nindent 2 }} - {{- end -}} - {{- with $controllerObject.pod.affinity }} -affinity: {{ . | toYaml | nindent 2 }} - {{- end -}} - {{- with $controllerObject.pod.topologySpreadConstraints }} -topologySpreadConstraints: {{ . | toYaml | nindent 2 }} - {{- end -}} - {{- with $controllerObject.pod.tolerations }} -tolerations: {{ . | toYaml | nindent 2 }} - {{- end }} - {{- with (include "bjw-s.common.lib.pod.field.initContainers" (dict "ctx" $ctx) | trim) }} -initContainers: {{ . | nindent 2 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.pod.field.containers" (dict "ctx" $ctx) | trim) }} -containers: {{ . | nindent 2 }} - {{- end -}} - {{- with (include "bjw-s.common.lib.pod.field.volumes" (dict "ctx" $ctx) | trim) }} -volumes: {{ . | nindent 2 }} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_containers.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_containers.tpl deleted file mode 100644 index a20f7d413..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_containers.tpl +++ /dev/null @@ -1,71 +0,0 @@ -{{- /* -Returns the value for containers -*/ -}} -{{- define "bjw-s.common.lib.pod.field.containers" -}} - {{- $rootContext := .ctx.rootContext -}} - {{- $controllerObject := .ctx.controllerObject -}} - - {{- /* Default to empty list */ -}} - {{- $graph := dict -}} - {{- $containers := list -}} - - {{- /* Fetch configured containers for this controller */ -}} - {{- $enabledContainers := include "bjw-s.common.lib.controller.enabledContainers" (dict "rootContext" $rootContext "controllerObject" $controllerObject) | fromYaml }} - {{- $renderedContainers := dict -}} - - {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} - {{- $containersWithDependsOn := include "bjw-s.common.lib.getMapItemsWithKey" (dict "map" $enabledContainers "key" "dependsOn") | fromYaml | keys -}} - {{- $useDependsOn := gt (len $containersWithDependsOn) 0 -}} - - {{- range $key, $containerValues := $enabledContainers -}} - {{- /* Create object from the container values */ -}} - {{- $containerObject := (include "bjw-s.common.lib.container.valuesToObject" (dict "rootContext" $rootContext "id" $key "values" $containerValues)) | fromYaml -}} - - {{- /* Perform validations on the Container before rendering */ -}} - {{- include "bjw-s.common.lib.container.validate" (dict "rootContext" $ "controllerObject" $controllerObject "containerObject" $containerObject) -}} - - {{- /* Generate the Container spec */ -}} - {{- $renderedContainer := include "bjw-s.common.lib.container.spec" (dict "rootContext" $rootContext "controllerObject" $controllerObject "containerObject" $containerObject) | fromYaml -}} - {{- $_ := set $renderedContainers $key $renderedContainer -}} - - {{- /* Determine the Container order */ -}} - {{- if $useDependsOn -}} - {{- if empty (dig "dependsOn" nil $containerValues) -}} - {{- $_ := set $graph $key ( list ) -}} - {{- else if kindIs "string" $containerValues.dependsOn -}} - {{- $_ := set $graph $key ( list $containerValues.dependsOn ) -}} - {{- else if kindIs "slice" $containerValues.dependsOn -}} - {{- $_ := set $graph $key $containerValues.dependsOn -}} - {{- end -}} - {{- else -}} - {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} - {{- $containerOrder := (dig "order" 99 $containerValues) -}} - {{- $_ := set $graph $key $containerOrder -}} - {{- end -}} - {{- end -}} - - {{- /* Process graph */ -}} - {{- if $useDependsOn -}} - {{- $args := dict "graph" $graph "out" list -}} - {{- include "bjw-s.common.lib.kahn" $args -}} - - {{- range $name := $args.out -}} - {{- $containerItem := get $renderedContainers $name -}} - {{- $containers = append $containers $containerItem -}} - {{- end -}} - {{- else -}} - {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} - {{- $orderedContainers := dict -}} - {{- range $key, $order := $graph -}} - {{- $containerItem := get $renderedContainers $key -}} - {{- $_ := set $orderedContainers (printf "%v-%s" $order $key) $containerItem -}} - {{- end -}} - {{- range $key, $containerValues := $orderedContainers -}} - {{- $containers = append $containers $containerValues -}} - {{- end -}} - {{- end -}} - - {{- if not (empty $containers) -}} - {{- $containers | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_dnsPolicy.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_dnsPolicy.tpl deleted file mode 100644 index e82636d04..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_dnsPolicy.tpl +++ /dev/null @@ -1,25 +0,0 @@ -{{- /* -Returns the value for dnsPolicy -*/ -}} -{{- define "bjw-s.common.lib.pod.field.dnsPolicy" -}} - {{- $ctx := .ctx -}} - {{- $controllerObject := $ctx.controllerObject -}} - - {{- /* Default to "ClusterFirst" */ -}} - {{- $dnsPolicy := "ClusterFirst" -}} - - {{- /* Get hostNetwork value "" */ -}} - {{- $hostNetwork:= get $controllerObject.pod "hostNetwork" -}} - {{- if $hostNetwork -}} - {{- $dnsPolicy = "ClusterFirstWithHostNet" -}} - {{- end -}} - - {{- /* See if an override is desired */ -}} - {{- $override := get $controllerObject.pod "dnsPolicy" -}} - - {{- if not (empty $override) -}} - {{- $dnsPolicy = $override -}} - {{- end -}} - - {{- $dnsPolicy -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_initContainers.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_initContainers.tpl deleted file mode 100644 index 2d7800923..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_initContainers.tpl +++ /dev/null @@ -1,78 +0,0 @@ -{{- /* -Returns the value for initContainers -*/ -}} -{{- define "bjw-s.common.lib.pod.field.initContainers" -}} - {{- $rootContext := .ctx.rootContext -}} - {{- $controllerObject := .ctx.controllerObject -}} - - {{- /* Default to empty list */ -}} - {{- $graph := dict -}} - {{- $containers := list -}} - - {{- /* Fetch configured containers for this controller */ -}} - {{- $renderedContainers := dict -}} - - {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} - {{- $containersWithDependsOn := include "bjw-s.common.lib.getMapItemsWithKey" (dict "map" $controllerObject.initContainers "key" "dependsOn") | fromYaml | keys -}} - {{- $useDependsOn := gt (len $containersWithDependsOn) 0 -}} - - {{- range $key, $containerValues := $controllerObject.initContainers -}} - {{- /* Enable container by default, but allow override */ -}} - {{- $containerEnabled := true -}} - {{- if hasKey $containerValues "enabled" -}} - {{- $containerEnabled = $containerValues.enabled -}} - {{- end -}} - - {{- if $containerEnabled -}} - {{- /* Create object from the container values */ -}} - {{- $containerObject := (include "bjw-s.common.lib.container.valuesToObject" (dict "rootContext" $rootContext "id" $key "values" $containerValues)) | fromYaml -}} - - {{- /* Perform validations on the Container before rendering */ -}} - {{- include "bjw-s.common.lib.container.validate" (dict "rootContext" $ "controllerObject" $controllerObject "containerObject" $containerObject) -}} - - {{- /* Generate the Container spec */ -}} - {{- $renderedContainer := include "bjw-s.common.lib.container.spec" (dict "rootContext" $rootContext "controllerObject" $controllerObject "containerObject" $containerObject) | fromYaml -}} - {{- $_ := set $renderedContainers $key $renderedContainer -}} - - {{- /* Determine the Container order */ -}} - {{- if $useDependsOn -}} - {{- if empty (dig "dependsOn" nil $containerValues) -}} - {{- $_ := set $graph $key ( list ) -}} - {{- else if kindIs "string" $containerValues.dependsOn -}} - {{- $_ := set $graph $key ( list $containerValues.dependsOn ) -}} - {{- else if kindIs "slice" $containerValues.dependsOn -}} - {{- $_ := set $graph $key $containerValues.dependsOn -}} - {{- end -}} - {{- else -}} - {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} - {{- $containerOrder := (dig "order" 99 $containerValues) -}} - {{- $_ := set $graph $key $containerOrder -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- /* Process graph */ -}} - {{- if $useDependsOn -}} - {{- $args := dict "graph" $graph "out" list -}} - {{- include "bjw-s.common.lib.kahn" $args -}} - - {{- range $name := $args.out -}} - {{- $containerItem := get $renderedContainers $name -}} - {{- $containers = append $containers $containerItem -}} - {{- end -}} - {{- else -}} - {{- /* TODO: Remove this logic after "order" removal in v3 */ -}} - {{- $orderedContainers := dict -}} - {{- range $key, $order := $graph -}} - {{- $containerItem := get $renderedContainers $key -}} - {{- $_ := set $orderedContainers (printf "%v-%s" $order $key) $containerItem -}} - {{- end -}} - {{- range $key, $containerValues := $orderedContainers -}} - {{- $containers = append $containers $containerValues -}} - {{- end -}} - {{- end -}} - - {{- if not (empty $containers) -}} - {{- $containers | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_serviceAccountName.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_serviceAccountName.tpl deleted file mode 100644 index 947a1a460..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_serviceAccountName.tpl +++ /dev/null @@ -1,11 +0,0 @@ -{{- /* -Returns the value for serviceAccountName -*/ -}} -{{- define "bjw-s.common.lib.pod.field.serviceAccountName" -}} - {{- $rootContext := .ctx.rootContext -}} - - {{- $serviceAccountValues := (mustDeepCopy $rootContext.Values.serviceAccount) -}} - {{- $serviceAccountObject := (include "bjw-s.common.lib.serviceAccount.valuesToObject" (dict "rootContext" $rootContext "id" "default" "values" $serviceAccountValues)) | fromYaml -}} - {{- $serviceAccountObject.name -}} - -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_volumes.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_volumes.tpl deleted file mode 100644 index 2e8836906..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/fields/_volumes.tpl +++ /dev/null @@ -1,125 +0,0 @@ -{{- /* -Returns the value for volumes -*/ -}} -{{- define "bjw-s.common.lib.pod.field.volumes" -}} - {{- $rootContext := .ctx.rootContext -}} - {{- $controllerObject := .ctx.controllerObject -}} - - {{- /* Default to empty list */ -}} - {{- $persistenceItemsToProcess := dict -}} - {{- $volumes := list -}} - - {{- /* Loop over persistence values */ -}} - {{- range $identifier, $persistenceValues := $rootContext.Values.persistence -}} - {{- /* Enable persistence item by default, but allow override */ -}} - {{- $persistenceEnabled := true -}} - {{- if hasKey $persistenceValues "enabled" -}} - {{- $persistenceEnabled = $persistenceValues.enabled -}} - {{- end -}} - - {{- if $persistenceEnabled -}} - {{- $hasglobalMounts := not (empty $persistenceValues.globalMounts) -}} - {{- $globalMounts := dig "globalMounts" list $persistenceValues -}} - - {{- $hasAdvancedMounts := not (empty $persistenceValues.advancedMounts) -}} - {{- $advancedMounts := dig "advancedMounts" $controllerObject.identifier list $persistenceValues -}} - - {{ if or - ($hasglobalMounts) - (and ($hasAdvancedMounts) (not (empty $advancedMounts))) - (and (not $hasglobalMounts) (not $hasAdvancedMounts)) - -}} - {{- $_ := set $persistenceItemsToProcess $identifier $persistenceValues -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- /* Loop over persistence items */ -}} - {{- range $identifier, $persistenceValues := $persistenceItemsToProcess -}} - {{- $volume := dict "name" $identifier -}} - - {{- /* PVC persistence type */ -}} - {{- if eq (default "persistentVolumeClaim" $persistenceValues.type) "persistentVolumeClaim" -}} - {{- $pvcName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - {{- if $persistenceValues.existingClaim -}} - {{- /* Always prefer an existingClaim if that is set */ -}} - {{- $pvcName = $persistenceValues.existingClaim -}} - {{- else -}} - {{- /* Otherwise refer to the PVC name */ -}} - {{- if $persistenceValues.nameOverride -}} - {{- if not (eq $persistenceValues.nameOverride "-") -}} - {{- $pvcName = (printf "%s-%s" (include "bjw-s.common.lib.chart.names.fullname" $rootContext) $persistenceValues.nameOverride) -}} - {{- end -}} - {{- else -}} - {{- $pvcName = (printf "%s-%s" (include "bjw-s.common.lib.chart.names.fullname" $rootContext) $identifier) -}} - {{- end -}} - {{- end -}} - {{- $_ := set $volume "persistentVolumeClaim" (dict "claimName" $pvcName) -}} - - {{- /* configMap persistence type */ -}} - {{- else if eq $persistenceValues.type "configMap" -}} - {{- $objectName := (required (printf "name not set for persistence item %s" $identifier) $persistenceValues.name) -}} - {{- $objectName = tpl $objectName $rootContext -}} - {{- $_ := set $volume "configMap" dict -}} - {{- $_ := set $volume.configMap "name" $objectName -}} - {{- with $persistenceValues.defaultMode -}} - {{- $_ := set $volume.configMap "defaultMode" . -}} - {{- end -}} - {{- with $persistenceValues.items -}} - {{- $_ := set $volume.configMap "items" . -}} - {{- end -}} - - {{- /* Secret persistence type */ -}} - {{- else if eq $persistenceValues.type "secret" -}} - {{- $objectName := (required (printf "name not set for persistence item %s" $identifier) $persistenceValues.name) -}} - {{- $objectName = tpl $objectName $rootContext -}} - {{- $_ := set $volume "secret" dict -}} - {{- $_ := set $volume.secret "secretName" $objectName -}} - {{- with $persistenceValues.defaultMode -}} - {{- $_ := set $volume.secret "defaultMode" . -}} - {{- end -}} - {{- with $persistenceValues.items -}} - {{- $_ := set $volume.secret "items" . -}} - {{- end -}} - - {{- /* emptyDir persistence type */ -}} - {{- else if eq $persistenceValues.type "emptyDir" -}} - {{- $_ := set $volume "emptyDir" dict -}} - {{- with $persistenceValues.medium -}} - {{- $_ := set $volume.emptyDir "medium" . -}} - {{- end -}} - {{- with $persistenceValues.sizeLimit -}} - {{- $_ := set $volume.emptyDir "sizeLimit" . -}} - {{- end -}} - - {{- /* hostPath persistence type */ -}} - {{- else if eq $persistenceValues.type "hostPath" -}} - {{- $_ := set $volume "hostPath" dict -}} - {{- $_ := set $volume.hostPath "path" (required "hostPath not set" $persistenceValues.hostPath) -}} - {{- with $persistenceValues.hostPathType }} - {{- $_ := set $volume.hostPath "type" . -}} - {{- end -}} - - {{- /* nfs persistence type */ -}} - {{- else if eq $persistenceValues.type "nfs" -}} - {{- $_ := set $volume "nfs" dict -}} - {{- $_ := set $volume.nfs "server" (required "server not set" $persistenceValues.server) -}} - {{- $_ := set $volume.nfs "path" (required "path not set" $persistenceValues.path) -}} - - {{- /* custom persistence type */ -}} - {{- else if eq $persistenceValues.type "custom" -}} - {{- $volume = $persistenceValues.volumeSpec -}} - {{- $_ := set $volume "name" $identifier -}} - - {{- /* Fail otherwise */ -}} - {{- else -}} - {{- fail (printf "Not a valid persistence.type (%s)" $persistenceValues.type) -}} - {{- end -}} - - {{- $volumes = append $volumes $volume -}} - {{- end -}} - - {{- if not (empty $volumes) -}} - {{- $volumes | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/metadata/_annotations.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/metadata/_annotations.tpl deleted file mode 100644 index 86e6d25ff..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/metadata/_annotations.tpl +++ /dev/null @@ -1,56 +0,0 @@ -{{- /* -Returns the value for annotations -*/ -}} -{{- define "bjw-s.common.lib.pod.metadata.annotations" -}} - {{- $rootContext := .rootContext -}} - {{- $controllerObject := .controllerObject -}} - - {{- /* Default annotations */ -}} - {{- $annotations := dict -}} - - {{- /* Set to the default if it is set */ -}} - {{- $defaultOption := get $rootContext.Values.defaultPodOptions "annotations" -}} - {{- if not (empty $defaultOption) -}} - {{- $annotations = merge $defaultOption $annotations -}} - {{- end -}} - - {{- /* See if a pod-specific override is set */ -}} - {{- if hasKey $controllerObject "pod" -}} - {{- $podOption := get $controllerObject.pod "annotations" -}} - {{- if not (empty $podOption) -}} - {{- $annotations = merge $podOption $annotations -}} - {{- end -}} - {{- end -}} - - {{- /* Add configMaps checksum */ -}} - {{- $configMapsFound := dict -}} - {{- range $name, $configmap := $rootContext.Values.configMaps -}} - {{- if $configmap.enabled -}} - {{- $_ := set $configMapsFound $name (toYaml $configmap.data | sha256sum) -}} - {{- end -}} - {{- end -}} - {{- if $configMapsFound -}} - {{- $annotations = merge - (dict "checksum/configMaps" (toYaml $configMapsFound | sha256sum)) - $annotations - -}} - {{- end -}} - - {{- /* Add Secrets checksum */ -}} - {{- $secretsFound := dict -}} - {{- range $name, $secret := $rootContext.Values.secrets -}} - {{- if $secret.enabled -}} - {{- $_ := set $secretsFound $name (toYaml $secret.stringData | sha256sum) -}} - {{- end -}} - {{- end -}} - {{- if $secretsFound -}} - {{- $annotations = merge - (dict "checksum/secrets" (toYaml $secretsFound | sha256sum)) - $annotations - -}} - {{- end -}} - - {{- if not (empty $annotations) -}} - {{- $annotations | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/metadata/_labels.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/metadata/_labels.tpl deleted file mode 100644 index 82a1731be..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/pod/metadata/_labels.tpl +++ /dev/null @@ -1,36 +0,0 @@ -{{- /* -Returns the value for labels -*/ -}} -{{- define "bjw-s.common.lib.pod.metadata.labels" -}} - {{- $rootContext := .rootContext -}} - {{- $controllerObject := .controllerObject -}} - - {{- /* Default labels */ -}} - {{- $labels := merge - (dict "app.kubernetes.io/component" $controllerObject.identifier) - -}} - - {{- /* Fetch the Pod selectorLabels */ -}} - {{- $selectorLabels := include "bjw-s.common.lib.metadata.selectorLabels" $rootContext | fromYaml -}} - {{- if not (empty $selectorLabels) -}} - {{- $labels = merge $selectorLabels $labels -}} - {{- end -}} - - {{- /* Set to the default if it is set */ -}} - {{- $defaultOption := get $rootContext.Values.defaultPodOptions "labels" -}} - {{- if not (empty $defaultOption) -}} - {{- $labels = merge $defaultOption $labels -}} - {{- end -}} - - {{- /* See if a pod-specific override is set */ -}} - {{- if hasKey $controllerObject "pod" -}} - {{- $podOption := get $controllerObject.pod "labels" -}} - {{- if not (empty $podOption) -}} - {{- $labels = merge $podOption $labels -}} - {{- end -}} - {{- end -}} - - {{- if not (empty $labels) -}} - {{- $labels | toYaml -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pvc/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pvc/_validate.tpl deleted file mode 100644 index 23110faf0..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/pvc/_validate.tpl +++ /dev/null @@ -1,7 +0,0 @@ -{{/* -Validate PVC values -*/}} -{{- define "bjw-s.common.lib.pvc.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $pvcObject := .object -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/pvc/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/pvc/_valuesToObject.tpl deleted file mode 100644 index 99878382a..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/pvc/_valuesToObject.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Convert PVC values to an object -*/}} -{{- define "bjw-s.common.lib.pvc.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Determine and inject the PVC name */ -}} - {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - - {{- if $objectValues.nameOverride -}} - {{- if ne $objectValues.nameOverride "-" -}} - {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} - {{- end -}} - {{- else -}} - {{- $objectName = printf "%s-%s" $objectName $identifier -}} - {{- end -}} - {{- $_ := set $objectValues "name" $objectName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Return the PVC object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_primary.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_primary.tpl deleted file mode 100644 index ba6cd1a40..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_primary.tpl +++ /dev/null @@ -1,21 +0,0 @@ -{{/* Return the name of the primary route object */}} -{{- define "bjw-s.common.lib.route.primary" -}} - {{- $enabledRoutes := dict -}} - {{- range $name, $route := .Values.route -}} - {{- if $route.enabled -}} - {{- $_ := set $enabledRoutes $name . -}} - {{- end -}} - {{- end -}} - - {{- $result := "" -}} - {{- range $name, $route := $enabledRoutes -}} - {{- if and (hasKey $route "primary") $route.primary -}} - {{- $result = $name -}} - {{- end -}} - {{- end -}} - - {{- if not $result -}} - {{- $result = keys $enabledRoutes | first -}} - {{- end -}} - {{- $result -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_validate.tpl deleted file mode 100644 index 776494c0a..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_validate.tpl +++ /dev/null @@ -1,25 +0,0 @@ -{{/* -Validate Route values -*/}} -{{- define "bjw-s.common.lib.route.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $routeObject := .object -}} - - {{/* Route Types */}} - {{- $routeKind := $routeObject.kind | default "HTTPRoute"}} - {{- if and (ne $routeKind "GRPCRoute") (ne $routeKind "HTTPRoute") (ne $routeKind "TCPRoute") (ne $routeKind "TLSRoute") (ne $routeKind "UDPRoute") }} - {{- fail (printf "Not a valid route kind (%s)" $routeKind) }} - {{- end }} - - {{/* Route Rules */}} - - {{- range $routeObject.rules }} - {{- if and (.filters) (.backendRefs) }} - {{- range .filters }} - {{- if eq .type "RequestRedirect" }} - {{- fail (printf "backend refs and request redirect filters cannot co-exist.")}} - {{- end }} - {{- end }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_valuesToObject.tpl deleted file mode 100644 index 1b4366312..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/routes/_valuesToObject.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Convert Route values to an object -*/}} -{{- define "bjw-s.common.lib.route.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Determine and inject the Route name */ -}} - {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - - {{- if $objectValues.nameOverride -}} - {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} - {{- else -}} - {{- if ne $identifier (include "bjw-s.common.lib.route.primary" $rootContext) -}} - {{- $objectName = printf "%s-%s" $objectName $identifier -}} - {{- end -}} - {{- end -}} - {{- $_ := set $objectValues "name" $objectName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Return the Route object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_getByIdentifier.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_getByIdentifier.tpl deleted file mode 100644 index ddcb4547a..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_getByIdentifier.tpl +++ /dev/null @@ -1,12 +0,0 @@ -{{/* -Return a secret Object by its Identifier. -*/}} -{{- define "bjw-s.common.lib.secret.getByIdentifier" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - - {{- $secretValues := dig $identifier nil $rootContext.Values.secrets -}} - {{- if not (empty $secretValues) -}} - {{- include "bjw-s.common.lib.secret.valuesToObject" (dict "rootContext" $rootContext "id" $identifier "values" $secretValues) -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_validate.tpl deleted file mode 100644 index 82603992f..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_validate.tpl +++ /dev/null @@ -1,7 +0,0 @@ -{{/* -Validate Secret values -*/}} -{{- define "bjw-s.common.lib.secret.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $secretValues := .object -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_valuesToObject.tpl deleted file mode 100644 index 59f89d17a..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/secret/_valuesToObject.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Convert Secret values to an object -*/}} -{{- define "bjw-s.common.lib.secret.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Determine and inject the Secret name */ -}} - {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - - {{- if $objectValues.nameOverride -}} - {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} - {{- else -}} - {{- if ne $identifier "main" -}} - {{- $objectName = printf "%s-%s" $objectName $identifier -}} - {{- end -}} - {{- end -}} - {{- $_ := set $objectValues "name" $objectName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Return the Secret object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_enabled_ports.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_enabled_ports.tpl deleted file mode 100644 index 6de6c1b08..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_enabled_ports.tpl +++ /dev/null @@ -1,22 +0,0 @@ -{{/* -Return the enabled ports for a given Service object. -*/}} -{{- define "bjw-s.common.lib.service.enabledPorts" -}} - {{- $rootContext := .rootContext -}} - {{- $serviceObject := .serviceObject -}} - - {{- $enabledPorts := dict -}} - - {{- range $name, $port := $serviceObject.ports -}} - {{- if kindIs "map" $port -}} - {{- $portEnabled := true -}} - {{- if hasKey $port "enabled" -}} - {{- $portEnabled = $port.enabled -}} - {{- end -}} - {{- if $portEnabled -}} - {{- $_ := set $enabledPorts $name . -}} - {{- end -}} - {{- end -}} - {{- end -}} - {{- $enabledPorts | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_enabled_services.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_enabled_services.tpl deleted file mode 100644 index 74b4ea901..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_enabled_services.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* -Return the enabled services. -*/}} -{{- define "bjw-s.common.lib.service.enabledServices" -}} - {{- $rootContext := .rootContext -}} - {{- $enabledServices := dict -}} - - {{- range $name, $service := $rootContext.Values.service -}} - {{- if kindIs "map" $service -}} - {{- /* Enable Service by default, but allow override */ -}} - {{- $serviceEnabled := true -}} - {{- if hasKey $service "enabled" -}} - {{- $serviceEnabled = $service.enabled -}} - {{- end -}} - - {{- if $serviceEnabled -}} - {{- $_ := set $enabledServices $name . -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- $enabledServices | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_getByIdentifier.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_getByIdentifier.tpl deleted file mode 100644 index c83351254..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_getByIdentifier.tpl +++ /dev/null @@ -1,13 +0,0 @@ -{{/* -Return a service Object by its Identifier. -*/}} -{{- define "bjw-s.common.lib.service.getByIdentifier" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - - {{- range $name, $serviceValues := $rootContext.Values.service -}} - {{- if eq $name $identifier -}} - {{- include "bjw-s.common.lib.service.valuesToObject" (dict "rootContext" $rootContext "id" $identifier "values" $serviceValues) -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_getPortNumberByName.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_getPortNumberByName.tpl deleted file mode 100644 index 0b9174702..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_getPortNumberByName.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{/* -Return a service port number by name for a Service object -*/}} -{{- define "bjw-s.common.lib.service.getPortNumberByName" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .serviceID -}} - {{- $portName := .portName -}} - - {{- $service := include "bjw-s.common.lib.service.getByIdentifier" (dict "rootContext" $rootContext "id" $identifier) | fromYaml -}} - - {{- if $service -}} - {{ $servicePort := dig "ports" $portName "port" nil $service -}} - {{- if not (eq $servicePort nil) -}} - {{- $servicePort -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_primaryForController.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_primaryForController.tpl deleted file mode 100644 index ebc07067f..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_primaryForController.tpl +++ /dev/null @@ -1,30 +0,0 @@ -{{/* -Return the primary service object for a controller -*/}} -{{- define "bjw-s.common.lib.service.primaryForController" -}} - {{- $rootContext := .rootContext -}} - {{- $controllerIdentifier := .controllerIdentifier -}} - - {{- $identifier := "" -}} - {{- $result := dict -}} - - {{- /* Loop over all enabled services */ -}} - {{- $enabledServices := (include "bjw-s.common.lib.service.enabledServices" (dict "rootContext" $rootContext) | fromYaml ) }} - {{- if $enabledServices -}} - {{- range $name, $service := $enabledServices -}} - {{- /* Determine the Service that has been marked as primary */ -}} - {{- if and (hasKey $service "primary") $service.primary -}} - {{- $identifier = $name -}} - {{- $result = $service -}} - {{- end -}} - {{- end -}} - - {{- /* Return the first Service if none has been explicitly marked as primary */ -}} - {{- if not $result -}} - {{- $identifier = keys $enabledServices | first -}} - {{- $result = get $enabledServices $identifier -}} - {{- end -}} - - {{- include "bjw-s.common.lib.service.valuesToObject" (dict "rootContext" $rootContext "id" $identifier "values" $result) -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_primary_port.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_primary_port.tpl deleted file mode 100644 index d921be1a7..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_primary_port.tpl +++ /dev/null @@ -1,25 +0,0 @@ -{{/* -Return the primary port for a given Service object. -*/}} -{{- define "bjw-s.common.lib.service.primaryPort" -}} - {{- $rootContext := .rootContext -}} - {{- $serviceObject := .serviceObject -}} - {{- $result := "" -}} - - {{- /* Loop over all enabled ports */ -}} - {{- $enabledPorts := include "bjw-s.common.lib.service.enabledPorts" (dict "rootContext" $rootContext "serviceObject" $serviceObject) | fromYaml }} - {{- range $name, $port := $enabledPorts -}} - {{- /* Determine the port that has been marked as primary */ -}} - {{- if and (hasKey $port "primary") $port.primary -}} - {{- $result = $port -}} - {{- end -}} - {{- end -}} - - {{- /* Return the first port if none has been explicitly marked as primary */ -}} - {{- if not $result -}} - {{- $firstPortKey := keys $enabledPorts | first -}} - {{- $result = get $enabledPorts $firstPortKey -}} - {{- end -}} - - {{- $result | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_validate.tpl deleted file mode 100644 index e9558cea3..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_validate.tpl +++ /dev/null @@ -1,37 +0,0 @@ -{{/* -Validate Service values -*/}} -{{- define "bjw-s.common.lib.service.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $serviceObject := .object -}} - - {{- if empty (get $serviceObject "controller") -}} - {{- fail (printf "controller field is required for Service. (service: %s)" $serviceObject.identifier) -}} - {{- end -}} - - {{- /* Validate Service type */ -}} - {{- $validServiceTypes := (list "ClusterIP" "LoadBalancer" "NodePort" "ExternalName" "ExternalIP") -}} - {{- if and $serviceObject.type (not (mustHas $serviceObject.type $validServiceTypes)) -}} - {{- fail ( - printf "invalid service type \"%s\" for Service with key \"%s\". Allowed values are [%s]" - $serviceObject.type - $serviceObject.identifier - (join ", " $validServiceTypes) - ) -}} - {{- end -}} - - {{- if ne $serviceObject.type "ExternalName" -}} - {{- $enabledPorts := include "bjw-s.common.lib.service.enabledPorts" (dict "rootContext" $rootContext "serviceObject" $serviceObject) | fromYaml }} - {{- /* Validate at least one port is enabled */ -}} - {{- if not $enabledPorts -}} - {{- fail (printf "no ports are enabled for Service with key \"%s\"" $serviceObject.identifier) -}} - {{- end -}} - - {{- range $name, $port := $enabledPorts -}} - {{- /* Validate a port number is configured */ -}} - {{- if not $port.port -}} - {{- fail (printf "no port number is configured for port \"%s\" under Service with key \"%s\"" $name $serviceObject.identifier) -}} - {{- end -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_valuesToObject.tpl deleted file mode 100644 index 2b1417cbe..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/service/_valuesToObject.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Convert Service values to an object -*/}} -{{- define "bjw-s.common.lib.service.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Determine and inject the Service name */ -}} - {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - - {{- if $objectValues.nameOverride -}} - {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} - {{- else -}} - {{- if not $objectValues.primary -}} - {{- $objectName = printf "%s-%s" $objectName $identifier -}} - {{- end -}} - {{- end -}} - {{- $_ := set $objectValues "name" $objectName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Return the Service object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceAccount/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceAccount/_validate.tpl deleted file mode 100644 index 8eeb37461..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceAccount/_validate.tpl +++ /dev/null @@ -1,7 +0,0 @@ -{{/* -Validate ServiceAccount values -*/}} -{{- define "bjw-s.common.lib.serviceAccount.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $serviceAccountValues := .object -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceAccount/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceAccount/_valuesToObject.tpl deleted file mode 100644 index 9451e1018..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceAccount/_valuesToObject.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* -Convert ServiceAccount values to an object -*/}} -{{- define "bjw-s.common.lib.serviceAccount.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Determine and inject the serviceAccount name */ -}} - {{- $serviceAccountName := "" -}} - {{- $defaultServiceAccountName := "default" -}} - {{- if $objectValues.create -}} - {{- $defaultServiceAccountName = (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - {{- end -}} - - {{- $serviceAccountName = default $defaultServiceAccountName $objectValues.name -}} - - {{- $_ := set $objectValues "name" $serviceAccountName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Return the serviceAccount object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceMonitor/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceMonitor/_validate.tpl deleted file mode 100644 index c63527a17..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceMonitor/_validate.tpl +++ /dev/null @@ -1,11 +0,0 @@ -{{/* -Validate serviceMonitor values -*/}} -{{- define "bjw-s.common.lib.serviceMonitor.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $serviceMonitorObject := .object -}} - - {{- if not $serviceMonitorObject.endpoints -}} - {{- fail (printf "endpoints are required for serviceMonitor with key \"%v\"" $serviceMonitorObject.identifier) -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceMonitor/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceMonitor/_valuesToObject.tpl deleted file mode 100644 index febce01da..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/serviceMonitor/_valuesToObject.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* -Convert ServiceMonitor values to an object -*/}} -{{- define "bjw-s.common.lib.serviceMonitor.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- /* Determine and inject the ServiceMonitor name */ -}} - {{- $objectName := (include "bjw-s.common.lib.chart.names.fullname" $rootContext) -}} - - {{- if $objectValues.nameOverride -}} - {{- $objectName = printf "%s-%s" $objectName $objectValues.nameOverride -}} - {{- else -}} - {{- if ne $identifier "main" -}} - {{- $objectName = printf "%s-%s" $objectName $identifier -}} - {{- end -}} - {{- end -}} - {{- $_ := set $objectValues "name" $objectName -}} - {{- $_ := set $objectValues "identifier" $identifier -}} - - {{- /* Return the ServiceMonitor object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_validate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_validate.tpl deleted file mode 100644 index 1bfcac738..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_validate.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* -Validate StatefulSet values -*/}} -{{- define "bjw-s.common.lib.statefulset.validate" -}} - {{- $rootContext := .rootContext -}} - {{- $statefulsetValues := .object -}} - - {{- if and (ne $statefulsetValues.strategy "OnDelete") (ne $statefulsetValues.strategy "RollingUpdate") -}} - {{- fail (printf "Not a valid strategy type for StatefulSet. (controller: %s, strategy: %s)" $statefulsetValues.identifier $statefulsetValues.strategy) -}} - {{- end -}} - - {{- if not (empty (dig "statefulset" "volumeClaimTemplates" "" $statefulsetValues)) -}} - {{- range $index, $volumeClaimTemplate := $statefulsetValues.statefulset.volumeClaimTemplates -}} - {{- if empty (get . "size") -}} - {{- fail (printf "size is required for volumeClaimTemplate. (controller: %s, volumeClaimTemplate: %s)" $statefulsetValues.identifier $volumeClaimTemplate.name) -}} - {{- end -}} - - {{- if empty (get . "accessMode") -}} - {{- fail (printf "accessMode is required for volumeClaimTemplate. (controller: %s, volumeClaimTemplate: %s)" $statefulsetValues.identifier $volumeClaimTemplate.name) -}} - {{- end -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_valuesToObject.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_valuesToObject.tpl deleted file mode 100644 index 687f4ed86..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_valuesToObject.tpl +++ /dev/null @@ -1,14 +0,0 @@ -{{/* -Convert StatefulSet values to an object -*/}} -{{- define "bjw-s.common.lib.statefulset.valuesToObject" -}} - {{- $rootContext := .rootContext -}} - {{- $identifier := .id -}} - {{- $objectValues := .values -}} - - {{- $strategy := default "RollingUpdate" $objectValues.strategy -}} - {{- $_ := set $objectValues "strategy" $strategy -}} - - {{- /* Return the StatefulSet object */ -}} - {{- $objectValues | toYaml -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_volumeClaimTemplates.tpl b/thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_volumeClaimTemplates.tpl deleted file mode 100644 index ab96ae799..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/lib/statefulset/_volumeClaimTemplates.tpl +++ /dev/null @@ -1,51 +0,0 @@ -{{/* -Basic VolumeClaimTemplate template -*/}} -{{- define "bjw-s.common.lib.statefulset.volumeclaimtemplate" -}} - {{- $rootContext := .rootContext -}} - {{- $values := .values -}} - -metadata: - name: {{ $values.name }} - {{- with ($values.labels | default dict) }} - labels: {{- toYaml . | nindent 10 }} - {{- end }} - {{- with ($values.annotations | default dict) }} - annotations: {{- toYaml . | nindent 10 }} - {{- end }} -spec: - accessModes: - - {{ $values.accessMode | quote }} - resources: - requests: - storage: {{ $values.size | quote }} - {{- if $values.storageClass }} - storageClassName: {{ if (eq "-" $values.storageClass) }}""{{- else }}{{ $values.storageClass | quote }}{{- end }} - {{- end }} - {{- with $values.dataSource }} - dataSource: {{- tpl (toYaml .) $rootContext | nindent 10 }} - {{- end }} - {{- with $values.dataSourceRef }} - dataSourceRef: {{- tpl (toYaml .) $rootContext | nindent 10 }} - {{- end }} -{{- end -}} - -{{/* -VolumeClaimTemplates for StatefulSet -*/}} -{{- define "bjw-s.common.lib.statefulset.volumeclaimtemplates" -}} - {{- $rootContext := .rootContext -}} - {{- $statefulsetObject := .statefulsetObject -}} - - {{- /* Default to empty list */ -}} - {{- $volumeClaimTemplates := list -}} - - {{- range $index, $volumeClaimTemplate := (dig "statefulset" "volumeClaimTemplates" list $statefulsetObject) }} - {{- $vct := include "bjw-s.common.lib.statefulset.volumeclaimtemplate" (dict "rootContext" $rootContext "values" $volumeClaimTemplate) -}} - {{- $volumeClaimTemplates = append $volumeClaimTemplates ($vct | fromYaml) -}} - {{- end -}} - - {{- if not (empty $volumeClaimTemplates) -}} - {{ $volumeClaimTemplates | toYaml }} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/loader/_all.tpl b/thunder_deployment/infra/beta9/charts/common/templates/loader/_all.tpl deleted file mode 100644 index f0b700788..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/loader/_all.tpl +++ /dev/null @@ -1,10 +0,0 @@ -{{/* -Main entrypoint for the common library chart. It will render all underlying templates based on the provided values. -*/}} -{{- define "bjw-s.common.loader.all" -}} - {{- /* Generate chart and dependency values */ -}} - {{- include "bjw-s.common.loader.init" . -}} - - {{- /* Generate remaining objects */ -}} - {{- include "bjw-s.common.loader.generate" . -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/loader/_generate.tpl b/thunder_deployment/infra/beta9/charts/common/templates/loader/_generate.tpl deleted file mode 100644 index 43750162a..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/loader/_generate.tpl +++ /dev/null @@ -1,16 +0,0 @@ -{{/* -Secondary entrypoint and primary loader for the common chart -*/}} -{{- define "bjw-s.common.loader.generate" -}} - {{- /* Build the templates */ -}} - {{- include "bjw-s.common.render.pvcs" . | nindent 0 -}} - {{- include "bjw-s.common.render.serviceAccount" . | nindent 0 -}} - {{- include "bjw-s.common.render.controllers" . | nindent 0 -}} - {{- include "bjw-s.common.render.services" . | nindent 0 -}} - {{- include "bjw-s.common.render.ingresses" . | nindent 0 -}} - {{- include "bjw-s.common.render.serviceMonitors" . | nindent 0 -}} - {{- include "bjw-s.common.render.routes" . | nindent 0 -}} - {{- include "bjw-s.common.render.configMaps" . | nindent 0 -}} - {{- include "bjw-s.common.render.secrets" . | nindent 0 -}} - {{- include "bjw-s.common.render.networkpolicies" . | nindent 0 -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/loader/_init.tpl b/thunder_deployment/infra/beta9/charts/common/templates/loader/_init.tpl deleted file mode 100644 index 95f63f62c..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/loader/_init.tpl +++ /dev/null @@ -1,4 +0,0 @@ -{{- define "bjw-s.common.loader.init" -}} - {{- /* Merge the local chart values and the common chart defaults */ -}} - {{- include "bjw-s.common.values.init" . }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_configmaps.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_configmaps.tpl deleted file mode 100644 index 7d69205df..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/render/_configmaps.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{{/* -Renders the configMap objects required by the chart. -*/}} -{{- define "bjw-s.common.render.configMaps" -}} - {{- /* Generate named configMaps as required */ -}} - {{- range $key, $configMap := .Values.configMaps }} - {{- /* Enable configMap by default, but allow override */ -}} - {{- $configMapEnabled := true -}} - {{- if hasKey $configMap "enabled" -}} - {{- $configMapEnabled = $configMap.enabled -}} - {{- end -}} - - {{- if $configMapEnabled -}} - {{- $configMapValues := (mustDeepCopy $configMap) -}} - - {{- /* Create object from the raw configMap values */ -}} - {{- $configMapObject := (include "bjw-s.common.lib.configMap.valuesToObject" (dict "rootContext" $ "id" $key "values" $configMapValues)) | fromYaml -}} - - {{- /* Perform validations on the configMap before rendering */ -}} - {{- include "bjw-s.common.lib.configMap.validate" (dict "rootContext" $ "object" $configMapObject) -}} - - {{/* Include the configMap class */}} - {{- include "bjw-s.common.class.configMap" (dict "rootContext" $ "object" $configMapObject) | nindent 0 -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_controllers.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_controllers.tpl deleted file mode 100644 index 0d58998f4..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/render/_controllers.tpl +++ /dev/null @@ -1,45 +0,0 @@ -{{/* -Renders the controller objects required by the chart. -*/}} -{{- define "bjw-s.common.render.controllers" -}} - {{- /* Generate named controller objects as required */ -}} - {{- range $key, $controller := .Values.controllers -}} - {{- /* Enable controller by default, but allow override */ -}} - {{- $controllerEnabled := true -}} - {{- if hasKey $controller "enabled" -}} - {{- $controllerEnabled = $controller.enabled -}} - {{- end -}} - - {{- if $controllerEnabled -}} - {{- $controllerValues := $controller -}} - - {{- /* Create object from the raw controller values */ -}} - {{- $controllerObject := (include "bjw-s.common.lib.controller.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerValues)) | fromYaml -}} - - {{- /* Perform validations on the controller before rendering */ -}} - {{- include "bjw-s.common.lib.controller.validate" (dict "rootContext" $ "object" $controllerObject) -}} - - {{- if eq $controllerObject.type "deployment" -}} - {{- $deploymentObject := (include "bjw-s.common.lib.deployment.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} - {{- include "bjw-s.common.lib.deployment.validate" (dict "rootContext" $ "object" $deploymentObject) -}} - {{- include "bjw-s.common.class.deployment" (dict "rootContext" $ "object" $deploymentObject) | nindent 0 -}} - {{- else if eq $controllerObject.type "cronjob" -}} - {{- $cronjobObject := (include "bjw-s.common.lib.cronjob.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} - {{- include "bjw-s.common.lib.cronjob.validate" (dict "rootContext" $ "object" $cronjobObject) -}} - {{- include "bjw-s.common.class.cronjob" (dict "rootContext" $ "object" $cronjobObject) | nindent 0 -}} - {{- else if eq $controllerObject.type "daemonset" -}} - {{- $daemonsetObject := (include "bjw-s.common.lib.daemonset.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} - {{- include "bjw-s.common.lib.daemonset.validate" (dict "rootContext" $ "object" $daemonsetObject) -}} - {{- include "bjw-s.common.class.daemonset" (dict "rootContext" $ "object" $daemonsetObject) | nindent 0 -}} - {{- else if eq $controllerObject.type "statefulset" -}} - {{- $statefulsetObject := (include "bjw-s.common.lib.statefulset.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} - {{- include "bjw-s.common.lib.statefulset.validate" (dict "rootContext" $ "object" $statefulsetObject) -}} - {{- include "bjw-s.common.class.statefulset" (dict "rootContext" $ "object" $statefulsetObject) | nindent 0 -}} - {{- else if eq $controllerObject.type "job" -}} - {{- $jobObject := (include "bjw-s.common.lib.job.valuesToObject" (dict "rootContext" $ "id" $key "values" $controllerObject)) | fromYaml -}} - {{- include "bjw-s.common.lib.job.validate" (dict "rootContext" $ "object" $jobObject) -}} - {{- include "bjw-s.common.class.job" (dict "rootContext" $ "object" $jobObject) | nindent 0 -}} - {{- end -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_ingresses.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_ingresses.tpl deleted file mode 100644 index c0cbc24a0..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/render/_ingresses.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{{/* -Renders the Ingress objects required by the chart. -*/}} -{{- define "bjw-s.common.render.ingresses" -}} - {{- /* Generate named Ingresses as required */ -}} - {{- range $key, $ingress := .Values.ingress }} - {{- /* Enable Ingress by default, but allow override */ -}} - {{- $ingressEnabled := true -}} - {{- if hasKey $ingress "enabled" -}} - {{- $ingressEnabled = $ingress.enabled -}} - {{- end -}} - - {{- if $ingressEnabled -}} - {{- $ingressValues := (mustDeepCopy $ingress) -}} - - {{- /* Create object from the raw ingress values */ -}} - {{- $ingressObject := (include "bjw-s.common.lib.ingress.valuesToObject" (dict "rootContext" $ "id" $key "values" $ingressValues)) | fromYaml -}} - - {{- /* Perform validations on the ingress before rendering */ -}} - {{- include "bjw-s.common.lib.ingress.validate" (dict "rootContext" $ "object" $ingressObject) -}} - - {{/* Include the ingress class */}} - {{- include "bjw-s.common.class.ingress" (dict "rootContext" $ "object" $ingressObject) | nindent 0 -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_networkpolicies.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_networkpolicies.tpl deleted file mode 100644 index d35a591ba..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/render/_networkpolicies.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{{/* -Renders the networkPolicy objects required by the chart. -*/}} -{{- define "bjw-s.common.render.networkpolicies" -}} - {{- /* Generate named networkPolicy as required */ -}} - {{- range $key, $networkPolicy := .Values.networkpolicies }} - {{- /* Enable networkPolicy by default, but allow override */ -}} - {{- $networkPolicyEnabled := true -}} - {{- if hasKey $networkPolicy "enabled" -}} - {{- $networkPolicyEnabled = $networkPolicy.enabled -}} - {{- end -}} - - {{- if $networkPolicyEnabled -}} - {{- $networkPolicyValues := (mustDeepCopy $networkPolicy) -}} - - {{- /* Create object from the raw networkPolicy values */ -}} - {{- $networkPolicyObject := (include "bjw-s.common.lib.networkpolicy.valuesToObject" (dict "rootContext" $ "id" $key "values" $networkPolicyValues)) | fromYaml -}} - - {{- /* Perform validations on the networkPolicy before rendering */ -}} - {{- include "bjw-s.common.lib.networkpolicy.validate" (dict "rootContext" $ "object" $networkPolicyObject) -}} - - {{/* Include the networkPolicy class */}} - {{- include "bjw-s.common.class.networkpolicy" (dict "rootContext" $ "object" $networkPolicyObject) | nindent 0 -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_pvcs.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_pvcs.tpl deleted file mode 100644 index 98d7df5e3..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/render/_pvcs.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{{/* -Renders the Persistent Volume Claim objects required by the chart. -*/}} -{{- define "bjw-s.common.render.pvcs" -}} - {{- /* Generate pvc as required */ -}} - {{- range $key, $pvc := .Values.persistence -}} - {{- /* Enable PVC by default, but allow override */ -}} - {{- $pvcEnabled := true -}} - {{- if hasKey $pvc "enabled" -}} - {{- $pvcEnabled = $pvc.enabled -}} - {{- end -}} - - {{- if and $pvcEnabled (eq (default "persistentVolumeClaim" $pvc.type) "persistentVolumeClaim") (not $pvc.existingClaim) -}} - {{- $pvcValues := (mustDeepCopy $pvc) -}} - - {{- /* Create object from the raw PVC values */ -}} - {{- $pvcObject := (include "bjw-s.common.lib.pvc.valuesToObject" (dict "rootContext" $ "id" $key "values" $pvcValues)) | fromYaml -}} - - {{- /* Perform validations on the PVC before rendering */ -}} - {{- include "bjw-s.common.lib.pvc.validate" (dict "rootContext" $ "object" $pvcValues) -}} - - {{- /* Include the PVC class */ -}} - {{- include "bjw-s.common.class.pvc" (dict "rootContext" $ "object" $pvcValues) | nindent 0 -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_routes.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_routes.tpl deleted file mode 100644 index 12e89caac..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/render/_routes.tpl +++ /dev/null @@ -1,24 +0,0 @@ -{{/* Renders the Route objects required by the chart */}} -{{- define "bjw-s.common.render.routes" -}} - {{- /* Generate named routes as required */ -}} - {{- range $key, $route := .Values.route }} - {{- /* Enable Route by default, but allow override */ -}} - {{- $routeEnabled := true -}} - {{- if hasKey $route "enabled" -}} - {{- $routeEnabled = $route.enabled -}} - {{- end -}} - - {{- if $routeEnabled -}} - {{- $routeValues := (mustDeepCopy $route) -}} - - {{- /* Create object from the raw Route values */ -}} - {{- $routeObject := (include "bjw-s.common.lib.route.valuesToObject" (dict "rootContext" $ "id" $key "values" $routeValues)) | fromYaml -}} - - {{- /* Perform validations on the Route before rendering */ -}} - {{- include "bjw-s.common.lib.route.validate" (dict "rootContext" $ "object" $routeObject) -}} - - {{- /* Include the Route class */ -}} - {{- include "bjw-s.common.class.route" (dict "rootContext" $ "object" $routeObject) | nindent 0 -}} - {{- end }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_secrets.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_secrets.tpl deleted file mode 100644 index feaaed2db..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/render/_secrets.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{{/* -Renders the Secret objects required by the chart. -*/}} -{{- define "bjw-s.common.render.secrets" -}} - {{- /* Generate named Secrets as required */ -}} - {{- range $key, $secret := .Values.secrets }} - {{- /* Enable Secret by default, but allow override */ -}} - {{- $secretEnabled := true -}} - {{- if hasKey $secret "enabled" -}} - {{- $secretEnabled = $secret.enabled -}} - {{- end -}} - - {{- if $secretEnabled -}} - {{- $secretValues := (mustDeepCopy $secret) -}} - - {{- /* Create object from the raw Secret values */ -}} - {{- $secretObject := (include "bjw-s.common.lib.secret.valuesToObject" (dict "rootContext" $ "id" $key "values" $secretValues)) | fromYaml -}} - - {{- /* Perform validations on the Secret before rendering */ -}} - {{- include "bjw-s.common.lib.secret.validate" (dict "rootContext" $ "object" $secretObject) -}} - - {{/* Include the Secret class */}} - {{- include "bjw-s.common.class.secret" (dict "rootContext" $ "object" $secretObject) | nindent 0 -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_serviceMonitors.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_serviceMonitors.tpl deleted file mode 100644 index ab8c1ff24..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/render/_serviceMonitors.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{{/* -Renders the serviceMonitor objects required by the chart. -*/}} -{{- define "bjw-s.common.render.serviceMonitors" -}} - {{- /* Generate named serviceMonitors as required */ -}} - {{- range $key, $serviceMonitor := .Values.serviceMonitor -}} - {{- /* Enable ServiceMonitor by default, but allow override */ -}} - {{- $serviceMonitorEnabled := true -}} - {{- if hasKey $serviceMonitor "enabled" -}} - {{- $serviceMonitorEnabled = $serviceMonitor.enabled -}} - {{- end -}} - - {{- if $serviceMonitorEnabled -}} - {{- $serviceMonitorValues := (mustDeepCopy $serviceMonitor) -}} - - {{- /* Create object from the raw ServiceMonitor values */ -}} - {{- $serviceMonitorObject := (include "bjw-s.common.lib.serviceMonitor.valuesToObject" (dict "rootContext" $ "id" $key "values" $serviceMonitorValues)) | fromYaml -}} - - {{- /* Perform validations on the serviceMonitor before rendering */ -}} - {{- include "bjw-s.common.lib.serviceMonitor.validate" (dict "rootContext" $ "object" $serviceMonitorObject) -}} - - {{/* Include the serviceMonitor class */}} - {{- include "bjw-s.common.class.serviceMonitor" (dict "rootContext" $ "object" $serviceMonitorObject) | nindent 0 -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_serviceaccount.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_serviceaccount.tpl deleted file mode 100644 index ad6f49a65..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/render/_serviceaccount.tpl +++ /dev/null @@ -1,20 +0,0 @@ -{{/* -Renders the serviceAccount object required by the chart. -*/}} -{{- define "bjw-s.common.render.serviceAccount" -}} - {{- if .Values.serviceAccount.create -}} - {{- $serviceAccountValues := (mustDeepCopy .Values.serviceAccount) -}} - - {{- /* Create object from the raw ServiceAccount values */ -}} - {{- $serviceAccountObject := (include "bjw-s.common.lib.serviceAccount.valuesToObject" (dict "rootContext" $ "id" "default" "values" $serviceAccountValues)) | fromYaml -}} - - {{- /* Perform validations on the ServiceAccount before rendering */ -}} - {{- include "bjw-s.common.lib.serviceAccount.validate" (dict "rootContext" $ "object" $serviceAccountObject) -}} - - {{/* Include the serviceAccount class */}} - {{- include "bjw-s.common.class.serviceAccount" (dict "rootContext" $ "object" $serviceAccountObject) | nindent 0 -}} - - {{- /* Create a service account secret */ -}} - {{- $_ := set .Values.secrets "sa-token" (dict "enabled" true "annotations" (dict "kubernetes.io/service-account.name" $serviceAccountObject.name) "type" "kubernetes.io/service-account-token") -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/render/_services.tpl b/thunder_deployment/infra/beta9/charts/common/templates/render/_services.tpl deleted file mode 100644 index cf6f6ee8b..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/render/_services.tpl +++ /dev/null @@ -1,19 +0,0 @@ -{{/* -Renders the Service objects required by the chart. -*/}} -{{- define "bjw-s.common.render.services" -}} - {{- /* Generate named Services as required */ -}} - {{- $enabledServices := (include "bjw-s.common.lib.service.enabledServices" (dict "rootContext" $) | fromYaml ) -}} - {{- range $key, $svc := $enabledServices -}} - {{- $serviceValues := (mustDeepCopy $svc) -}} - - {{- /* Create object from the raw Service values */ -}} - {{- $serviceObject := (include "bjw-s.common.lib.service.valuesToObject" (dict "rootContext" $ "id" $key "values" $serviceValues)) | fromYaml -}} - - {{- /* Perform validations on the Service before rendering */ -}} - {{- include "bjw-s.common.lib.service.validate" (dict "rootContext" $ "object" $serviceObject) -}} - - {{- /* Include the Service class */ -}} - {{- include "bjw-s.common.class.service" (dict "rootContext" $ "object" $serviceObject) | nindent 0 -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/templates/values/_init.tpl b/thunder_deployment/infra/beta9/charts/common/templates/values/_init.tpl deleted file mode 100644 index e9a7af8f1..000000000 --- a/thunder_deployment/infra/beta9/charts/common/templates/values/_init.tpl +++ /dev/null @@ -1,11 +0,0 @@ -{{/* -Merge the local chart values and the common chart defaults -*/}} -{{- define "bjw-s.common.values.init" -}} - {{- if .Values.common -}} - {{- $defaultValues := deepCopy .Values.common -}} - {{- $userValues := deepCopy (omit .Values "common") -}} - {{- $mergedValues := mustMergeOverwrite $defaultValues $userValues -}} - {{- $_ := set . "Values" (deepCopy $mergedValues) -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/common/values.yaml b/thunder_deployment/infra/beta9/charts/common/values.yaml deleted file mode 100644 index 30b1bd135..000000000 --- a/thunder_deployment/infra/beta9/charts/common/values.yaml +++ /dev/null @@ -1,740 +0,0 @@ ---- -global: - # -- Set an override for the prefix of the fullname - nameOverride: - # -- Set the entire name definition - fullnameOverride: - # -- Set additional global labels. Helm templates can be used. - labels: {} - # -- Set additional global annotations. Helm templates can be used. - annotations: {} - -# -- Set default options for all controllers / pods here -# Each of these options can be overridden on a Controller level -defaultPodOptions: - # -- Defines affinity constraint rules. - # [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity) - affinity: {} - - # -- Set annotations on the Pod. Pod-specific values will be merged with this. - annotations: {} - - # -- Specifies whether a service account token should be automatically mounted. - automountServiceAccountToken: true - - # -- Configuring the ndots option may resolve nslookup issues on some Kubernetes setups. - dnsConfig: - {} - # options: - # - name: ndots - # value: "1" - - # -- Defaults to "ClusterFirst" if hostNetwork is false - # and "ClusterFirstWithHostNet" if hostNetwork is true. - dnsPolicy: # ClusterFirst - - # -- Enable/disable the generation of environment variables for services. - # [[ref]](https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#accessing-the-service) - enableServiceLinks: true - - # -- Allows specifying explicit hostname setting - hostname: - - # -- Use hostAliases to add custom entries to /etc/hosts - mapping IP addresses to hostnames. - # [[ref]](https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/) - hostAliases: [] - # - ip: "192.168.1.100" - # hostnames: - # - "example.com" - # - "www.example.com" - - # -- Use the host's ipc namespace - hostIPC: false - - # -- When using hostNetwork make sure you set dnsPolicy to `ClusterFirstWithHostNet` - hostNetwork: false - - # -- Use the host's pid namespace - hostPID: false - - # -- Set image pull secrets - imagePullSecrets: [] - - # -- Set labels on the Pod. Pod-specific values will be merged with this. - labels: {} - - # -- Node selection constraint - # [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector) - nodeSelector: {} - - # -- Custom priority class for different treatment by the scheduler - priorityClassName: # system-node-critical - - # -- Set Container restart policy. - # @default -- `Always`. When `controller.type` is `cronjob` it defaults to `Never`. - restartPolicy: - - # -- Allow specifying a runtimeClassName other than the default one (ie: nvidia) - runtimeClassName: # nvidia - - # -- Allows specifying a custom scheduler name - schedulerName: # awkward-dangerous-scheduler - - # -- Configure the Security Context for the Pod - securityContext: {} - - # -- Duration in seconds the pod needs to terminate gracefully - # -- [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle)] - terminationGracePeriodSeconds: - - # -- Specify taint tolerations - # [[ref]](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) - tolerations: [] - - # -- Defines topologySpreadConstraint rules. - # [[ref]](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) - topologySpreadConstraints: [] - # - maxSkew: - # topologyKey: - # whenUnsatisfiable: - # labelSelector: - -controllers: - main: - # -- enable the controller. - enabled: true - - # -- Set the controller type. - # Valid options are deployment, daemonset, statefulset, cronjob or job - type: deployment - # -- Set annotations on the deployment/statefulset/daemonset/cronjob/job - annotations: {} - # -- Set labels on the deployment/statefulset/daemonset/cronjob/job - labels: {} - # -- Number of desired pods. When using a HorizontalPodAutoscaler, set this to `null`. - replicas: 1 - # -- Set the controller upgrade strategy - # For Deployments, valid values are Recreate (default) and RollingUpdate. - # For StatefulSets, valid values are OnDelete and RollingUpdate (default). - # DaemonSets/CronJobs/Jobs ignore this. - strategy: - - rollingUpdate: - # -- Set deployment RollingUpdate max unavailable - unavailable: - # -- Set deployment RollingUpdate max surge - surge: - # -- Set statefulset RollingUpdate partition - partition: - # -- ReplicaSet revision history limit - revisionHistoryLimit: 3 - - # -- CronJob configuration. Required only when using `controller.type: cronjob`. - # @default -- See below - cronjob: - # -- Suspends the CronJob - # [[ref]](https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#schedule-suspension) - # @default -- false - suspend: - # -- Specifies how to treat concurrent executions of a job that is created by this cron job - # valid values are Allow, Forbid or Replace - concurrencyPolicy: Forbid - # -- Sets the CronJob timezone (only works in Kubernetes >= 1.27) - timeZone: - # -- Sets the CronJob time when to execute your jobs - schedule: "*/20 * * * *" - # -- The deadline in seconds for starting the job if it misses its scheduled time for any reason - startingDeadlineSeconds: 30 - # -- The number of succesful Jobs to keep - successfulJobsHistory: 1 - # -- The number of failed Jobs to keep - failedJobsHistory: 1 - # -- If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to - # be automatically deleted. - ttlSecondsAfterFinished: - # -- Limits the number of times a failed job will be retried - backoffLimit: 6 - - # -- Job configuration. Required only when using `controller.type: job`. - # @default -- See below - job: - # -- Suspends the Job - # [[ref]](https://kubernetes.io/docs/concepts/workloads/controllers/job/#suspending-a-job) - # @default -- false - suspend: - # -- If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to - # be automatically deleted. - ttlSecondsAfterFinished: - # -- Limits the number of times a failed job will be retried - backoffLimit: 6 - - # -- StatefulSet configuration. Required only when using `controller.type: statefulset`. - statefulset: - # -- Set podManagementPolicy, valid values are Parallel and OrderedReady (default). - podManagementPolicy: - - # -- Used to create individual disks for each instance. - volumeClaimTemplates: [] - # - name: data - # labels: {} - # annotations: {} - # globalMounts: - # - path: /data - # accessMode: "ReadWriteOnce" - # dataSourceRef: - # apiGroup: snapshot.storage.k8s.io - # kind: VolumeSnapshot - # name: MySnapshot - # size: 1Gi - # - name: backup - # labels: {} - # annotations: {} - # globalMounts: - # - path: /backup - # subPath: theSubPath - # accessMode: "ReadWriteOnce" - # size: 2Gi - # storageClass: cheap-storage-class - - # Controller-specific overrides for `defaultPodOptions` keys - pod: {} - - containers: - main: - # -- Override the container name - nameOverride: - - # -- Override the default container order - # Containers get sorted alphanumerically by the `-` combination. - # @default -- 99 - order: 1 - - # -- Specify if this container depends on any other containers - # This is used to determine the order in which the containers are rendered. - # The use of "dependsOn" completely disables the "order" field within the controller. - dependsOn: [] - - image: - # -- image repository - repository: - # -- image tag - tag: - # -- image pull policy - pullPolicy: - - # -- Override the command(s) for the default container - command: [] - # -- Override the args for the default container - args: [] - # -- Override the working directory for the default container - workingDir: - - # -- Environment variables. Template enabled. - # Syntax options: - # A) TZ: UTC - # B) PASSWD: '{{ .Release.Name }}' - # B) TZ: - # value: UTC - # dependsOn: otherVar - # D) PASSWD: - # configMapKeyRef: - # name: config-map-name - # key: key-name - # E) PASSWD: - # dependsOn: - # - otherVar1 - # - otherVar2 - # valueFrom: - # secretKeyRef: - # name: secret-name - # key: key-name - # ... - # F) - name: TZ - # value: UTC - # G) - name: TZ - # value: '{{ .Release.Name }}' - env: - - # -- Secrets and/or ConfigMaps that will be loaded as environment variables. - # Syntax options: - # A) Pass an app-template configMap identifier: - # - config: config - # B) Pass any configMap name that is not also an identifier (Template enabled): - # - config: random-configmap-name - # C) Pass an app-template configMap identifier, explicit syntax: - # - configMapRef: - # identifier: config - # D) Pass any configMap name, explicit syntax (Template enabled): - # - configMapRef: - # name: "{{ .Release.Name }}-config" - # E) Pass an app-template secret identifier: - # - secret: secret - # F) Pass any secret name that is not also an identifier (Template enabled): - # - secret: random-secret-name - # G) Pass an app-template secret identifier, explicit syntax: - # - secretRef: - # identifier: secret - # H) Pass any secret name, explicit syntax (Template enabled): - # - secretRef: - # name: "{{ .Release.Name }}-secret" - envFrom: [] - - # -- Probe configuration - # -- [[ref]](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) - # @default -- See below - probes: - # -- Liveness probe configuration - # @default -- See below - liveness: - # -- Enable the liveness probe - enabled: true - # -- Set this to `true` if you wish to specify your own livenessProbe - custom: false - # -- sets the probe type when not using a custom probe - # @default -- "TCP" - type: TCP - # -- The spec field contains the values for the default livenessProbe. - # If you selected `custom: true`, this field holds the definition of the livenessProbe. - # @default -- See below - spec: - initialDelaySeconds: 0 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - - # -- Redainess probe configuration - # @default -- See below - readiness: - # -- Enable the readiness probe - enabled: true - # -- Set this to `true` if you wish to specify your own readinessProbe - custom: false - # -- sets the probe type when not using a custom probe - # @default -- "TCP" - type: TCP - # -- The spec field contains the values for the default readinessProbe. - # If you selected `custom: true`, this field holds the definition of the readinessProbe. - # @default -- See below - spec: - initialDelaySeconds: 0 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - - # -- Startup probe configuration - # @default -- See below - startup: - # -- Enable the startup probe - enabled: true - # -- Set this to `true` if you wish to specify your own startupProbe - custom: false - # -- sets the probe type when not using a custom probe - # @default -- "TCP" - type: TCP - # -- The spec field contains the values for the default startupProbe. - # If you selected `custom: true`, this field holds the definition of the startupProbe. - # @default -- See below - spec: - initialDelaySeconds: 0 - timeoutSeconds: 1 - ## This means it has a maximum of 5*30=150 seconds to start up before it fails - periodSeconds: 5 - failureThreshold: 30 - - # -- Set the resource requests / limits for the container. - resources: - {} - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - # limits: - # cpu: 100m - # memory: 128Mi - # requests: - # cpu: 100m - # memory: 128Mi - - # -- Configure the Security Context for the container - securityContext: {} - - # -- Configure the lifecycle event hooks for the container - # -- [[ref](https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/)] - lifecycle: {} - - # -- Configure the path at which the file to which the containers termination message will be written. - # -- [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle-1)] - terminationMessagePath: - - # -- Indicate how the containers termination message should be populated. - # Valid options are `File` and `FallbackToLogsOnError`. - # -- [[ref](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle-1)] - terminationMessagePolicy: - - # -- Specify any initContainers here as dictionary items. - # Each initContainer should have its own key - # initContainers get sorted alphanumerically by the `-` combination - # if no order or dependsOn has been configured for them. - initContainers: {} - -serviceAccount: - # -- Specifies whether a service account should be created - create: false - - # -- Annotations to add to the service account - annotations: {} - - # -- Labels to add to the service account - labels: {} - - # -- The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: "" - -# -- Use this to populate secrets with the values you specify. -# Be aware that these values are not encrypted by default, and could therefore visible -# to anybody with access to the values.yaml file. -# Additional Secrets can be added by adding a dictionary key similar to the 'secret' object. -# @default -- See below -secrets: - secret: - # -- Enables or disables the Secret - enabled: false - # -- Labels to add to the Secret - labels: {} - # -- Annotations to add to the Secret - annotations: {} - # -- Secret stringData content. Helm template enabled. - stringData: - {} - # foo: bar - -# -- Configure configMaps for the chart here. -# Additional configMaps can be added by adding a dictionary key similar to the 'config' object. -# @default -- See below -configMaps: - config: - # -- Enables or disables the configMap - enabled: false - # -- Labels to add to the configMap - labels: {} - # -- Annotations to add to the configMap - annotations: {} - # -- configMap data content. Helm template enabled. - data: - {} - # foo: bar - -# -- Configure the services for the chart here. -# Additional services can be added by adding a dictionary key similar to the 'main' service. -# @default -- See below -service: - main: - # -- Enables or disables the service - enabled: true - - # -- Override the name suffix that is used for this service - nameOverride: - - # -- Configure which controller this service should target - controller: main - - # -- Make this the primary service for this controller (used in probes, notes, etc...). - # If there is more than 1 service targeting the controller, make sure that only 1 service is - # marked as primary. - primary: true - - # -- Set the service type - type: ClusterIP - - # -- Specify the externalTrafficPolicy for the service. Options: Cluster, Local - # -- [[ref](https://kubernetes.io/docs/tutorials/services/source-ip/)] - externalTrafficPolicy: - - # -- Specify the ip policy. Options: SingleStack, PreferDualStack, RequireDualStack - ipFamilyPolicy: - # -- The ip families that should be used. Options: IPv4, IPv6 - ipFamilies: [] - - # -- Provide additional annotations which may be required. - annotations: {} - - # -- Provide additional labels which may be required. - labels: {} - - # -- Allow adding additional match labels - extraSelectorLabels: {} - - # -- Configure the Service port information here. - # Additional ports can be added by adding a dictionary key similar to the 'http' service. - # @default -- See below - ports: - http: - # -- Enables or disables the port - enabled: true - - # -- Make this the primary port (used in probes, notes, etc...) - # If there is more than 1 service, make sure that only 1 port is marked as primary. - primary: true - - # -- The port number - port: - - # -- Port protocol. - # Support values are `HTTP`, `HTTPS`, `TCP` and `UDP`. - # HTTP and HTTPS spawn a TCP service and get used for internal URL and name generation - protocol: HTTP - - # -- Specify a service targetPort if you wish to differ the service port from the application port. - # If `targetPort` is specified, this port number is used in the container definition instead of - # the `port` value. Therefore named ports are not supported for this field. - targetPort: - - # -- Specify the nodePort value for the LoadBalancer and NodePort service types. - # [[ref]](https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport) - nodePort: - - # -- Specify the appProtocol value for the Service. - # [[ref]](https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol) - appProtocol: - -# -- Configure the ServiceMonitors for the chart here. -# Additional ServiceMonitors can be added by adding a dictionary key similar to the 'main' ServiceMonitors. -# @default -- See below -serviceMonitor: - main: - # -- Enables or disables the serviceMonitor. - enabled: false - - # -- Override the name suffix that is used for this serviceMonitor. - nameOverride: - - # -- Provide additional annotations which may be required. - annotations: {} - - # -- Provide additional labels which may be required. - labels: {} - - # -- Configures a custom selector for the serviceMonitor, this takes precedence over - # specifying a service name. - # Helm templates can be used. - selector: {} - - # -- Configures the target Service for the serviceMonitor. Helm templates can be used. - serviceName: '{{ include "bjw-s.common.lib.chart.names.fullname" $ }}' - - # -- Configures the endpoints for the serviceMonitor. - # @default -- See values.yaml - endpoints: - - port: http - scheme: http - path: /metrics - interval: 1m - scrapeTimeout: 10s - - # -- Configures custom targetLabels for the serviceMonitor. (All collected - # meterics will have these labels, taking the value from the target service) - # [[ref]](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#servicemonitorspec/) - targetLabels: [] - -# -- Configure the ingresses for the chart here. -# Additional ingresses can be added by adding a dictionary key similar to the 'main' ingress. -# @default -- See below -ingress: - main: - # -- Enables or disables the ingress - enabled: false - - # -- Make this the primary ingress (used in probes, notes, etc...). - # If there is more than 1 ingress, make sure that only 1 ingress is marked as primary. - primary: true - - # -- Override the name suffix that is used for this ingress. - nameOverride: - - # -- Provide additional annotations which may be required. - annotations: - {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - - # -- Provide additional labels which may be required. - labels: {} - - # -- Set the ingressClass that is used for this ingress. - className: # "nginx" - - # -- Configure the defaultBackend for this ingress. This will disable any other rules for the ingress. - defaultBackend: - - ## Configure the hosts for the ingress - hosts: - - # -- Host address. Helm template can be passed. - host: chart-example.local - ## Configure the paths for the host - paths: - - # -- Path. Helm template can be passed. - path: / - pathType: Prefix - service: - # -- Overrides the service name reference for this path - # This can be an actual service name, or reference a service identifier - # from this values.yaml - name: main - # -- Overrides the service port number reference for this path - port: - - # -- Configure TLS for the ingress. Both secretName and hosts can process a Helm template. - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - -# -- Configure the gateway routes for the chart here. -# Additional routes can be added by adding a dictionary key similar to the 'main' route. -# [[ref]](https://gateway-api.sigs.k8s.io/references/spec/) -# @default -- See below -route: - main: - # -- Enables or disables the route - enabled: false - - # -- Set the route kind - # Valid options are GRPCRoute, HTTPRoute, TCPRoute, TLSRoute, UDPRoute - kind: HTTPRoute - - # -- Override the name suffix that is used for this route. - nameOverride: - - # -- Provide additional annotations which may be required. - annotations: {} - - # -- Provide additional labels which may be required. - labels: {} - - # -- Configure the resource the route attaches to. - parentRefs: - - # Group of the referent resource. - group: gateway.networking.k8s.io - # Kind of the referent resource. - kind: Gateway - # Name of the referent resource - name: - # Namespace of the referent resource - namespace: - # Name of the section within the target resource. - sectionName: - - # -- Host addresses. Helm template can be passed. - hostnames: [] - - # -- Configure rules for routing. Defaults to the primary service. - rules: - - # -- Configure backends where matching requests should be sent. - backendRefs: [] - ## Configure conditions used for matching incoming requests. Only for HTTPRoutes - matches: - - path: - type: PathPrefix - value: / - ## Request filters that are applied to the rules. - filters: [] - ## Request timeout that are applied to the rules. - timeouts: {} - -# -- Configure persistence for the chart here. -# Additional items can be added by adding a dictionary key similar to the 'config' key. -# [[ref]](https://bjw-s.github.io/helm-charts/docs/common-library/common-library-storage) -# @default -- See below -persistence: - config: - # -- Enables or disables the persistence item. Defaults to true - enabled: false - - # -- Sets the persistence type - # Valid options are persistentVolumeClaim, emptyDir, nfs, hostPath, secret, configMap or custom - type: persistentVolumeClaim - - # -- Storage Class for the config volume. - # If set to `-`, dynamic provisioning is disabled. - # If set to something else, the given storageClass is used. - # If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. - storageClass: # "-" - - # -- If you want to reuse an existing claim, the name of the existing PVC can be passed here. - existingClaim: # your-claim - - # -- The optional data source for the persistentVolumeClaim. - # [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-populators-and-data-sources) - dataSource: {} - - # -- The optional volume populator for the persistentVolumeClaim. - # [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-populators-and-data-sources) - dataSourceRef: {} - - # -- AccessMode for the persistent volume. - # Make sure to select an access mode that is supported by your storage provider! - # [[ref]](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes) - accessMode: ReadWriteOnce - - # -- The amount of storage that is requested for the persistent volume. - size: 1Gi - - # -- Set to true to retain the PVC upon `helm uninstall` - retain: false - - # -- Configure mounts to all controllers and containers. By default the persistence item - # will be mounted to `/`. - # Example: - # globalMounts: - # - path: /config - # readOnly: false - globalMounts: [] - - # -- Explicitly configure mounts for specific controllers and containers. - # Example: - # advancedMounts: - # main: # the controller with the "main" identifier - # main: # the container with the "main" identifier - # - path: /data/config.yaml - # readOnly: true - # mountPropagation: None - # subPath: config.yaml - # second-container: # the container with the "second-container" identifier - # - path: /appdata/config - # readOnly: true - # second-controller: # the controller with the "second-controller" identifier - # main: # the container with the "main" identifier - # - path: /data/config.yaml - # readOnly: false - # subPath: config.yaml - advancedMounts: {} - -# -- Configure the networkPolicies for the chart here. -# Additional networkPolicies can be added by adding a dictionary key similar to the 'main' networkPolicy. -# @default -- See below -networkpolicies: - main: - # -- Enables or disables the networkPolicy item. Defaults to true - enabled: false - - # -- Configure which controller this networkPolicy should target - controller: main - - # -- Define a custom podSelector for the networkPolicy. This takes precedence over targeting a controller. - # podSelector: {} - - # -- The policyTypes for this networkPolicy - policyTypes: - - Ingress - - Egress - - # -- The rulesets for this networkPolicy - # [[ref]](https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource) - rules: - # -- The ingress rules for this networkPolicy. Allows all ingress traffic by default. - ingress: - - {} - # -- The egress rules for this networkPolicy. Allows all egress traffic by default. - egress: - - {} diff --git a/thunder_deployment/infra/beta9/charts/grafana/.helmignore b/thunder_deployment/infra/beta9/charts/grafana/.helmignore deleted file mode 100644 index 8cade1318..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.vscode -.project -.idea/ -*.tmproj -OWNERS diff --git a/thunder_deployment/infra/beta9/charts/grafana/Chart.yaml b/thunder_deployment/infra/beta9/charts/grafana/Chart.yaml deleted file mode 100644 index 5398b764d..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/Chart.yaml +++ /dev/null @@ -1,33 +0,0 @@ -annotations: - artifacthub.io/license: Apache-2.0 - artifacthub.io/links: | - - name: Chart Source - url: https://github.com/grafana/helm-charts - - name: Upstream Project - url: https://github.com/grafana/grafana -apiVersion: v2 -appVersion: 10.3.1 -description: The leading tool for querying and visualizing time series and metrics. -home: https://grafana.com -icon: https://artifacthub.io/image/b4fed1a7-6c8f-4945-b99d-096efa3e4116 -keywords: -- monitoring -- metric -kubeVersion: ^1.8.0-0 -maintainers: -- email: zanhsieh@gmail.com - name: zanhsieh -- email: rluckie@cisco.com - name: rtluckie -- email: maor.friedman@redhat.com - name: maorfr -- email: miroslav.hadzhiev@gmail.com - name: Xtigyro -- email: mail@torstenwalter.de - name: torstenwalter -name: grafana -sources: -- https://github.com/grafana/grafana -- https://github.com/grafana/helm-charts -type: application -version: 7.3.0 diff --git a/thunder_deployment/infra/beta9/charts/grafana/README.md b/thunder_deployment/infra/beta9/charts/grafana/README.md deleted file mode 100644 index 6f645c564..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/README.md +++ /dev/null @@ -1,769 +0,0 @@ -# Grafana Helm Chart - -* Installs the web dashboarding system [Grafana](http://grafana.org/) - -## Get Repo Info - -```console -helm repo add grafana https://grafana.github.io/helm-charts -helm repo update -``` - -_See [helm repo](https://helm.sh/docs/helm/helm_repo/) for command documentation._ - -## Installing the Chart - -To install the chart with the release name `my-release`: - -```console -helm install my-release grafana/grafana -``` - -## Uninstalling the Chart - -To uninstall/delete the my-release deployment: - -```console -helm delete my-release -``` - -The command removes all the Kubernetes components associated with the chart and deletes the release. - -## Upgrading an existing Release to a new major version - -A major chart version change (like v1.2.3 -> v2.0.0) indicates that there is an -incompatible breaking change needing manual actions. - -### To 4.0.0 (And 3.12.1) - -This version requires Helm >= 2.12.0. - -### To 5.0.0 - -You have to add --force to your helm upgrade command as the labels of the chart have changed. - -### To 6.0.0 - -This version requires Helm >= 3.1.0. - -### To 7.0.0 - -For consistency with other Helm charts, the `global.image.registry` parameter was renamed -to `global.imageRegistry`. If you were not previously setting `global.image.registry`, no action -is required on upgrade. If you were previously setting `global.image.registry`, you will -need to instead set `global.imageRegistry`. - -## Configuration - -| Parameter | Description | Default | -|-------------------------------------------|-----------------------------------------------|---------------------------------------------------------| -| `replicas` | Number of nodes | `1` | -| `podDisruptionBudget.minAvailable` | Pod disruption minimum available | `nil` | -| `podDisruptionBudget.maxUnavailable` | Pod disruption maximum unavailable | `nil` | -| `podDisruptionBudget.apiVersion` | Pod disruption apiVersion | `nil` | -| `deploymentStrategy` | Deployment strategy | `{ "type": "RollingUpdate" }` | -| `livenessProbe` | Liveness Probe settings | `{ "httpGet": { "path": "/api/health", "port": 3000 } "initialDelaySeconds": 60, "timeoutSeconds": 30, "failureThreshold": 10 }` | -| `readinessProbe` | Readiness Probe settings | `{ "httpGet": { "path": "/api/health", "port": 3000 } }`| -| `securityContext` | Deployment securityContext | `{"runAsUser": 472, "runAsGroup": 472, "fsGroup": 472}` | -| `priorityClassName` | Name of Priority Class to assign pods | `nil` | -| `image.registry` | Image registry | `docker.io` | -| `image.repository` | Image repository | `grafana/grafana` | -| `image.tag` | Overrides the Grafana image tag whose default is the chart appVersion (`Must be >= 5.0.0`) | `` | -| `image.sha` | Image sha (optional) | `` | -| `image.pullPolicy` | Image pull policy | `IfNotPresent` | -| `image.pullSecrets` | Image pull secrets (can be templated) | `[]` | -| `service.enabled` | Enable grafana service | `true` | -| `service.type` | Kubernetes service type | `ClusterIP` | -| `service.port` | Kubernetes port where service is exposed | `80` | -| `service.portName` | Name of the port on the service | `service` | -| `service.appProtocol` | Adds the appProtocol field to the service | `` | -| `service.targetPort` | Internal service is port | `3000` | -| `service.nodePort` | Kubernetes service nodePort | `nil` | -| `service.annotations` | Service annotations (can be templated) | `{}` | -| `service.labels` | Custom labels | `{}` | -| `service.clusterIP` | internal cluster service IP | `nil` | -| `service.loadBalancerIP` | IP address to assign to load balancer (if supported) | `nil` | -| `service.loadBalancerSourceRanges` | list of IP CIDRs allowed access to lb (if supported) | `[]` | -| `service.externalIPs` | service external IP addresses | `[]` | -| `service.externalTrafficPolicy` | change the default externalTrafficPolicy | `nil` | -| `headlessService` | Create a headless service | `false` | -| `extraExposePorts` | Additional service ports for sidecar containers| `[]` | -| `hostAliases` | adds rules to the pod's /etc/hosts | `[]` | -| `ingress.enabled` | Enables Ingress | `false` | -| `ingress.annotations` | Ingress annotations (values are templated) | `{}` | -| `ingress.labels` | Custom labels | `{}` | -| `ingress.path` | Ingress accepted path | `/` | -| `ingress.pathType` | Ingress type of path | `Prefix` | -| `ingress.hosts` | Ingress accepted hostnames | `["chart-example.local"]` | -| `ingress.extraPaths` | Ingress extra paths to prepend to every host configuration. Useful when configuring [custom actions with AWS ALB Ingress Controller](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.6/guide/ingress/annotations/#actions). Requires `ingress.hosts` to have one or more host entries. | `[]` | -| `ingress.tls` | Ingress TLS configuration | `[]` | -| `ingress.ingressClassName` | Ingress Class Name. MAY be required for Kubernetes versions >= 1.18 | `""` | -| `resources` | CPU/Memory resource requests/limits | `{}` | -| `nodeSelector` | Node labels for pod assignment | `{}` | -| `tolerations` | Toleration labels for pod assignment | `[]` | -| `affinity` | Affinity settings for pod assignment | `{}` | -| `extraInitContainers` | Init containers to add to the grafana pod | `{}` | -| `extraContainers` | Sidecar containers to add to the grafana pod | `""` | -| `extraContainerVolumes` | Volumes that can be mounted in sidecar containers | `[]` | -| `extraLabels` | Custom labels for all manifests | `{}` | -| `schedulerName` | Name of the k8s scheduler (other than default) | `nil` | -| `persistence.enabled` | Use persistent volume to store data | `false` | -| `persistence.type` | Type of persistence (`pvc` or `statefulset`) | `pvc` | -| `persistence.size` | Size of persistent volume claim | `10Gi` | -| `persistence.existingClaim` | Use an existing PVC to persist data (can be templated) | `nil` | -| `persistence.storageClassName` | Type of persistent volume claim | `nil` | -| `persistence.accessModes` | Persistence access modes | `[ReadWriteOnce]` | -| `persistence.annotations` | PersistentVolumeClaim annotations | `{}` | -| `persistence.finalizers` | PersistentVolumeClaim finalizers | `[ "kubernetes.io/pvc-protection" ]` | -| `persistence.extraPvcLabels` | Extra labels to apply to a PVC. | `{}` | -| `persistence.subPath` | Mount a sub dir of the persistent volume (can be templated) | `nil` | -| `persistence.inMemory.enabled` | If persistence is not enabled, whether to mount the local storage in-memory to improve performance | `false` | -| `persistence.inMemory.sizeLimit` | SizeLimit for the in-memory local storage | `nil` | -| `initChownData.enabled` | If false, don't reset data ownership at startup | true | -| `initChownData.image.registry` | init-chown-data container image registry | `docker.io` | -| `initChownData.image.repository` | init-chown-data container image repository | `busybox` | -| `initChownData.image.tag` | init-chown-data container image tag | `1.31.1` | -| `initChownData.image.sha` | init-chown-data container image sha (optional)| `""` | -| `initChownData.image.pullPolicy` | init-chown-data container image pull policy | `IfNotPresent` | -| `initChownData.resources` | init-chown-data pod resource requests & limits | `{}` | -| `schedulerName` | Alternate scheduler name | `nil` | -| `env` | Extra environment variables passed to pods | `{}` | -| `envValueFrom` | Environment variables from alternate sources. See the API docs on [EnvVarSource](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#envvarsource-v1-core) for format details. Can be templated | `{}` | -| `envFromSecret` | Name of a Kubernetes secret (must be manually created in the same namespace) containing values to be added to the environment. Can be templated | `""` | -| `envFromSecrets` | List of Kubernetes secrets (must be manually created in the same namespace) containing values to be added to the environment. Can be templated | `[]` | -| `envFromConfigMaps` | List of Kubernetes ConfigMaps (must be manually created in the same namespace) containing values to be added to the environment. Can be templated | `[]` | -| `envRenderSecret` | Sensible environment variables passed to pods and stored as secret. (passed through [tpl](https://helm.sh/docs/howto/charts_tips_and_tricks/#using-the-tpl-function)) | `{}` | -| `enableServiceLinks` | Inject Kubernetes services as environment variables. | `true` | -| `extraSecretMounts` | Additional grafana server secret mounts | `[]` | -| `extraVolumeMounts` | Additional grafana server volume mounts | `[]` | -| `extraVolumes` | Additional Grafana server volumes | `[]` | -| `createConfigmap` | Enable creating the grafana configmap | `true` | -| `extraConfigmapMounts` | Additional grafana server configMap volume mounts (values are templated) | `[]` | -| `extraEmptyDirMounts` | Additional grafana server emptyDir volume mounts | `[]` | -| `plugins` | Plugins to be loaded along with Grafana | `[]` | -| `datasources` | Configure grafana datasources (passed through tpl) | `{}` | -| `alerting` | Configure grafana alerting (passed through tpl) | `{}` | -| `notifiers` | Configure grafana notifiers | `{}` | -| `dashboardProviders` | Configure grafana dashboard providers | `{}` | -| `dashboards` | Dashboards to import | `{}` | -| `dashboardsConfigMaps` | ConfigMaps reference that contains dashboards | `{}` | -| `grafana.ini` | Grafana's primary configuration | `{}` | -| `global.imageRegistry` | Global image pull registry for all images. | `null` | -| `global.imagePullSecrets` | Global image pull secrets (can be templated). Allows either an array of {name: pullSecret} maps (k8s-style), or an array of strings (more common helm-style). | `[]` | -| `ldap.enabled` | Enable LDAP authentication | `false` | -| `ldap.existingSecret` | The name of an existing secret containing the `ldap.toml` file, this must have the key `ldap-toml`. | `""` | -| `ldap.config` | Grafana's LDAP configuration | `""` | -| `annotations` | Deployment annotations | `{}` | -| `labels` | Deployment labels | `{}` | -| `podAnnotations` | Pod annotations | `{}` | -| `podLabels` | Pod labels | `{}` | -| `podPortName` | Name of the grafana port on the pod | `grafana` | -| `lifecycleHooks` | Lifecycle hooks for podStart and preStop [Example](https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/#define-poststart-and-prestop-handlers) | `{}` | -| `sidecar.image.registry` | Sidecar image registry | `quay.io` | -| `sidecar.image.repository` | Sidecar image repository | `kiwigrid/k8s-sidecar` | -| `sidecar.image.tag` | Sidecar image tag | `1.24.6` | -| `sidecar.image.sha` | Sidecar image sha (optional) | `""` | -| `sidecar.imagePullPolicy` | Sidecar image pull policy | `IfNotPresent` | -| `sidecar.resources` | Sidecar resources | `{}` | -| `sidecar.securityContext` | Sidecar securityContext | `{}` | -| `sidecar.enableUniqueFilenames` | Sets the kiwigrid/k8s-sidecar UNIQUE_FILENAMES environment variable. If set to `true` the sidecar will create unique filenames where duplicate data keys exist between ConfigMaps and/or Secrets within the same or multiple Namespaces. | `false` | -| `sidecar.alerts.enabled` | Enables the cluster wide search for alerts and adds/updates/deletes them in grafana |`false` | -| `sidecar.alerts.label` | Label that config maps with alerts should have to be added | `grafana_alert` | -| `sidecar.alerts.labelValue` | Label value that config maps with alerts should have to be added | `""` | -| `sidecar.alerts.searchNamespace` | Namespaces list. If specified, the sidecar will search for alerts config-maps inside these namespaces. Otherwise the namespace in which the sidecar is running will be used. It's also possible to specify ALL to search in all namespaces. | `nil` | -| `sidecar.alerts.watchMethod` | Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. | `WATCH` | -| `sidecar.alerts.resource` | Should the sidecar looks into secrets, configmaps or both. | `both` | -| `sidecar.alerts.reloadURL` | Full url of datasource configuration reload API endpoint, to invoke after a config-map change | `"http://localhost:3000/api/admin/provisioning/alerting/reload"` | -| `sidecar.alerts.skipReload` | Enabling this omits defining the REQ_URL and REQ_METHOD environment variables | `false` | -| `sidecar.alerts.initAlerts` | Set to true to deploy the alerts sidecar as an initContainer. This is needed if skipReload is true, to load any alerts defined at startup time. | `false` | -| `sidecar.alerts.extraMounts` | Additional alerts sidecar volume mounts. | `[]` | -| `sidecar.dashboards.enabled` | Enables the cluster wide search for dashboards and adds/updates/deletes them in grafana | `false` | -| `sidecar.dashboards.SCProvider` | Enables creation of sidecar provider | `true` | -| `sidecar.dashboards.provider.name` | Unique name of the grafana provider | `sidecarProvider` | -| `sidecar.dashboards.provider.orgid` | Id of the organisation, to which the dashboards should be added | `1` | -| `sidecar.dashboards.provider.folder` | Logical folder in which grafana groups dashboards | `""` | -| `sidecar.dashboards.provider.disableDelete` | Activate to avoid the deletion of imported dashboards | `false` | -| `sidecar.dashboards.provider.allowUiUpdates` | Allow updating provisioned dashboards from the UI | `false` | -| `sidecar.dashboards.provider.type` | Provider type | `file` | -| `sidecar.dashboards.provider.foldersFromFilesStructure` | Allow Grafana to replicate dashboard structure from filesystem. | `false` | -| `sidecar.dashboards.watchMethod` | Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. | `WATCH` | -| `sidecar.skipTlsVerify` | Set to true to skip tls verification for kube api calls | `nil` | -| `sidecar.dashboards.label` | Label that config maps with dashboards should have to be added | `grafana_dashboard` | -| `sidecar.dashboards.labelValue` | Label value that config maps with dashboards should have to be added | `""` | -| `sidecar.dashboards.folder` | Folder in the pod that should hold the collected dashboards (unless `sidecar.dashboards.defaultFolderName` is set). This path will be mounted. | `/tmp/dashboards` | -| `sidecar.dashboards.folderAnnotation` | The annotation the sidecar will look for in configmaps to override the destination folder for files | `nil` | -| `sidecar.dashboards.defaultFolderName` | The default folder name, it will create a subfolder under the `sidecar.dashboards.folder` and put dashboards in there instead | `nil` | -| `sidecar.dashboards.searchNamespace` | Namespaces list. If specified, the sidecar will search for dashboards config-maps inside these namespaces. Otherwise the namespace in which the sidecar is running will be used. It's also possible to specify ALL to search in all namespaces. | `nil` | -| `sidecar.dashboards.script` | Absolute path to shell script to execute after a configmap got reloaded. | `nil` | -| `sidecar.dashboards.reloadURL` | Full url of dashboards configuration reload API endpoint, to invoke after a config-map change | `"http://localhost:3000/api/admin/provisioning/dashboards/reload"` | -| `sidecar.dashboards.skipReload` | Enabling this omits defining the REQ_USERNAME, REQ_PASSWORD, REQ_URL and REQ_METHOD environment variables | `false` | -| `sidecar.dashboards.resource` | Should the sidecar looks into secrets, configmaps or both. | `both` | -| `sidecar.dashboards.extraMounts` | Additional dashboard sidecar volume mounts. | `[]` | -| `sidecar.datasources.enabled` | Enables the cluster wide search for datasources and adds/updates/deletes them in grafana |`false` | -| `sidecar.datasources.label` | Label that config maps with datasources should have to be added | `grafana_datasource` | -| `sidecar.datasources.labelValue` | Label value that config maps with datasources should have to be added | `""` | -| `sidecar.datasources.searchNamespace` | Namespaces list. If specified, the sidecar will search for datasources config-maps inside these namespaces. Otherwise the namespace in which the sidecar is running will be used. It's also possible to specify ALL to search in all namespaces. | `nil` | -| `sidecar.datasources.watchMethod` | Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. | `WATCH` | -| `sidecar.datasources.resource` | Should the sidecar looks into secrets, configmaps or both. | `both` | -| `sidecar.datasources.reloadURL` | Full url of datasource configuration reload API endpoint, to invoke after a config-map change | `"http://localhost:3000/api/admin/provisioning/datasources/reload"` | -| `sidecar.datasources.skipReload` | Enabling this omits defining the REQ_URL and REQ_METHOD environment variables | `false` | -| `sidecar.datasources.initDatasources` | Set to true to deploy the datasource sidecar as an initContainer in addition to a container. This is needed if skipReload is true, to load any datasources defined at startup time. | `false` | -| `sidecar.notifiers.enabled` | Enables the cluster wide search for notifiers and adds/updates/deletes them in grafana | `false` | -| `sidecar.notifiers.label` | Label that config maps with notifiers should have to be added | `grafana_notifier` | -| `sidecar.notifiers.labelValue` | Label value that config maps with notifiers should have to be added | `""` | -| `sidecar.notifiers.searchNamespace` | Namespaces list. If specified, the sidecar will search for notifiers config-maps (or secrets) inside these namespaces. Otherwise the namespace in which the sidecar is running will be used. It's also possible to specify ALL to search in all namespaces. | `nil` | -| `sidecar.notifiers.watchMethod` | Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. | `WATCH` | -| `sidecar.notifiers.resource` | Should the sidecar looks into secrets, configmaps or both. | `both` | -| `sidecar.notifiers.reloadURL` | Full url of notifier configuration reload API endpoint, to invoke after a config-map change | `"http://localhost:3000/api/admin/provisioning/notifications/reload"` | -| `sidecar.notifiers.skipReload` | Enabling this omits defining the REQ_URL and REQ_METHOD environment variables | `false` | -| `sidecar.notifiers.initNotifiers` | Set to true to deploy the notifier sidecar as an initContainer in addition to a container. This is needed if skipReload is true, to load any notifiers defined at startup time. | `false` | -| `smtp.existingSecret` | The name of an existing secret containing the SMTP credentials. | `""` | -| `smtp.userKey` | The key in the existing SMTP secret containing the username. | `"user"` | -| `smtp.passwordKey` | The key in the existing SMTP secret containing the password. | `"password"` | -| `admin.existingSecret` | The name of an existing secret containing the admin credentials (can be templated). | `""` | -| `admin.userKey` | The key in the existing admin secret containing the username. | `"admin-user"` | -| `admin.passwordKey` | The key in the existing admin secret containing the password. | `"admin-password"` | -| `serviceAccount.autoMount` | Automount the service account token in the pod| `true` | -| `serviceAccount.annotations` | ServiceAccount annotations | | -| `serviceAccount.create` | Create service account | `true` | -| `serviceAccount.labels` | ServiceAccount labels | `{}` | -| `serviceAccount.name` | Service account name to use, when empty will be set to created account if `serviceAccount.create` is set else to `default` | `` | -| `serviceAccount.nameTest` | Service account name to use for test, when empty will be set to created account if `serviceAccount.create` is set else to `default` | `nil` | -| `rbac.create` | Create and use RBAC resources | `true` | -| `rbac.namespaced` | Creates Role and Rolebinding instead of the default ClusterRole and ClusteRoleBindings for the grafana instance | `false` | -| `rbac.useExistingRole` | Set to a rolename to use existing role - skipping role creating - but still doing serviceaccount and rolebinding to the rolename set here. | `nil` | -| `rbac.pspEnabled` | Create PodSecurityPolicy (with `rbac.create`, grant roles permissions as well) | `false` | -| `rbac.pspUseAppArmor` | Enforce AppArmor in created PodSecurityPolicy (requires `rbac.pspEnabled`) | `false` | -| `rbac.extraRoleRules` | Additional rules to add to the Role | [] | -| `rbac.extraClusterRoleRules` | Additional rules to add to the ClusterRole | [] | -| `command` | Define command to be executed by grafana container at startup | `nil` | -| `args` | Define additional args if command is used | `nil` | -| `testFramework.enabled` | Whether to create test-related resources | `true` | -| `testFramework.image.registry` | `test-framework` image registry. | `docker.io` | -| `testFramework.image.repository` | `test-framework` image repository. | `bats/bats` | -| `testFramework.image.tag` | `test-framework` image tag. | `v1.4.1` | -| `testFramework.imagePullPolicy` | `test-framework` image pull policy. | `IfNotPresent` | -| `testFramework.securityContext` | `test-framework` securityContext | `{}` | -| `downloadDashboards.env` | Environment variables to be passed to the `download-dashboards` container | `{}` | -| `downloadDashboards.envFromSecret` | Name of a Kubernetes secret (must be manually created in the same namespace) containing values to be added to the environment. Can be templated | `""` | -| `downloadDashboards.resources` | Resources of `download-dashboards` container | `{}` | -| `downloadDashboardsImage.registry` | Curl docker image registry | `docker.io` | -| `downloadDashboardsImage.repository` | Curl docker image repository | `curlimages/curl` | -| `downloadDashboardsImage.tag` | Curl docker image tag | `7.73.0` | -| `downloadDashboardsImage.sha` | Curl docker image sha (optional) | `""` | -| `downloadDashboardsImage.pullPolicy` | Curl docker image pull policy | `IfNotPresent` | -| `namespaceOverride` | Override the deployment namespace | `""` (`Release.Namespace`) | -| `serviceMonitor.enabled` | Use servicemonitor from prometheus operator | `false` | -| `serviceMonitor.namespace` | Namespace this servicemonitor is installed in | | -| `serviceMonitor.interval` | How frequently Prometheus should scrape | `1m` | -| `serviceMonitor.path` | Path to scrape | `/metrics` | -| `serviceMonitor.scheme` | Scheme to use for metrics scraping | `http` | -| `serviceMonitor.tlsConfig` | TLS configuration block for the endpoint | `{}` | -| `serviceMonitor.labels` | Labels for the servicemonitor passed to Prometheus Operator | `{}` | -| `serviceMonitor.scrapeTimeout` | Timeout after which the scrape is ended | `30s` | -| `serviceMonitor.relabelings` | RelabelConfigs to apply to samples before scraping. | `[]` | -| `serviceMonitor.metricRelabelings` | MetricRelabelConfigs to apply to samples before ingestion. | `[]` | -| `revisionHistoryLimit` | Number of old ReplicaSets to retain | `10` | -| `imageRenderer.enabled` | Enable the image-renderer deployment & service | `false` | -| `imageRenderer.image.registry` | image-renderer Image registry | `docker.io` | -| `imageRenderer.image.repository` | image-renderer Image repository | `grafana/grafana-image-renderer` | -| `imageRenderer.image.tag` | image-renderer Image tag | `latest` | -| `imageRenderer.image.sha` | image-renderer Image sha (optional) | `""` | -| `imageRenderer.image.pullPolicy` | image-renderer ImagePullPolicy | `Always` | -| `imageRenderer.env` | extra env-vars for image-renderer | `{}` | -| `imageRenderer.envValueFrom` | Environment variables for image-renderer from alternate sources. See the API docs on [EnvVarSource](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#envvarsource-v1-core) for format details. Can be templated | `{}` | -| `imageRenderer.serviceAccountName` | image-renderer deployment serviceAccountName | `""` | -| `imageRenderer.securityContext` | image-renderer deployment securityContext | `{}` | -| `imageRenderer.podAnnotations ` | image-renderer image-renderer pod annotation | `{}` | -| `imageRenderer.hostAliases` | image-renderer deployment Host Aliases | `[]` | -| `imageRenderer.priorityClassName` | image-renderer deployment priority class | `''` | -| `imageRenderer.service.enabled` | Enable the image-renderer service | `true` | -| `imageRenderer.service.portName` | image-renderer service port name | `http` | -| `imageRenderer.service.port` | image-renderer port used by deployment | `8081` | -| `imageRenderer.service.targetPort` | image-renderer service port used by service | `8081` | -| `imageRenderer.appProtocol` | Adds the appProtocol field to the service | `` | -| `imageRenderer.grafanaSubPath` | Grafana sub path to use for image renderer callback url | `''` | -| `imageRenderer.podPortName` | name of the image-renderer port on the pod | `http` | -| `imageRenderer.revisionHistoryLimit` | number of image-renderer replica sets to keep | `10` | -| `imageRenderer.networkPolicy.limitIngress` | Enable a NetworkPolicy to limit inbound traffic from only the created grafana pods | `true` | -| `imageRenderer.networkPolicy.limitEgress` | Enable a NetworkPolicy to limit outbound traffic to only the created grafana pods | `false` | -| `imageRenderer.resources` | Set resource limits for image-renderer pods | `{}` | -| `imageRenderer.nodeSelector` | Node labels for pod assignment | `{}` | -| `imageRenderer.tolerations` | Toleration labels for pod assignment | `[]` | -| `imageRenderer.affinity` | Affinity settings for pod assignment | `{}` | -| `networkPolicy.enabled` | Enable creation of NetworkPolicy resources. | `false` | -| `networkPolicy.allowExternal` | Don't require client label for connections | `true` | -| `networkPolicy.explicitNamespacesSelector` | A Kubernetes LabelSelector to explicitly select namespaces from which traffic could be allowed | `{}` | -| `networkPolicy.ingress` | Enable the creation of an ingress network policy | `true` | -| `networkPolicy.egress.enabled` | Enable the creation of an egress network policy | `false` | -| `networkPolicy.egress.ports` | An array of ports to allow for the egress | `[]` | -| `enableKubeBackwardCompatibility` | Enable backward compatibility of kubernetes where pod's defintion version below 1.13 doesn't have the enableServiceLinks option | `false` | - -### Example ingress with path - -With grafana 6.3 and above - -```yaml -grafana.ini: - server: - domain: monitoring.example.com - root_url: "%(protocol)s://%(domain)s/grafana" - serve_from_sub_path: true -ingress: - enabled: true - hosts: - - "monitoring.example.com" - path: "/grafana" -``` - -### Example of extraVolumeMounts and extraVolumes - -Configure additional volumes with `extraVolumes` and volume mounts with `extraVolumeMounts`. - -Example for `extraVolumeMounts` and corresponding `extraVolumes`: - -```yaml -extraVolumeMounts: - - name: plugins - mountPath: /var/lib/grafana/plugins - subPath: configs/grafana/plugins - readOnly: false - - name: dashboards - mountPath: /var/lib/grafana/dashboards - hostPath: /usr/shared/grafana/dashboards - readOnly: false - -extraVolumes: - - name: plugins - existingClaim: existing-grafana-claim - - name: dashboards - hostPath: /usr/shared/grafana/dashboards -``` - -Volumes default to `emptyDir`. Set to `persistentVolumeClaim`, -`hostPath`, `csi`, or `configMap` for other types. For a -`persistentVolumeClaim`, specify an existing claim name with -`existingClaim`. - -## Import dashboards - -There are a few methods to import dashboards to Grafana. Below are some examples and explanations as to how to use each method: - -```yaml -dashboards: - default: - some-dashboard: - json: | - { - "annotations": - - ... - # Complete json file here - ... - - "title": "Some Dashboard", - "uid": "abcd1234", - "version": 1 - } - custom-dashboard: - # This is a path to a file inside the dashboards directory inside the chart directory - file: dashboards/custom-dashboard.json - prometheus-stats: - # Ref: https://grafana.com/dashboards/2 - gnetId: 2 - revision: 2 - datasource: Prometheus - loki-dashboard-quick-search: - gnetId: 12019 - revision: 2 - datasource: - - name: DS_PROMETHEUS - value: Prometheus - - name: DS_LOKI - value: Loki - local-dashboard: - url: https://raw.githubusercontent.com/user/repository/master/dashboards/dashboard.json -``` - -## BASE64 dashboards - -Dashboards could be stored on a server that does not return JSON directly and instead of it returns a Base64 encoded file (e.g. Gerrit) -A new parameter has been added to the url use case so if you specify a b64content value equals to true after the url entry a Base64 decoding is applied before save the file to disk. -If this entry is not set or is equals to false not decoding is applied to the file before saving it to disk. - -### Gerrit use case - -Gerrit API for download files has the following schema: where {project-name} and -{file-id} usually has '/' in their values and so they MUST be replaced by %2F so if project-name is user/repo, branch-id is master and file-id is equals to dir1/dir2/dashboard -the url value is - -## Sidecar for dashboards - -If the parameter `sidecar.dashboards.enabled` is set, a sidecar container is deployed in the grafana -pod. This container watches all configmaps (or secrets) in the cluster and filters out the ones with -a label as defined in `sidecar.dashboards.label`. The files defined in those configmaps are written -to a folder and accessed by grafana. Changes to the configmaps are monitored and the imported -dashboards are deleted/updated. - -A recommendation is to use one configmap per dashboard, as a reduction of multiple dashboards inside -one configmap is currently not properly mirrored in grafana. - -Example dashboard config: - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: sample-grafana-dashboard - labels: - grafana_dashboard: "1" -data: - k8s-dashboard.json: |- - [...] -``` - -## Sidecar for datasources - -If the parameter `sidecar.datasources.enabled` is set, an init container is deployed in the grafana -pod. This container lists all secrets (or configmaps, though not recommended) in the cluster and -filters out the ones with a label as defined in `sidecar.datasources.label`. The files defined in -those secrets are written to a folder and accessed by grafana on startup. Using these yaml files, -the data sources in grafana can be imported. - -Should you aim for reloading datasources in Grafana each time the config is changed, set `sidecar.datasources.skipReload: false` and adjust `sidecar.datasources.reloadURL` to `http://..svc.cluster.local/api/admin/provisioning/datasources/reload`. - -Secrets are recommended over configmaps for this usecase because datasources usually contain private -data like usernames and passwords. Secrets are the more appropriate cluster resource to manage those. - -Example values to add a postgres datasource as a kubernetes secret: -```yaml -apiVersion: v1 -kind: Secret -metadata: - name: grafana-datasources - labels: - grafana_datasource: 'true' # default value for: sidecar.datasources.label -stringData: - pg-db.yaml: |- - apiVersion: 1 - datasources: - - name: My pg db datasource - type: postgres - url: my-postgresql-db:5432 - user: db-readonly-user - secureJsonData: - password: 'SUperSEcretPa$$word' - jsonData: - database: my_datase - sslmode: 'disable' # disable/require/verify-ca/verify-full - maxOpenConns: 0 # Grafana v5.4+ - maxIdleConns: 2 # Grafana v5.4+ - connMaxLifetime: 14400 # Grafana v5.4+ - postgresVersion: 1000 # 903=9.3, 904=9.4, 905=9.5, 906=9.6, 1000=10 - timescaledb: false - # allow users to edit datasources from the UI. - editable: false -``` - -Example values to add a datasource adapted from [Grafana](http://docs.grafana.org/administration/provisioning/#example-datasource-config-file): - -```yaml -datasources: - datasources.yaml: - apiVersion: 1 - datasources: - # name of the datasource. Required - - name: Graphite - # datasource type. Required - type: graphite - # access mode. proxy or direct (Server or Browser in the UI). Required - access: proxy - # org id. will default to orgId 1 if not specified - orgId: 1 - # url - url: http://localhost:8080 - # database password, if used - password: - # database user, if used - user: - # database name, if used - database: - # enable/disable basic auth - basicAuth: - # basic auth username - basicAuthUser: - # basic auth password - basicAuthPassword: - # enable/disable with credentials headers - withCredentials: - # mark as default datasource. Max one per org - isDefault: - # fields that will be converted to json and stored in json_data - jsonData: - graphiteVersion: "1.1" - tlsAuth: true - tlsAuthWithCACert: true - # json object of data that will be encrypted. - secureJsonData: - tlsCACert: "..." - tlsClientCert: "..." - tlsClientKey: "..." - version: 1 - # allow users to edit datasources from the UI. - editable: false -``` - -## Sidecar for notifiers - -If the parameter `sidecar.notifiers.enabled` is set, an init container is deployed in the grafana -pod. This container lists all secrets (or configmaps, though not recommended) in the cluster and -filters out the ones with a label as defined in `sidecar.notifiers.label`. The files defined in -those secrets are written to a folder and accessed by grafana on startup. Using these yaml files, -the notification channels in grafana can be imported. The secrets must be created before -`helm install` so that the notifiers init container can list the secrets. - -Secrets are recommended over configmaps for this usecase because alert notification channels usually contain -private data like SMTP usernames and passwords. Secrets are the more appropriate cluster resource to manage those. - -Example datasource config adapted from [Grafana](https://grafana.com/docs/grafana/latest/administration/provisioning/#alert-notification-channels): - -```yaml -notifiers: - - name: notification-channel-1 - type: slack - uid: notifier1 - # either - org_id: 2 - # or - org_name: Main Org. - is_default: true - send_reminder: true - frequency: 1h - disable_resolve_message: false - # See `Supported Settings` section for settings supporter for each - # alert notification type. - settings: - recipient: 'XXX' - token: 'xoxb' - uploadImage: true - url: https://slack.com - -delete_notifiers: - - name: notification-channel-1 - uid: notifier1 - org_id: 2 - - name: notification-channel-2 - # default org_id: 1 -``` - -## Sidecar for alerting resources - -If the parameter `sidecar.alerts.enabled` is set, a sidecar container is deployed in the grafana -pod. This container watches all configmaps (or secrets) in the cluster (namespace defined by `sidecar.alerts.searchNamespace`) and filters out the ones with -a label as defined in `sidecar.alerts.label` (default is `grafana_alert`). The files defined in those configmaps are written -to a folder and accessed by grafana. Changes to the configmaps are monitored and the imported alerting resources are updated, however, deletions are a little more complicated (see below). - -This sidecar can be used to provision alert rules, contact points, notification policies, notification templates and mute timings as shown in [Grafana Documentation](https://grafana.com/docs/grafana/next/alerting/set-up/provision-alerting-resources/file-provisioning/). - -To fetch the alert config which will be provisioned, use the alert provisioning API ([Grafana Documentation](https://grafana.com/docs/grafana/next/developers/http_api/alerting_provisioning/)). -You can use either JSON or YAML format. - -Example config for an alert rule: - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: sample-grafana-alert - labels: - grafana_alert: "1" -data: - k8s-alert.yml: |- - apiVersion: 1 - groups: - - orgId: 1 - name: k8s-alert - [...] -``` - -To delete provisioned alert rules is a two step process, you need to delete the configmap which defined the alert rule -and then create a configuration which deletes the alert rule. - -Example deletion configuration: -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: delete-sample-grafana-alert - namespace: monitoring - labels: - grafana_alert: "1" -data: - delete-k8s-alert.yml: |- - apiVersion: 1 - deleteRules: - - orgId: 1 - uid: 16624780-6564-45dc-825c-8bded4ad92d3 -``` - -## Statically provision alerting resources -If you don't need to change alerting resources (alert rules, contact points, notification policies and notification templates) regularly you could use the `alerting` config option instead of the sidecar option above. -This will grab the alerting config and apply it statically at build time for the helm file. - -There are two methods to statically provision alerting configuration in Grafana. Below are some examples and explanations as to how to use each method: - -```yaml -alerting: - team1-alert-rules.yaml: - file: alerting/team1/rules.yaml - team2-alert-rules.yaml: - file: alerting/team2/rules.yaml - team3-alert-rules.yaml: - file: alerting/team3/rules.yaml - notification-policies.yaml: - file: alerting/shared/notification-policies.yaml - notification-templates.yaml: - file: alerting/shared/notification-templates.yaml - contactpoints.yaml: - apiVersion: 1 - contactPoints: - - orgId: 1 - name: Slack channel - receivers: - - uid: default-receiver - type: slack - settings: - # Webhook URL to be filled in - url: "" - # We need to escape double curly braces for the tpl function. - text: '{{ `{{ template "default.message" . }}` }}' - title: '{{ `{{ template "default.title" . }}` }}' -``` - -The two possibilities for static alerting resource provisioning are: - -* Inlining the file contents as shown for contact points in the above example. -* Importing a file using a relative path starting from the chart root directory as shown for the alert rules in the above example. - -### Important notes on file provisioning - -* The format of the files is defined in the [Grafana documentation](https://grafana.com/docs/grafana/next/alerting/set-up/provision-alerting-resources/file-provisioning/) on file provisioning. -* The chart supports importing YAML and JSON files. -* The filename must be unique, otherwise one volume mount will overwrite the other. -* In case of inlining, double curly braces that arise from the Grafana configuration format and are not intended as templates for the chart must be escaped. -* The number of total files under `alerting:` is not limited. Each file will end up as a volume mount in the corresponding provisioning folder of the deployed Grafana instance. -* The file size for each import is limited by what the function `.Files.Get` can handle, which suffices for most cases. - -## How to serve Grafana with a path prefix (/grafana) - -In order to serve Grafana with a prefix (e.g., ), add the following to your values.yaml. - -```yaml -ingress: - enabled: true - annotations: - kubernetes.io/ingress.class: "nginx" - nginx.ingress.kubernetes.io/rewrite-target: /$1 - nginx.ingress.kubernetes.io/use-regex: "true" - - path: /grafana/?(.*) - hosts: - - k8s.example.dev - -grafana.ini: - server: - root_url: http://localhost:3000/grafana # this host can be localhost -``` - -## How to securely reference secrets in grafana.ini - -This example uses Grafana [file providers](https://grafana.com/docs/grafana/latest/administration/configuration/#file-provider) for secret values and the `extraSecretMounts` configuration flag (Additional grafana server secret mounts) to mount the secrets. - -In grafana.ini: - -```yaml -grafana.ini: - [auth.generic_oauth] - enabled = true - client_id = $__file{/etc/secrets/auth_generic_oauth/client_id} - client_secret = $__file{/etc/secrets/auth_generic_oauth/client_secret} -``` - -Existing secret, or created along with helm: - -```yaml ---- -apiVersion: v1 -kind: Secret -metadata: - name: auth-generic-oauth-secret -type: Opaque -stringData: - client_id: - client_secret: -``` - -Include in the `extraSecretMounts` configuration flag: - -```yaml -- extraSecretMounts: - - name: auth-generic-oauth-secret-mount - secretName: auth-generic-oauth-secret - defaultMode: 0440 - mountPath: /etc/secrets/auth_generic_oauth - readOnly: true -``` - -### extraSecretMounts using a Container Storage Interface (CSI) provider - -This example uses a CSI driver e.g. retrieving secrets using [Azure Key Vault Provider](https://github.com/Azure/secrets-store-csi-driver-provider-azure) - -```yaml -- extraSecretMounts: - - name: secrets-store-inline - mountPath: /run/secrets - readOnly: true - csi: - driver: secrets-store.csi.k8s.io - readOnly: true - volumeAttributes: - secretProviderClass: "my-provider" - nodePublishSecretRef: - name: akv-creds -``` - -## Image Renderer Plug-In - -This chart supports enabling [remote image rendering](https://github.com/grafana/grafana-image-renderer/blob/master/README.md#run-in-docker) - -```yaml -imageRenderer: - enabled: true -``` - -### Image Renderer NetworkPolicy - -By default the image-renderer pods will have a network policy which only allows ingress traffic from the created grafana instance - -### High Availability for unified alerting - -If you want to run Grafana in a high availability cluster you need to enable -the headless service by setting `headlessService: true` in your `values.yaml` -file. - -As next step you have to setup the `grafana.ini` in your `values.yaml` in a way -that it will make use of the headless service to obtain all the IPs of the -cluster. You should replace ``{{ Name }}`` with the name of your helm deployment. - -```yaml -grafana.ini: - ... - unified_alerting: - enabled: true - ha_peers: {{ Name }}-headless:9094 - ha_listen_address: ${POD_IP}:9094 - ha_advertise_address: ${POD_IP}:9094 - - alerting: - enabled: false -``` diff --git a/thunder_deployment/infra/beta9/charts/grafana/ci/default-values.yaml b/thunder_deployment/infra/beta9/charts/grafana/ci/default-values.yaml deleted file mode 100644 index fc2ba605a..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/ci/default-values.yaml +++ /dev/null @@ -1 +0,0 @@ -# Leave this file empty to ensure that CI runs builds against the default configuration in values.yaml. diff --git a/thunder_deployment/infra/beta9/charts/grafana/ci/with-affinity-values.yaml b/thunder_deployment/infra/beta9/charts/grafana/ci/with-affinity-values.yaml deleted file mode 100644 index f5b9b53e7..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/ci/with-affinity-values.yaml +++ /dev/null @@ -1,16 +0,0 @@ -affinity: - podAntiAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: - app.kubernetes.io/instance: grafana-test - app.kubernetes.io/name: grafana - topologyKey: failure-domain.beta.kubernetes.io/zone - weight: 100 - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchLabels: - app.kubernetes.io/instance: grafana-test - app.kubernetes.io/name: grafana - topologyKey: kubernetes.io/hostname diff --git a/thunder_deployment/infra/beta9/charts/grafana/ci/with-dashboard-json-values.yaml b/thunder_deployment/infra/beta9/charts/grafana/ci/with-dashboard-json-values.yaml deleted file mode 100644 index e0c4e4168..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/ci/with-dashboard-json-values.yaml +++ /dev/null @@ -1,53 +0,0 @@ -dashboards: - my-provider: - my-awesome-dashboard: - # An empty but valid dashboard - json: | - { - "__inputs": [], - "__requires": [ - { - "type": "grafana", - "id": "grafana", - "name": "Grafana", - "version": "6.3.5" - } - ], - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "id": null, - "links": [], - "panels": [], - "schemaVersion": 19, - "style": "dark", - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": ["5s"] - }, - "timezone": "", - "title": "Dummy Dashboard", - "uid": "IdcYQooWk", - "version": 1 - } - datasource: Prometheus diff --git a/thunder_deployment/infra/beta9/charts/grafana/ci/with-dashboard-values.yaml b/thunder_deployment/infra/beta9/charts/grafana/ci/with-dashboard-values.yaml deleted file mode 100644 index 7b662c5fd..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/ci/with-dashboard-values.yaml +++ /dev/null @@ -1,19 +0,0 @@ -dashboards: - my-provider: - my-awesome-dashboard: - gnetId: 10000 - revision: 1 - datasource: Prometheus -dashboardProviders: - dashboardproviders.yaml: - apiVersion: 1 - providers: - - name: 'my-provider' - orgId: 1 - folder: '' - type: file - updateIntervalSeconds: 10 - disableDeletion: true - editable: true - options: - path: /var/lib/grafana/dashboards/my-provider diff --git a/thunder_deployment/infra/beta9/charts/grafana/ci/with-extraconfigmapmounts-values.yaml b/thunder_deployment/infra/beta9/charts/grafana/ci/with-extraconfigmapmounts-values.yaml deleted file mode 100644 index 5cc44a056..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/ci/with-extraconfigmapmounts-values.yaml +++ /dev/null @@ -1,7 +0,0 @@ -extraConfigmapMounts: - - name: '{{ include "grafana.fullname" . }}' - configMap: '{{ include "grafana.fullname" . }}' - mountPath: /var/lib/grafana/dashboards/test-dashboard.json - # This is not a realistic test, but for this we only care about extraConfigmapMounts not being empty and pointing to an existing ConfigMap - subPath: grafana.ini - readOnly: true diff --git a/thunder_deployment/infra/beta9/charts/grafana/ci/with-image-renderer-values.yaml b/thunder_deployment/infra/beta9/charts/grafana/ci/with-image-renderer-values.yaml deleted file mode 100644 index 32f307434..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/ci/with-image-renderer-values.yaml +++ /dev/null @@ -1,19 +0,0 @@ -podLabels: - customLableA: Aaaaa -imageRenderer: - enabled: true - env: - RENDERING_ARGS: --disable-gpu,--window-size=1280x758 - RENDERING_MODE: clustered - podLabels: - customLableB: Bbbbb - networkPolicy: - limitIngress: true - limitEgress: true - resources: - limits: - cpu: 1000m - memory: 1000Mi - requests: - cpu: 500m - memory: 50Mi diff --git a/thunder_deployment/infra/beta9/charts/grafana/ci/with-persistence.yaml b/thunder_deployment/infra/beta9/charts/grafana/ci/with-persistence.yaml deleted file mode 100644 index b92ca02c9..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/ci/with-persistence.yaml +++ /dev/null @@ -1,3 +0,0 @@ -persistence: - type: pvc - enabled: true diff --git a/thunder_deployment/infra/beta9/charts/grafana/dashboards/custom-dashboard.json b/thunder_deployment/infra/beta9/charts/grafana/dashboards/custom-dashboard.json deleted file mode 100644 index 9e26dfeeb..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/dashboards/custom-dashboard.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/NOTES.txt b/thunder_deployment/infra/beta9/charts/grafana/templates/NOTES.txt deleted file mode 100644 index d86419fe2..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/NOTES.txt +++ /dev/null @@ -1,55 +0,0 @@ -1. Get your '{{ .Values.adminUser }}' user password by running: - - kubectl get secret --namespace {{ include "grafana.namespace" . }} {{ .Values.admin.existingSecret | default (include "grafana.fullname" .) }} -o jsonpath="{.data.{{ .Values.admin.passwordKey | default "admin-password" }}}" | base64 --decode ; echo - - -2. The Grafana server can be accessed via port {{ .Values.service.port }} on the following DNS name from within your cluster: - - {{ include "grafana.fullname" . }}.{{ include "grafana.namespace" . }}.svc.cluster.local -{{ if .Values.ingress.enabled }} - If you bind grafana to 80, please update values in values.yaml and reinstall: - ``` - securityContext: - runAsUser: 0 - runAsGroup: 0 - fsGroup: 0 - - command: - - "setcap" - - "'cap_net_bind_service=+ep'" - - "/usr/sbin/grafana-server &&" - - "sh" - - "/run.sh" - ``` - Details refer to https://grafana.com/docs/installation/configuration/#http-port. - Or grafana would always crash. - - From outside the cluster, the server URL(s) are: - {{- range .Values.ingress.hosts }} - http://{{ . }} - {{- end }} -{{- else }} - Get the Grafana URL to visit by running these commands in the same shell: - {{- if contains "NodePort" .Values.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ include "grafana.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "grafana.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ include "grafana.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT - {{- else if contains "LoadBalancer" .Values.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get svc --namespace {{ include "grafana.namespace" . }} -w {{ include "grafana.fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ include "grafana.namespace" . }} {{ include "grafana.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') - http://$SERVICE_IP:{{ .Values.service.port -}} - {{- else if contains "ClusterIP" .Values.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ include "grafana.namespace" . }} -l "app.kubernetes.io/name={{ include "grafana.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - kubectl --namespace {{ include "grafana.namespace" . }} port-forward $POD_NAME 3000 - {{- end }} -{{- end }} - -3. Login with the password from step 1 and the username: {{ .Values.adminUser }} - -{{- if not .Values.persistence.enabled }} -################################################################################# -###### WARNING: Persistence is disabled!!! You will lose your data when ##### -###### the Grafana pod is terminated. ##### -################################################################################# -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/_config.tpl b/thunder_deployment/infra/beta9/charts/grafana/templates/_config.tpl deleted file mode 100644 index 19df19cd2..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/_config.tpl +++ /dev/null @@ -1,171 +0,0 @@ -{{/* - Generate config map data - */}} -{{- define "grafana.configData" -}} -{{ include "grafana.assertNoLeakedSecrets" . }} -{{- $files := .Files }} -{{- $root := . -}} -{{- with .Values.plugins }} -plugins: {{ join "," . }} -{{- end }} -grafana.ini: | -{{- range $elem, $elemVal := index .Values "grafana.ini" }} - {{- if not (kindIs "map" $elemVal) }} - {{- if kindIs "invalid" $elemVal }} - {{ $elem }} = - {{- else if kindIs "string" $elemVal }} - {{ $elem }} = {{ tpl $elemVal $ }} - {{- else }} - {{ $elem }} = {{ $elemVal }} - {{- end }} - {{- end }} -{{- end }} -{{- range $key, $value := index .Values "grafana.ini" }} - {{- if kindIs "map" $value }} - [{{ $key }}] - {{- range $elem, $elemVal := $value }} - {{- if kindIs "invalid" $elemVal }} - {{ $elem }} = - {{- else if kindIs "string" $elemVal }} - {{ $elem }} = {{ tpl $elemVal $ }} - {{- else }} - {{ $elem }} = {{ $elemVal }} - {{- end }} - {{- end }} - {{- end }} -{{- end }} - -{{- range $key, $value := .Values.datasources }} -{{- if not (hasKey $value "secret") }} -{{ $key }}: | - {{- tpl (toYaml $value | nindent 2) $root }} -{{- end }} -{{- end }} - -{{- range $key, $value := .Values.notifiers }} -{{- if not (hasKey $value "secret") }} -{{ $key }}: | - {{- toYaml $value | nindent 2 }} -{{- end }} -{{- end }} - -{{- range $key, $value := .Values.alerting }} -{{- if (hasKey $value "file") }} -{{ $key }}: -{{- toYaml ( $files.Get $value.file ) | nindent 2 }} -{{- else if (or (hasKey $value "secret") (hasKey $value "secretFile"))}} -{{/* will be stored inside secret generated by "configSecret.yaml"*/}} -{{- else }} -{{ $key }}: | - {{- tpl (toYaml $value | nindent 2) $root }} -{{- end }} -{{- end }} - -{{- range $key, $value := .Values.dashboardProviders }} -{{ $key }}: | - {{- toYaml $value | nindent 2 }} -{{- end }} - -{{- if .Values.dashboards }} -download_dashboards.sh: | - #!/usr/bin/env sh - set -euf - {{- if .Values.dashboardProviders }} - {{- range $key, $value := .Values.dashboardProviders }} - {{- range $value.providers }} - mkdir -p {{ .options.path }} - {{- end }} - {{- end }} - {{- end }} -{{ $dashboardProviders := .Values.dashboardProviders }} -{{- range $provider, $dashboards := .Values.dashboards }} - {{- range $key, $value := $dashboards }} - {{- if (or (hasKey $value "gnetId") (hasKey $value "url")) }} - curl -skf \ - --connect-timeout 60 \ - --max-time 60 \ - {{- if not $value.b64content }} - {{- if not $value.acceptHeader }} - -H "Accept: application/json" \ - {{- else }} - -H "Accept: {{ $value.acceptHeader }}" \ - {{- end }} - {{- if $value.token }} - -H "Authorization: token {{ $value.token }}" \ - {{- end }} - {{- if $value.bearerToken }} - -H "Authorization: Bearer {{ $value.bearerToken }}" \ - {{- end }} - {{- if $value.basic }} - -H "Authorization: Basic {{ $value.basic }}" \ - {{- end }} - {{- if $value.gitlabToken }} - -H "PRIVATE-TOKEN: {{ $value.gitlabToken }}" \ - {{- end }} - -H "Content-Type: application/json;charset=UTF-8" \ - {{- end }} - {{- $dpPath := "" -}} - {{- range $kd := (index $dashboardProviders "dashboardproviders.yaml").providers }} - {{- if eq $kd.name $provider }} - {{- $dpPath = $kd.options.path }} - {{- end }} - {{- end }} - {{- if $value.url }} - "{{ $value.url }}" \ - {{- else }} - "https://grafana.com/api/dashboards/{{ $value.gnetId }}/revisions/{{- if $value.revision -}}{{ $value.revision }}{{- else -}}1{{- end -}}/download" \ - {{- end }} - {{- if $value.datasource }} - {{- if kindIs "string" $value.datasource }} - | sed '/-- .* --/! s/"datasource":.*,/"datasource": "{{ $value.datasource }}",/g' \ - {{- end }} - {{- if kindIs "slice" $value.datasource }} - {{- range $value.datasource }} - | sed '/-- .* --/! s/${{"{"}}{{ .name }}}/{{ .value }}/g' \ - {{- end }} - {{- end }} - {{- end }} - {{- if $value.b64content }} - | base64 -d \ - {{- end }} - > "{{- if $dpPath -}}{{ $dpPath }}{{- else -}}/var/lib/grafana/dashboards/{{ $provider }}{{- end -}}/{{ $key }}.json" - {{ end }} - {{- end }} -{{- end }} -{{- end }} -{{- end -}} - -{{/* - Generate dashboard json config map data - */}} -{{- define "grafana.configDashboardProviderData" -}} -provider.yaml: |- - apiVersion: 1 - providers: - - name: '{{ .Values.sidecar.dashboards.provider.name }}' - orgId: {{ .Values.sidecar.dashboards.provider.orgid }} - {{- if not .Values.sidecar.dashboards.provider.foldersFromFilesStructure }} - folder: '{{ .Values.sidecar.dashboards.provider.folder }}' - {{- end }} - type: {{ .Values.sidecar.dashboards.provider.type }} - disableDeletion: {{ .Values.sidecar.dashboards.provider.disableDelete }} - allowUiUpdates: {{ .Values.sidecar.dashboards.provider.allowUiUpdates }} - updateIntervalSeconds: {{ .Values.sidecar.dashboards.provider.updateIntervalSeconds | default 30 }} - options: - foldersFromFilesStructure: {{ .Values.sidecar.dashboards.provider.foldersFromFilesStructure }} - path: {{ .Values.sidecar.dashboards.folder }}{{- with .Values.sidecar.dashboards.defaultFolderName }}/{{ . }}{{- end }} -{{- end -}} - -{{- define "grafana.secretsData" -}} -{{- if and (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) (not .Values.admin.existingSecret) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) }} -admin-user: {{ .Values.adminUser | b64enc | quote }} -{{- if .Values.adminPassword }} -admin-password: {{ .Values.adminPassword | b64enc | quote }} -{{- else }} -admin-password: {{ include "grafana.password" . }} -{{- end }} -{{- end }} -{{- if not .Values.ldap.existingSecret }} -ldap-toml: {{ tpl .Values.ldap.config $ | b64enc | quote }} -{{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/_helpers.tpl b/thunder_deployment/infra/beta9/charts/grafana/templates/_helpers.tpl deleted file mode 100644 index 790d5a293..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/_helpers.tpl +++ /dev/null @@ -1,278 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "grafana.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "grafana.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "grafana.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create the name of the service account -*/}} -{{- define "grafana.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "grafana.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} - -{{- define "grafana.serviceAccountNameTest" -}} -{{- if .Values.serviceAccount.create }} -{{- default (print (include "grafana.fullname" .) "-test") .Values.serviceAccount.nameTest }} -{{- else }} -{{- default "default" .Values.serviceAccount.nameTest }} -{{- end }} -{{- end }} - -{{/* -Allow the release namespace to be overridden for multi-namespace deployments in combined charts -*/}} -{{- define "grafana.namespace" -}} -{{- if .Values.namespaceOverride }} -{{- .Values.namespaceOverride }} -{{- else }} -{{- .Release.Namespace }} -{{- end }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "grafana.labels" -}} -helm.sh/chart: {{ include "grafana.chart" . }} -{{ include "grafana.selectorLabels" . }} -{{- if or .Chart.AppVersion .Values.image.tag }} -app.kubernetes.io/version: {{ mustRegexReplaceAllLiteral "@sha.*" .Values.image.tag "" | default .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- with .Values.extraLabels }} -{{ toYaml . }} -{{- end }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "grafana.selectorLabels" -}} -app.kubernetes.io/name: {{ include "grafana.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "grafana.imageRenderer.labels" -}} -helm.sh/chart: {{ include "grafana.chart" . }} -{{ include "grafana.imageRenderer.selectorLabels" . }} -{{- if or .Chart.AppVersion .Values.image.tag }} -app.kubernetes.io/version: {{ mustRegexReplaceAllLiteral "@sha.*" .Values.image.tag "" | default .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels ImageRenderer -*/}} -{{- define "grafana.imageRenderer.selectorLabels" -}} -app.kubernetes.io/name: {{ include "grafana.name" . }}-image-renderer -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Looks if there's an existing secret and reuse its password. If not it generates -new password and use it. -*/}} -{{- define "grafana.password" -}} -{{- $secret := (lookup "v1" "Secret" (include "grafana.namespace" .) (include "grafana.fullname" .) ) }} -{{- if $secret }} -{{- index $secret "data" "admin-password" }} -{{- else }} -{{- (randAlphaNum 40) | b64enc | quote }} -{{- end }} -{{- end }} - -{{/* -Return the appropriate apiVersion for rbac. -*/}} -{{- define "grafana.rbac.apiVersion" -}} -{{- if $.Capabilities.APIVersions.Has "rbac.authorization.k8s.io/v1" }} -{{- print "rbac.authorization.k8s.io/v1" }} -{{- else }} -{{- print "rbac.authorization.k8s.io/v1beta1" }} -{{- end }} -{{- end }} - -{{/* -Return the appropriate apiVersion for ingress. -*/}} -{{- define "grafana.ingress.apiVersion" -}} -{{- if and ($.Capabilities.APIVersions.Has "networking.k8s.io/v1") (semverCompare ">= 1.19-0" .Capabilities.KubeVersion.Version) }} -{{- print "networking.k8s.io/v1" }} -{{- else if $.Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }} -{{- print "networking.k8s.io/v1beta1" }} -{{- else }} -{{- print "extensions/v1beta1" }} -{{- end }} -{{- end }} - -{{/* -Return the appropriate apiVersion for Horizontal Pod Autoscaler. -*/}} -{{- define "grafana.hpa.apiVersion" -}} -{{- if $.Capabilities.APIVersions.Has "autoscaling/v2/HorizontalPodAutoscaler" }} -{{- print "autoscaling/v2" }} -{{- else if $.Capabilities.APIVersions.Has "autoscaling/v2beta2/HorizontalPodAutoscaler" }} -{{- print "autoscaling/v2beta2" }} -{{- else }} -{{- print "autoscaling/v2beta1" }} -{{- end }} -{{- end }} - -{{/* -Return the appropriate apiVersion for podDisruptionBudget. -*/}} -{{- define "grafana.podDisruptionBudget.apiVersion" -}} -{{- if $.Values.podDisruptionBudget.apiVersion }} -{{- print $.Values.podDisruptionBudget.apiVersion }} -{{- else if $.Capabilities.APIVersions.Has "policy/v1/PodDisruptionBudget" }} -{{- print "policy/v1" }} -{{- else }} -{{- print "policy/v1beta1" }} -{{- end }} -{{- end }} - -{{/* -Return if ingress is stable. -*/}} -{{- define "grafana.ingress.isStable" -}} -{{- eq (include "grafana.ingress.apiVersion" .) "networking.k8s.io/v1" }} -{{- end }} - -{{/* -Return if ingress supports ingressClassName. -*/}} -{{- define "grafana.ingress.supportsIngressClassName" -}} -{{- or (eq (include "grafana.ingress.isStable" .) "true") (and (eq (include "grafana.ingress.apiVersion" .) "networking.k8s.io/v1beta1") (semverCompare ">= 1.18-0" .Capabilities.KubeVersion.Version)) }} -{{- end }} - -{{/* -Return if ingress supports pathType. -*/}} -{{- define "grafana.ingress.supportsPathType" -}} -{{- or (eq (include "grafana.ingress.isStable" .) "true") (and (eq (include "grafana.ingress.apiVersion" .) "networking.k8s.io/v1beta1") (semverCompare ">= 1.18-0" .Capabilities.KubeVersion.Version)) }} -{{- end }} - -{{/* -Formats imagePullSecrets. Input is (dict "root" . "imagePullSecrets" .{specific imagePullSecrets}) -*/}} -{{- define "grafana.imagePullSecrets" -}} -{{- $root := .root }} -{{- range (concat .root.Values.global.imagePullSecrets .imagePullSecrets) }} -{{- if eq (typeOf .) "map[string]interface {}" }} -- {{ toYaml (dict "name" (tpl .name $root)) | trim }} -{{- else }} -- name: {{ tpl . $root }} -{{- end }} -{{- end }} -{{- end }} - - -{{/* - Checks whether or not the configSecret secret has to be created - */}} -{{- define "grafana.shouldCreateConfigSecret" -}} -{{- $secretFound := false -}} -{{- range $key, $value := .Values.datasources }} - {{- if hasKey $value "secret" }} - {{- $secretFound = true}} - {{- end }} -{{- end }} -{{- range $key, $value := .Values.notifiers }} - {{- if hasKey $value "secret" }} - {{- $secretFound = true}} - {{- end }} -{{- end }} -{{- range $key, $value := .Values.alerting }} - {{- if (or (hasKey $value "secret") (hasKey $value "secretFile")) }} - {{- $secretFound = true}} - {{- end }} -{{- end }} -{{- $secretFound}} -{{- end -}} - -{{/* - Checks whether the user is attempting to store secrets in plaintext - in the grafana.ini configmap -*/}} -{{/* grafana.assertNoLeakedSecrets checks for sensitive keys in values */}} -{{- define "grafana.assertNoLeakedSecrets" -}} - {{- $sensitiveKeysYaml := ` -sensitiveKeys: -- path: ["database", "password"] -- path: ["smtp", "password"] -- path: ["security", "secret_key"] -- path: ["security", "admin_password"] -- path: ["auth.basic", "password"] -- path: ["auth.ldap", "bind_password"] -- path: ["auth.google", "client_secret"] -- path: ["auth.github", "client_secret"] -- path: ["auth.gitlab", "client_secret"] -- path: ["auth.generic_oauth", "client_secret"] -- path: ["auth.okta", "client_secret"] -- path: ["auth.azuread", "client_secret"] -- path: ["auth.grafana_com", "client_secret"] -- path: ["auth.grafananet", "client_secret"] -- path: ["azure", "user_identity_client_secret"] -- path: ["unified_alerting", "ha_redis_password"] -- path: ["metrics", "basic_auth_password"] -- path: ["external_image_storage.s3", "secret_key"] -- path: ["external_image_storage.webdav", "password"] -- path: ["external_image_storage.azure_blob", "account_key"] -` | fromYaml -}} - {{- if $.Values.assertNoLeakedSecrets -}} - {{- $grafanaIni := index .Values "grafana.ini" -}} - {{- range $_, $secret := $sensitiveKeysYaml.sensitiveKeys -}} - {{- $currentMap := $grafanaIni -}} - {{- $shouldContinue := true -}} - {{- range $index, $elem := $secret.path -}} - {{- if and $shouldContinue (hasKey $currentMap $elem) -}} - {{- if eq (len $secret.path) (add1 $index) -}} - {{- if not (regexMatch "\\$(?:__(?:env|file|vault))?{[^}]+}" (index $currentMap $elem)) -}} - {{- fail (printf "Sensitive key '%s' should not be defined explicitly in values. Use variable expansion instead. You can disable this client-side validation by changing the value of assertNoLeakedSecrets." (join "." $secret.path)) -}} - {{- end -}} - {{- else -}} - {{- $currentMap = index $currentMap $elem -}} - {{- end -}} - {{- else -}} - {{- $shouldContinue = false -}} - {{- end -}} - {{- end -}} - {{- end -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/_pod.tpl b/thunder_deployment/infra/beta9/charts/grafana/templates/_pod.tpl deleted file mode 100644 index 80fb46609..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/_pod.tpl +++ /dev/null @@ -1,1296 +0,0 @@ -{{- define "grafana.pod" -}} -{{- $sts := list "sts" "StatefulSet" "statefulset" -}} -{{- $root := . -}} -{{- with .Values.schedulerName }} -schedulerName: "{{ . }}" -{{- end }} -serviceAccountName: {{ include "grafana.serviceAccountName" . }} -automountServiceAccountToken: {{ .Values.serviceAccount.autoMount }} -{{- with .Values.securityContext }} -securityContext: - {{- toYaml . | nindent 2 }} -{{- end }} -{{- with .Values.hostAliases }} -hostAliases: - {{- toYaml . | nindent 2 }} -{{- end }} -{{- if .Values.dnsPolicy }} -dnsPolicy: {{ .Values.dnsPolicy }} -{{- end }} -{{- with .Values.dnsConfig }} -dnsConfig: - {{- toYaml . | nindent 2 }} -{{- end }} -{{- with .Values.priorityClassName }} -priorityClassName: {{ . }} -{{- end }} -{{- if ( or .Values.persistence.enabled .Values.dashboards .Values.extraInitContainers (and .Values.sidecar.alerts.enabled .Values.sidecar.alerts.initAlerts) (and .Values.sidecar.datasources.enabled .Values.sidecar.datasources.initDatasources) (and .Values.sidecar.notifiers.enabled .Values.sidecar.notifiers.initNotifiers)) }} -initContainers: -{{- end }} -{{- if ( and .Values.persistence.enabled .Values.initChownData.enabled ) }} - - name: init-chown-data - {{- $registry := .Values.global.imageRegistry | default .Values.initChownData.image.registry -}} - {{- if .Values.initChownData.image.sha }} - image: "{{ $registry }}/{{ .Values.initChownData.image.repository }}:{{ .Values.initChownData.image.tag }}@sha256:{{ .Values.initChownData.image.sha }}" - {{- else }} - image: "{{ $registry }}/{{ .Values.initChownData.image.repository }}:{{ .Values.initChownData.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.initChownData.image.pullPolicy }} - {{- with .Values.initChownData.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - command: - - chown - - -R - - {{ .Values.securityContext.runAsUser }}:{{ .Values.securityContext.runAsGroup }} - - /var/lib/grafana - {{- with .Values.initChownData.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: storage - mountPath: "/var/lib/grafana" - {{- with .Values.persistence.subPath }} - subPath: {{ tpl . $root }} - {{- end }} -{{- end }} -{{- if .Values.dashboards }} - - name: download-dashboards - {{- $registry := .Values.global.imageRegistry | default .Values.downloadDashboardsImage.registry -}} - {{- if .Values.downloadDashboardsImage.sha }} - image: "{{ $registry }}/{{ .Values.downloadDashboardsImage.repository }}:{{ .Values.downloadDashboardsImage.tag }}@sha256:{{ .Values.downloadDashboardsImage.sha }}" - {{- else }} - image: "{{ $registry }}/{{ .Values.downloadDashboardsImage.repository }}:{{ .Values.downloadDashboardsImage.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.downloadDashboardsImage.pullPolicy }} - command: ["/bin/sh"] - args: [ "-c", "mkdir -p /var/lib/grafana/dashboards/default && /bin/sh -x /etc/grafana/download_dashboards.sh" ] - {{- with .Values.downloadDashboards.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - env: - {{- range $key, $value := .Values.downloadDashboards.env }} - - name: "{{ $key }}" - value: "{{ $value }}" - {{- end }} - {{- range $key, $value := .Values.downloadDashboards.envValueFrom }} - - name: {{ $key | quote }} - valueFrom: - {{- tpl (toYaml $value) $ | nindent 10 }} - {{- end }} - {{- with .Values.downloadDashboards.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.downloadDashboards.envFromSecret }} - envFrom: - - secretRef: - name: {{ tpl . $root }} - {{- end }} - volumeMounts: - - name: config - mountPath: "/etc/grafana/download_dashboards.sh" - subPath: download_dashboards.sh - - name: storage - mountPath: "/var/lib/grafana" - {{- with .Values.persistence.subPath }} - subPath: {{ tpl . $root }} - {{- end }} - {{- range .Values.extraSecretMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - readOnly: {{ .readOnly }} - {{- end }} -{{- end }} -{{- if and .Values.sidecar.alerts.enabled .Values.sidecar.alerts.initAlerts }} - - name: {{ include "grafana.name" . }}-init-sc-alerts - {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} - {{- if .Values.sidecar.image.sha }} - image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" - {{- else }} - image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - {{- range $key, $value := .Values.sidecar.alerts.env }} - - name: "{{ $key }}" - value: "{{ $value }}" - {{- end }} - {{- if .Values.sidecar.alerts.ignoreAlreadyProcessed }} - - name: IGNORE_ALREADY_PROCESSED - value: "true" - {{- end }} - - name: METHOD - value: "LIST" - - name: LABEL - value: "{{ .Values.sidecar.alerts.label }}" - {{- with .Values.sidecar.alerts.labelValue }} - - name: LABEL_VALUE - value: {{ quote . }} - {{- end }} - {{- if or .Values.sidecar.logLevel .Values.sidecar.alerts.logLevel }} - - name: LOG_LEVEL - value: {{ default .Values.sidecar.logLevel .Values.sidecar.alerts.logLevel }} - {{- end }} - - name: FOLDER - value: "/etc/grafana/provisioning/alerting" - - name: RESOURCE - value: {{ quote .Values.sidecar.alerts.resource }} - {{- with .Values.sidecar.enableUniqueFilenames }} - - name: UNIQUE_FILENAMES - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.alerts.searchNamespace }} - - name: NAMESPACE - value: {{ . | join "," | quote }} - {{- end }} - {{- with .Values.sidecar.alerts.skipTlsVerify }} - - name: SKIP_TLS_VERIFY - value: {{ quote . }} - {{- end }} - {{- with .Values.sidecar.alerts.script }} - - name: SCRIPT - value: {{ quote . }} - {{- end }} - {{- with .Values.sidecar.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: sc-alerts-volume - mountPath: "/etc/grafana/provisioning/alerting" - {{- with .Values.sidecar.alerts.extraMounts }} - {{- toYaml . | trim | nindent 6 }} - {{- end }} -{{- end }} -{{- if and .Values.sidecar.datasources.enabled .Values.sidecar.datasources.initDatasources }} - - name: {{ include "grafana.name" . }}-init-sc-datasources - {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} - {{- if .Values.sidecar.image.sha }} - image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" - {{- else }} - image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - {{- range $key, $value := .Values.sidecar.datasources.env }} - - name: "{{ $key }}" - value: "{{ $value }}" - {{- end }} - {{- if .Values.sidecar.datasources.ignoreAlreadyProcessed }} - - name: IGNORE_ALREADY_PROCESSED - value: "true" - {{- end }} - - name: METHOD - value: "LIST" - - name: LABEL - value: "{{ .Values.sidecar.datasources.label }}" - {{- with .Values.sidecar.datasources.labelValue }} - - name: LABEL_VALUE - value: {{ quote . }} - {{- end }} - {{- if or .Values.sidecar.logLevel .Values.sidecar.datasources.logLevel }} - - name: LOG_LEVEL - value: {{ default .Values.sidecar.logLevel .Values.sidecar.datasources.logLevel }} - {{- end }} - - name: FOLDER - value: "/etc/grafana/provisioning/datasources" - - name: RESOURCE - value: {{ quote .Values.sidecar.datasources.resource }} - {{- with .Values.sidecar.enableUniqueFilenames }} - - name: UNIQUE_FILENAMES - value: "{{ . }}" - {{- end }} - {{- if .Values.sidecar.datasources.searchNamespace }} - - name: NAMESPACE - value: "{{ tpl (.Values.sidecar.datasources.searchNamespace | join ",") . }}" - {{- end }} - {{- with .Values.sidecar.skipTlsVerify }} - - name: SKIP_TLS_VERIFY - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: sc-datasources-volume - mountPath: "/etc/grafana/provisioning/datasources" -{{- end }} -{{- if and .Values.sidecar.notifiers.enabled .Values.sidecar.notifiers.initNotifiers }} - - name: {{ include "grafana.name" . }}-init-sc-notifiers - {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} - {{- if .Values.sidecar.image.sha }} - image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" - {{- else }} - image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - {{- range $key, $value := .Values.sidecar.notifiers.env }} - - name: "{{ $key }}" - value: "{{ $value }}" - {{- end }} - {{- if .Values.sidecar.notifiers.ignoreAlreadyProcessed }} - - name: IGNORE_ALREADY_PROCESSED - value: "true" - {{- end }} - - name: METHOD - value: LIST - - name: LABEL - value: "{{ .Values.sidecar.notifiers.label }}" - {{- with .Values.sidecar.notifiers.labelValue }} - - name: LABEL_VALUE - value: {{ quote . }} - {{- end }} - {{- if or .Values.sidecar.logLevel .Values.sidecar.notifiers.logLevel }} - - name: LOG_LEVEL - value: {{ default .Values.sidecar.logLevel .Values.sidecar.notifiers.logLevel }} - {{- end }} - - name: FOLDER - value: "/etc/grafana/provisioning/notifiers" - - name: RESOURCE - value: {{ quote .Values.sidecar.notifiers.resource }} - {{- with .Values.sidecar.enableUniqueFilenames }} - - name: UNIQUE_FILENAMES - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.notifiers.searchNamespace }} - - name: NAMESPACE - value: "{{ tpl (. | join ",") $root }}" - {{- end }} - {{- with .Values.sidecar.skipTlsVerify }} - - name: SKIP_TLS_VERIFY - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: sc-notifiers-volume - mountPath: "/etc/grafana/provisioning/notifiers" -{{- end}} -{{- with .Values.extraInitContainers }} - {{- tpl (toYaml .) $root | nindent 2 }} -{{- end }} -{{- if or .Values.image.pullSecrets .Values.global.imagePullSecrets }} -imagePullSecrets: - {{- include "grafana.imagePullSecrets" (dict "root" $root "imagePullSecrets" .Values.image.pullSecrets) | nindent 2 }} -{{- end }} -{{- if not .Values.enableKubeBackwardCompatibility }} -enableServiceLinks: {{ .Values.enableServiceLinks }} -{{- end }} -containers: -{{- if and .Values.sidecar.alerts.enabled (not .Values.sidecar.alerts.initAlerts) }} - - name: {{ include "grafana.name" . }}-sc-alerts - {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} - {{- if .Values.sidecar.image.sha }} - image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" - {{- else }} - image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - {{- range $key, $value := .Values.sidecar.alerts.env }} - - name: "{{ $key }}" - value: "{{ $value }}" - {{- end }} - {{- if .Values.sidecar.alerts.ignoreAlreadyProcessed }} - - name: IGNORE_ALREADY_PROCESSED - value: "true" - {{- end }} - - name: METHOD - value: {{ .Values.sidecar.alerts.watchMethod }} - - name: LABEL - value: "{{ .Values.sidecar.alerts.label }}" - {{- with .Values.sidecar.alerts.labelValue }} - - name: LABEL_VALUE - value: {{ quote . }} - {{- end }} - {{- if or .Values.sidecar.logLevel .Values.sidecar.alerts.logLevel }} - - name: LOG_LEVEL - value: {{ default .Values.sidecar.logLevel .Values.sidecar.alerts.logLevel }} - {{- end }} - - name: FOLDER - value: "/etc/grafana/provisioning/alerting" - - name: RESOURCE - value: {{ quote .Values.sidecar.alerts.resource }} - {{- with .Values.sidecar.enableUniqueFilenames }} - - name: UNIQUE_FILENAMES - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.alerts.searchNamespace }} - - name: NAMESPACE - value: {{ . | join "," | quote }} - {{- end }} - {{- with .Values.sidecar.alerts.skipTlsVerify }} - - name: SKIP_TLS_VERIFY - value: {{ quote . }} - {{- end }} - {{- with .Values.sidecar.alerts.script }} - - name: SCRIPT - value: {{ quote . }} - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_USER) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_USERNAME - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.userKey | default "admin-user" }} - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_PASSWORD - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.passwordKey | default "admin-password" }} - {{- end }} - {{- if not .Values.sidecar.alerts.skipReload }} - - name: REQ_URL - value: {{ .Values.sidecar.alerts.reloadURL }} - - name: REQ_METHOD - value: POST - {{- end }} - {{- if .Values.sidecar.alerts.watchServerTimeout }} - {{- if ne .Values.sidecar.alerts.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.alerts.watchServerTimeout with .Values.sidecar.alerts.watchMethod %s" .Values.sidecar.alerts.watchMethod) }} - {{- end }} - - name: WATCH_SERVER_TIMEOUT - value: "{{ .Values.sidecar.alerts.watchServerTimeout }}" - {{- end }} - {{- if .Values.sidecar.alerts.watchClientTimeout }} - {{- if ne .Values.sidecar.alerts.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.alerts.watchClientTimeout with .Values.sidecar.alerts.watchMethod %s" .Values.sidecar.alerts.watchMethod) }} - {{- end }} - - name: WATCH_CLIENT_TIMEOUT - value: "{{ .Values.sidecar.alerts.watchClientTimeout }}" - {{- end }} - {{- with .Values.sidecar.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: sc-alerts-volume - mountPath: "/etc/grafana/provisioning/alerting" - {{- with .Values.sidecar.alerts.extraMounts }} - {{- toYaml . | trim | nindent 6 }} - {{- end }} -{{- end}} -{{- if .Values.sidecar.dashboards.enabled }} - - name: {{ include "grafana.name" . }}-sc-dashboard - {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} - {{- if .Values.sidecar.image.sha }} - image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" - {{- else }} - image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - {{- range $key, $value := .Values.sidecar.dashboards.env }} - - name: "{{ $key }}" - value: "{{ $value }}" - {{- end }} - {{- range $key, $value := .Values.sidecar.datasources.envValueFrom }} - - name: {{ $key | quote }} - valueFrom: - {{- tpl (toYaml $value) $ | nindent 10 }} - {{- end }} - {{- if .Values.sidecar.dashboards.ignoreAlreadyProcessed }} - - name: IGNORE_ALREADY_PROCESSED - value: "true" - {{- end }} - - name: METHOD - value: {{ .Values.sidecar.dashboards.watchMethod }} - - name: LABEL - value: "{{ .Values.sidecar.dashboards.label }}" - {{- with .Values.sidecar.dashboards.labelValue }} - - name: LABEL_VALUE - value: {{ quote . }} - {{- end }} - {{- if or .Values.sidecar.logLevel .Values.sidecar.dashboards.logLevel }} - - name: LOG_LEVEL - value: {{ default .Values.sidecar.logLevel .Values.sidecar.dashboards.logLevel }} - {{- end }} - - name: FOLDER - value: "{{ .Values.sidecar.dashboards.folder }}{{- with .Values.sidecar.dashboards.defaultFolderName }}/{{ . }}{{- end }}" - - name: RESOURCE - value: {{ quote .Values.sidecar.dashboards.resource }} - {{- with .Values.sidecar.enableUniqueFilenames }} - - name: UNIQUE_FILENAMES - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.dashboards.searchNamespace }} - - name: NAMESPACE - value: "{{ tpl (. | join ",") $root }}" - {{- end }} - {{- with .Values.sidecar.skipTlsVerify }} - - name: SKIP_TLS_VERIFY - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.dashboards.folderAnnotation }} - - name: FOLDER_ANNOTATION - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.dashboards.script }} - - name: SCRIPT - value: "{{ . }}" - {{- end }} - {{- if not .Values.sidecar.dashboards.skipReload }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_USER) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_USERNAME - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.userKey | default "admin-user" }} - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_PASSWORD - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.passwordKey | default "admin-password" }} - {{- end }} - - name: REQ_URL - value: {{ .Values.sidecar.dashboards.reloadURL }} - - name: REQ_METHOD - value: POST - {{- end }} - {{- if .Values.sidecar.dashboards.watchServerTimeout }} - {{- if ne .Values.sidecar.dashboards.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.dashboards.watchServerTimeout with .Values.sidecar.dashboards.watchMethod %s" .Values.sidecar.dashboards.watchMethod) }} - {{- end }} - - name: WATCH_SERVER_TIMEOUT - value: "{{ .Values.sidecar.dashboards.watchServerTimeout }}" - {{- end }} - {{- if .Values.sidecar.dashboards.watchClientTimeout }} - {{- if ne .Values.sidecar.dashboards.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.dashboards.watchClientTimeout with .Values.sidecar.dashboards.watchMethod %s" .Values.sidecar.dashboards.watchMethod) }} - {{- end }} - - name: WATCH_CLIENT_TIMEOUT - value: {{ .Values.sidecar.dashboards.watchClientTimeout | quote }} - {{- end }} - {{- with .Values.sidecar.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: sc-dashboard-volume - mountPath: {{ .Values.sidecar.dashboards.folder | quote }} - {{- with .Values.sidecar.dashboards.extraMounts }} - {{- toYaml . | trim | nindent 6 }} - {{- end }} -{{- end}} -{{- if and .Values.sidecar.datasources.enabled (not .Values.sidecar.datasources.initDatasources) }} - - name: {{ include "grafana.name" . }}-sc-datasources - {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} - {{- if .Values.sidecar.image.sha }} - image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" - {{- else }} - image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - {{- range $key, $value := .Values.sidecar.datasources.env }} - - name: "{{ $key }}" - value: "{{ $value }}" - {{- end }} - {{- if .Values.sidecar.datasources.ignoreAlreadyProcessed }} - - name: IGNORE_ALREADY_PROCESSED - value: "true" - {{- end }} - - name: METHOD - value: {{ .Values.sidecar.datasources.watchMethod }} - - name: LABEL - value: "{{ .Values.sidecar.datasources.label }}" - {{- with .Values.sidecar.datasources.labelValue }} - - name: LABEL_VALUE - value: {{ quote . }} - {{- end }} - {{- if or .Values.sidecar.logLevel .Values.sidecar.datasources.logLevel }} - - name: LOG_LEVEL - value: {{ default .Values.sidecar.logLevel .Values.sidecar.datasources.logLevel }} - {{- end }} - - name: FOLDER - value: "/etc/grafana/provisioning/datasources" - - name: RESOURCE - value: {{ quote .Values.sidecar.datasources.resource }} - {{- with .Values.sidecar.enableUniqueFilenames }} - - name: UNIQUE_FILENAMES - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.datasources.searchNamespace }} - - name: NAMESPACE - value: "{{ tpl (. | join ",") $root }}" - {{- end }} - {{- if .Values.sidecar.skipTlsVerify }} - - name: SKIP_TLS_VERIFY - value: "{{ .Values.sidecar.skipTlsVerify }}" - {{- end }} - {{- if .Values.sidecar.datasources.script }} - - name: SCRIPT - value: "{{ .Values.sidecar.datasources.script }}" - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_USER) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_USERNAME - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.userKey | default "admin-user" }} - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_PASSWORD - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.passwordKey | default "admin-password" }} - {{- end }} - {{- if not .Values.sidecar.datasources.skipReload }} - - name: REQ_URL - value: {{ .Values.sidecar.datasources.reloadURL }} - - name: REQ_METHOD - value: POST - {{- end }} - {{- if .Values.sidecar.datasources.watchServerTimeout }} - {{- if ne .Values.sidecar.datasources.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.datasources.watchServerTimeout with .Values.sidecar.datasources.watchMethod %s" .Values.sidecar.datasources.watchMethod) }} - {{- end }} - - name: WATCH_SERVER_TIMEOUT - value: "{{ .Values.sidecar.datasources.watchServerTimeout }}" - {{- end }} - {{- if .Values.sidecar.datasources.watchClientTimeout }} - {{- if ne .Values.sidecar.datasources.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.datasources.watchClientTimeout with .Values.sidecar.datasources.watchMethod %s" .Values.sidecar.datasources.watchMethod) }} - {{- end }} - - name: WATCH_CLIENT_TIMEOUT - value: "{{ .Values.sidecar.datasources.watchClientTimeout }}" - {{- end }} - {{- with .Values.sidecar.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: sc-datasources-volume - mountPath: "/etc/grafana/provisioning/datasources" -{{- end}} -{{- if .Values.sidecar.notifiers.enabled }} - - name: {{ include "grafana.name" . }}-sc-notifiers - {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} - {{- if .Values.sidecar.image.sha }} - image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" - {{- else }} - image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - {{- range $key, $value := .Values.sidecar.notifiers.env }} - - name: "{{ $key }}" - value: "{{ $value }}" - {{- end }} - {{- if .Values.sidecar.notifiers.ignoreAlreadyProcessed }} - - name: IGNORE_ALREADY_PROCESSED - value: "true" - {{- end }} - - name: METHOD - value: {{ .Values.sidecar.notifiers.watchMethod }} - - name: LABEL - value: "{{ .Values.sidecar.notifiers.label }}" - {{- with .Values.sidecar.notifiers.labelValue }} - - name: LABEL_VALUE - value: {{ quote . }} - {{- end }} - {{- if or .Values.sidecar.logLevel .Values.sidecar.notifiers.logLevel }} - - name: LOG_LEVEL - value: {{ default .Values.sidecar.logLevel .Values.sidecar.notifiers.logLevel }} - {{- end }} - - name: FOLDER - value: "/etc/grafana/provisioning/notifiers" - - name: RESOURCE - value: {{ quote .Values.sidecar.notifiers.resource }} - {{- if .Values.sidecar.enableUniqueFilenames }} - - name: UNIQUE_FILENAMES - value: "{{ .Values.sidecar.enableUniqueFilenames }}" - {{- end }} - {{- with .Values.sidecar.notifiers.searchNamespace }} - - name: NAMESPACE - value: "{{ tpl (. | join ",") $root }}" - {{- end }} - {{- with .Values.sidecar.skipTlsVerify }} - - name: SKIP_TLS_VERIFY - value: "{{ . }}" - {{- end }} - {{- if .Values.sidecar.notifiers.script }} - - name: SCRIPT - value: "{{ .Values.sidecar.notifiers.script }}" - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_USER) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_USERNAME - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.userKey | default "admin-user" }} - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_PASSWORD - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.passwordKey | default "admin-password" }} - {{- end }} - {{- if not .Values.sidecar.notifiers.skipReload }} - - name: REQ_URL - value: {{ .Values.sidecar.notifiers.reloadURL }} - - name: REQ_METHOD - value: POST - {{- end }} - {{- if .Values.sidecar.notifiers.watchServerTimeout }} - {{- if ne .Values.sidecar.notifiers.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.notifiers.watchServerTimeout with .Values.sidecar.notifiers.watchMethod %s" .Values.sidecar.notifiers.watchMethod) }} - {{- end }} - - name: WATCH_SERVER_TIMEOUT - value: "{{ .Values.sidecar.notifiers.watchServerTimeout }}" - {{- end }} - {{- if .Values.sidecar.notifiers.watchClientTimeout }} - {{- if ne .Values.sidecar.notifiers.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.notifiers.watchClientTimeout with .Values.sidecar.notifiers.watchMethod %s" .Values.sidecar.notifiers.watchMethod) }} - {{- end }} - - name: WATCH_CLIENT_TIMEOUT - value: "{{ .Values.sidecar.notifiers.watchClientTimeout }}" - {{- end }} - {{- with .Values.sidecar.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: sc-notifiers-volume - mountPath: "/etc/grafana/provisioning/notifiers" -{{- end}} -{{- if .Values.sidecar.plugins.enabled }} - - name: {{ include "grafana.name" . }}-sc-plugins - {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} - {{- if .Values.sidecar.image.sha }} - image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" - {{- else }} - image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - {{- range $key, $value := .Values.sidecar.plugins.env }} - - name: "{{ $key }}" - value: "{{ $value }}" - {{- end }} - {{- if .Values.sidecar.plugins.ignoreAlreadyProcessed }} - - name: IGNORE_ALREADY_PROCESSED - value: "true" - {{- end }} - - name: METHOD - value: {{ .Values.sidecar.plugins.watchMethod }} - - name: LABEL - value: "{{ .Values.sidecar.plugins.label }}" - {{- if .Values.sidecar.plugins.labelValue }} - - name: LABEL_VALUE - value: {{ quote .Values.sidecar.plugins.labelValue }} - {{- end }} - {{- if or .Values.sidecar.logLevel .Values.sidecar.plugins.logLevel }} - - name: LOG_LEVEL - value: {{ default .Values.sidecar.logLevel .Values.sidecar.plugins.logLevel }} - {{- end }} - - name: FOLDER - value: "/etc/grafana/provisioning/plugins" - - name: RESOURCE - value: {{ quote .Values.sidecar.plugins.resource }} - {{- with .Values.sidecar.enableUniqueFilenames }} - - name: UNIQUE_FILENAMES - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.plugins.searchNamespace }} - - name: NAMESPACE - value: "{{ tpl (. | join ",") $root }}" - {{- end }} - {{- with .Values.sidecar.plugins.script }} - - name: SCRIPT - value: "{{ . }}" - {{- end }} - {{- with .Values.sidecar.skipTlsVerify }} - - name: SKIP_TLS_VERIFY - value: "{{ . }}" - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_USER) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_USERNAME - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.userKey | default "admin-user" }} - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: REQ_PASSWORD - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.passwordKey | default "admin-password" }} - {{- end }} - {{- if not .Values.sidecar.plugins.skipReload }} - - name: REQ_URL - value: {{ .Values.sidecar.plugins.reloadURL }} - - name: REQ_METHOD - value: POST - {{- end }} - {{- if .Values.sidecar.plugins.watchServerTimeout }} - {{- if ne .Values.sidecar.plugins.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.plugins.watchServerTimeout with .Values.sidecar.plugins.watchMethod %s" .Values.sidecar.plugins.watchMethod) }} - {{- end }} - - name: WATCH_SERVER_TIMEOUT - value: "{{ .Values.sidecar.plugins.watchServerTimeout }}" - {{- end }} - {{- if .Values.sidecar.plugins.watchClientTimeout }} - {{- if ne .Values.sidecar.plugins.watchMethod "WATCH" }} - {{- fail (printf "Cannot use .Values.sidecar.plugins.watchClientTimeout with .Values.sidecar.plugins.watchMethod %s" .Values.sidecar.plugins.watchMethod) }} - {{- end }} - - name: WATCH_CLIENT_TIMEOUT - value: "{{ .Values.sidecar.plugins.watchClientTimeout }}" - {{- end }} - {{- with .Values.sidecar.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.sidecar.securityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: sc-plugins-volume - mountPath: "/etc/grafana/provisioning/plugins" -{{- end}} - - name: {{ .Chart.Name }} - {{- $registry := .Values.global.imageRegistry | default .Values.image.registry -}} - {{- if .Values.image.sha }} - image: "{{ $registry }}/{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}@sha256:{{ .Values.image.sha }}" - {{- else }} - image: "{{ $registry }}/{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" - {{- end }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - {{- if .Values.command }} - command: - {{- range .Values.command }} - - {{ . | quote }} - {{- end }} - {{- end }} - {{- if .Values.args }} - args: - {{- range .Values.args }} - - {{ . | quote }} - {{- end }} - {{- end }} - {{- with .Values.containerSecurityContext }} - securityContext: - {{- toYaml . | nindent 6 }} - {{- end }} - volumeMounts: - - name: config - mountPath: "/etc/grafana/grafana.ini" - subPath: grafana.ini - {{- if .Values.ldap.enabled }} - - name: ldap - mountPath: "/etc/grafana/ldap.toml" - subPath: ldap.toml - {{- end }} - {{- range .Values.extraConfigmapMounts }} - - name: {{ tpl .name $root }} - mountPath: {{ tpl .mountPath $root }} - subPath: {{ tpl (.subPath | default "") $root }} - readOnly: {{ .readOnly }} - {{- end }} - - name: storage - mountPath: "/var/lib/grafana" - {{- with .Values.persistence.subPath }} - subPath: {{ tpl . $root }} - {{- end }} - {{- with .Values.dashboards }} - {{- range $provider, $dashboards := . }} - {{- range $key, $value := $dashboards }} - {{- if (or (hasKey $value "json") (hasKey $value "file")) }} - - name: dashboards-{{ $provider }} - mountPath: "/var/lib/grafana/dashboards/{{ $provider }}/{{ $key }}.json" - subPath: "{{ $key }}.json" - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- with .Values.dashboardsConfigMaps }} - {{- range (keys . | sortAlpha) }} - - name: dashboards-{{ . }} - mountPath: "/var/lib/grafana/dashboards/{{ . }}" - {{- end }} - {{- end }} - {{- with .Values.datasources }} - {{- $datasources := . }} - {{- range (keys . | sortAlpha) }} - {{- if (or (hasKey (index $datasources .) "secret")) }} {{/*check if current datasource should be handeled as secret */}} - - name: config-secret - mountPath: "/etc/grafana/provisioning/datasources/{{ . }}" - subPath: {{ . | quote }} - {{- else }} - - name: config - mountPath: "/etc/grafana/provisioning/datasources/{{ . }}" - subPath: {{ . | quote }} - {{- end }} - {{- end }} - {{- end }} - {{- with .Values.notifiers }} - {{- $notifiers := . }} - {{- range (keys . | sortAlpha) }} - {{- if (or (hasKey (index $notifiers .) "secret")) }} {{/*check if current notifier should be handeled as secret */}} - - name: config-secret - mountPath: "/etc/grafana/provisioning/notifiers/{{ . }}" - subPath: {{ . | quote }} - {{- else }} - - name: config - mountPath: "/etc/grafana/provisioning/notifiers/{{ . }}" - subPath: {{ . | quote }} - {{- end }} - {{- end }} - {{- end }} - {{- with .Values.alerting }} - {{- $alertingmap := .}} - {{- range (keys . | sortAlpha) }} - {{- if (or (hasKey (index $.Values.alerting .) "secret") (hasKey (index $.Values.alerting .) "secretFile")) }} {{/*check if current alerting entry should be handeled as secret */}} - - name: config-secret - mountPath: "/etc/grafana/provisioning/alerting/{{ . }}" - subPath: {{ . | quote }} - {{- else }} - - name: config - mountPath: "/etc/grafana/provisioning/alerting/{{ . }}" - subPath: {{ . | quote }} - {{- end }} - {{- end }} - {{- end }} - {{- with .Values.dashboardProviders }} - {{- range (keys . | sortAlpha) }} - - name: config - mountPath: "/etc/grafana/provisioning/dashboards/{{ . }}" - subPath: {{ . | quote }} - {{- end }} - {{- end }} - {{- with .Values.sidecar.alerts.enabled }} - - name: sc-alerts-volume - mountPath: "/etc/grafana/provisioning/alerting" - {{- end}} - {{- if .Values.sidecar.dashboards.enabled }} - - name: sc-dashboard-volume - mountPath: {{ .Values.sidecar.dashboards.folder | quote }} - {{- if .Values.sidecar.dashboards.SCProvider }} - - name: sc-dashboard-provider - mountPath: "/etc/grafana/provisioning/dashboards/sc-dashboardproviders.yaml" - subPath: provider.yaml - {{- end}} - {{- end}} - {{- if .Values.sidecar.datasources.enabled }} - - name: sc-datasources-volume - mountPath: "/etc/grafana/provisioning/datasources" - {{- end}} - {{- if .Values.sidecar.plugins.enabled }} - - name: sc-plugins-volume - mountPath: "/etc/grafana/provisioning/plugins" - {{- end}} - {{- if .Values.sidecar.notifiers.enabled }} - - name: sc-notifiers-volume - mountPath: "/etc/grafana/provisioning/notifiers" - {{- end}} - {{- range .Values.extraSecretMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - readOnly: {{ .readOnly }} - subPath: {{ .subPath | default "" }} - {{- end }} - {{- range .Values.extraVolumeMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath | default "" }} - readOnly: {{ .readOnly }} - {{- end }} - {{- range .Values.extraEmptyDirMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - {{- end }} - ports: - - name: {{ .Values.podPortName }} - containerPort: {{ .Values.service.targetPort }} - protocol: TCP - - name: {{ .Values.gossipPortName }}-tcp - containerPort: 9094 - protocol: TCP - - name: {{ .Values.gossipPortName }}-udp - containerPort: 9094 - protocol: UDP - env: - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - {{- if and (not .Values.env.GF_SECURITY_ADMIN_USER) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: GF_SECURITY_ADMIN_USER - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.userKey | default "admin-user" }} - {{- end }} - {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - - name: GF_SECURITY_ADMIN_PASSWORD - valueFrom: - secretKeyRef: - name: {{ (tpl .Values.admin.existingSecret .) | default (include "grafana.fullname" .) }} - key: {{ .Values.admin.passwordKey | default "admin-password" }} - {{- end }} - {{- if .Values.plugins }} - - name: GF_INSTALL_PLUGINS - valueFrom: - configMapKeyRef: - name: {{ include "grafana.fullname" . }} - key: plugins - {{- end }} - {{- if .Values.smtp.existingSecret }} - - name: GF_SMTP_USER - valueFrom: - secretKeyRef: - name: {{ .Values.smtp.existingSecret }} - key: {{ .Values.smtp.userKey | default "user" }} - - name: GF_SMTP_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.smtp.existingSecret }} - key: {{ .Values.smtp.passwordKey | default "password" }} - {{- end }} - {{- if .Values.imageRenderer.enabled }} - - name: GF_RENDERING_SERVER_URL - value: http://{{ include "grafana.fullname" . }}-image-renderer.{{ include "grafana.namespace" . }}:{{ .Values.imageRenderer.service.port }}/render - - name: GF_RENDERING_CALLBACK_URL - value: {{ .Values.imageRenderer.grafanaProtocol }}://{{ include "grafana.fullname" . }}.{{ include "grafana.namespace" . }}:{{ .Values.service.port }}/{{ .Values.imageRenderer.grafanaSubPath }} - {{- end }} - - name: GF_PATHS_DATA - value: {{ (get .Values "grafana.ini").paths.data }} - - name: GF_PATHS_LOGS - value: {{ (get .Values "grafana.ini").paths.logs }} - - name: GF_PATHS_PLUGINS - value: {{ (get .Values "grafana.ini").paths.plugins }} - - name: GF_PATHS_PROVISIONING - value: {{ (get .Values "grafana.ini").paths.provisioning }} - {{- range $key, $value := .Values.envValueFrom }} - - name: {{ $key | quote }} - valueFrom: - {{- tpl (toYaml $value) $ | nindent 10 }} - {{- end }} - {{- range $key, $value := .Values.env }} - - name: "{{ tpl $key $ }}" - value: "{{ tpl (print $value) $ }}" - {{- end }} - {{- if or .Values.envFromSecret (or .Values.envRenderSecret .Values.envFromSecrets) .Values.envFromConfigMaps }} - envFrom: - {{- if .Values.envFromSecret }} - - secretRef: - name: {{ tpl .Values.envFromSecret . }} - {{- end }} - {{- if .Values.envRenderSecret }} - - secretRef: - name: {{ include "grafana.fullname" . }}-env - {{- end }} - {{- range .Values.envFromSecrets }} - - secretRef: - name: {{ tpl .name $ }} - optional: {{ .optional | default false }} - {{- if .prefix }} - prefix: {{ tpl .prefix $ }} - {{- end }} - {{- end }} - {{- range .Values.envFromConfigMaps }} - - configMapRef: - name: {{ tpl .name $ }} - optional: {{ .optional | default false }} - {{- if .prefix }} - prefix: {{ tpl .prefix $ }} - {{- end }} - {{- end }} - {{- end }} - {{- with .Values.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.lifecycleHooks }} - lifecycle: - {{- tpl (toYaml .) $root | nindent 6 }} - {{- end }} - {{- with .Values.resources }} - resources: - {{- toYaml . | nindent 6 }} - {{- end }} -{{- with .Values.extraContainers }} - {{- tpl . $ | nindent 2 }} -{{- end }} -{{- with .Values.nodeSelector }} -nodeSelector: - {{- toYaml . | nindent 2 }} -{{- end }} -{{- with .Values.affinity }} -affinity: - {{- tpl (toYaml .) $root | nindent 2 }} -{{- end }} -{{- with .Values.topologySpreadConstraints }} -topologySpreadConstraints: - {{- toYaml . | nindent 2 }} -{{- end }} -{{- with .Values.tolerations }} -tolerations: - {{- toYaml . | nindent 2 }} -{{- end }} -volumes: - - name: config - configMap: - name: {{ include "grafana.fullname" . }} - {{- $createConfigSecret := eq (include "grafana.shouldCreateConfigSecret" .) "true" -}} - {{- if and .Values.createConfigmap $createConfigSecret }} - - name: config-secret - secret: - secretName: {{ include "grafana.fullname" . }}-config-secret - {{- end }} - {{- range .Values.extraConfigmapMounts }} - - name: {{ tpl .name $root }} - configMap: - name: {{ tpl .configMap $root }} - {{- with .items }} - items: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- end }} - {{- if .Values.dashboards }} - {{- range (keys .Values.dashboards | sortAlpha) }} - - name: dashboards-{{ . }} - configMap: - name: {{ include "grafana.fullname" $ }}-dashboards-{{ . }} - {{- end }} - {{- end }} - {{- if .Values.dashboardsConfigMaps }} - {{- range $provider, $name := .Values.dashboardsConfigMaps }} - - name: dashboards-{{ $provider }} - configMap: - name: {{ tpl $name $root }} - {{- end }} - {{- end }} - {{- if .Values.ldap.enabled }} - - name: ldap - secret: - {{- if .Values.ldap.existingSecret }} - secretName: {{ .Values.ldap.existingSecret }} - {{- else }} - secretName: {{ include "grafana.fullname" . }} - {{- end }} - items: - - key: ldap-toml - path: ldap.toml - {{- end }} - {{- if and .Values.persistence.enabled (eq .Values.persistence.type "pvc") }} - - name: storage - persistentVolumeClaim: - claimName: {{ tpl (.Values.persistence.existingClaim | default (include "grafana.fullname" .)) . }} - {{- else if and .Values.persistence.enabled (has .Values.persistence.type $sts) }} - {{/* nothing */}} - {{- else }} - - name: storage - {{- if .Values.persistence.inMemory.enabled }} - emptyDir: - medium: Memory - {{- with .Values.persistence.inMemory.sizeLimit }} - sizeLimit: {{ . }} - {{- end }} - {{- else }} - emptyDir: {} - {{- end }} - {{- end }} - {{- if .Values.sidecar.alerts.enabled }} - - name: sc-alerts-volume - emptyDir: - {{- with .Values.sidecar.alerts.sizeLimit }} - sizeLimit: {{ . }} - {{- else }} - {} - {{- end }} - {{- end }} - {{- if .Values.sidecar.dashboards.enabled }} - - name: sc-dashboard-volume - emptyDir: - {{- with .Values.sidecar.dashboards.sizeLimit }} - sizeLimit: {{ . }} - {{- else }} - {} - {{- end }} - {{- if .Values.sidecar.dashboards.SCProvider }} - - name: sc-dashboard-provider - configMap: - name: {{ include "grafana.fullname" . }}-config-dashboards - {{- end }} - {{- end }} - {{- if .Values.sidecar.datasources.enabled }} - - name: sc-datasources-volume - emptyDir: - {{- with .Values.sidecar.datasources.sizeLimit }} - sizeLimit: {{ . }} - {{- else }} - {} - {{- end }} - {{- end }} - {{- if .Values.sidecar.plugins.enabled }} - - name: sc-plugins-volume - emptyDir: - {{- with .Values.sidecar.plugins.sizeLimit }} - sizeLimit: {{ . }} - {{- else }} - {} - {{- end }} - {{- end }} - {{- if .Values.sidecar.notifiers.enabled }} - - name: sc-notifiers-volume - emptyDir: - {{- with .Values.sidecar.notifiers.sizeLimit }} - sizeLimit: {{ . }} - {{- else }} - {} - {{- end }} - {{- end }} - {{- range .Values.extraSecretMounts }} - {{- if .secretName }} - - name: {{ .name }} - secret: - secretName: {{ .secretName }} - defaultMode: {{ .defaultMode }} - {{- with .items }} - items: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- else if .projected }} - - name: {{ .name }} - projected: - {{- toYaml .projected | nindent 6 }} - {{- else if .csi }} - - name: {{ .name }} - csi: - {{- toYaml .csi | nindent 6 }} - {{- end }} - {{- end }} - {{- range .Values.extraVolumes }} - - name: {{ .name }} - {{- if .existingClaim }} - persistentVolumeClaim: - claimName: {{ .existingClaim }} - {{- else if .hostPath }} - hostPath: - {{ toYaml .hostPath | nindent 6 }} - {{- else if .csi }} - csi: - {{- toYaml .csi | nindent 6 }} - {{- else if .configMap }} - configMap: - {{- toYaml .configMap | nindent 6 }} - {{- else if .emptyDir }} - emptyDir: - {{- toYaml .emptyDir | nindent 6 }} - {{- else }} - emptyDir: {} - {{- end }} - {{- end }} - {{- range .Values.extraEmptyDirMounts }} - - name: {{ .name }} - emptyDir: {} - {{- end }} - {{- with .Values.extraContainerVolumes }} - {{- tpl (toYaml .) $root | nindent 2 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/clusterrole.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/clusterrole.yaml deleted file mode 100644 index 3af4b62b6..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/clusterrole.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if and .Values.rbac.create (or (not .Values.rbac.namespaced) .Values.rbac.extraClusterRoleRules) (not .Values.rbac.useExistingClusterRole) }} -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "grafana.fullname" . }}-clusterrole -{{- if or .Values.sidecar.dashboards.enabled .Values.rbac.extraClusterRoleRules .Values.sidecar.datasources.enabled .Values.sidecar.plugins.enabled .Values.sidecar.alerts.enabled }} -rules: - {{- if or .Values.sidecar.dashboards.enabled .Values.sidecar.datasources.enabled .Values.sidecar.plugins.enabled .Values.sidecar.alerts.enabled }} - - apiGroups: [""] # "" indicates the core API group - resources: ["configmaps", "secrets"] - verbs: ["get", "watch", "list"] - {{- end}} - {{- with .Values.rbac.extraClusterRoleRules }} - {{- toYaml . | nindent 2 }} - {{- end}} -{{- else }} -rules: [] -{{- end}} -{{- end}} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/clusterrolebinding.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/clusterrolebinding.yaml deleted file mode 100644 index bda9431a2..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/clusterrolebinding.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- if and .Values.rbac.create (or (not .Values.rbac.namespaced) .Values.rbac.extraClusterRoleRules) }} -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: {{ include "grafana.fullname" . }}-clusterrolebinding - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -subjects: - - kind: ServiceAccount - name: {{ include "grafana.serviceAccountName" . }} - namespace: {{ include "grafana.namespace" . }} -roleRef: - kind: ClusterRole - {{- if .Values.rbac.useExistingClusterRole }} - name: {{ .Values.rbac.useExistingClusterRole }} - {{- else }} - name: {{ include "grafana.fullname" . }}-clusterrole - {{- end }} - apiGroup: rbac.authorization.k8s.io -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/configSecret.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/configSecret.yaml deleted file mode 100644 index 55574b9bb..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/configSecret.yaml +++ /dev/null @@ -1,43 +0,0 @@ -{{- $createConfigSecret := eq (include "grafana.shouldCreateConfigSecret" .) "true" -}} -{{- if and .Values.createConfigmap $createConfigSecret }} -{{- $files := .Files }} -{{- $root := . -}} -apiVersion: v1 -kind: Secret -metadata: - name: "{{ include "grafana.fullname" . }}-config-secret" - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -data: -{{- range $key, $value := .Values.alerting }} - {{- if (hasKey $value "secretFile") }} - {{- $key | nindent 2 }}: - {{- toYaml ( $files.Get $value.secretFile ) | b64enc | nindent 4}} - {{/* as of https://helm.sh/docs/chart_template_guide/accessing_files/ this will only work if you fork this chart and add files to it*/}} - {{- end }} -{{- end }} -stringData: -{{- range $key, $value := .Values.datasources }} -{{- if (hasKey $value "secret") }} -{{- $key | nindent 2 }}: | - {{- tpl (toYaml $value.secret | nindent 4) $root }} -{{- end }} -{{- end }} -{{- range $key, $value := .Values.notifiers }} -{{- if (hasKey $value "secret") }} -{{- $key | nindent 2 }}: | - {{- tpl (toYaml $value.secret | nindent 4) $root }} -{{- end }} -{{- end }} -{{- range $key, $value := .Values.alerting }} -{{ if (hasKey $value "secret") }} - {{- $key | nindent 2 }}: | - {{- tpl (toYaml $value.secret | nindent 4) $root }} - {{- end }} -{{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/configmap-dashboard-provider.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/configmap-dashboard-provider.yaml deleted file mode 100644 index b412c4d1f..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/configmap-dashboard-provider.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{- if and .Values.sidecar.dashboards.enabled .Values.sidecar.dashboards.SCProvider }} -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "grafana.fullname" . }}-config-dashboards - namespace: {{ include "grafana.namespace" . }} -data: - {{- include "grafana.configDashboardProviderData" . | nindent 2 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/configmap.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/configmap.yaml deleted file mode 100644 index 7d7428be5..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/configmap.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{- if .Values.createConfigmap }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -data: - {{- include "grafana.configData" . | nindent 2 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/dashboards-json-configmap.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/dashboards-json-configmap.yaml deleted file mode 100644 index b96ce7202..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/dashboards-json-configmap.yaml +++ /dev/null @@ -1,38 +0,0 @@ -{{- if .Values.dashboards }} -{{ $files := .Files }} -{{- range $provider, $dashboards := .Values.dashboards }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "grafana.fullname" $ }}-dashboards-{{ $provider }} - namespace: {{ include "grafana.namespace" $ }} - labels: - {{- include "grafana.labels" $ | nindent 4 }} - dashboard-provider: {{ $provider }} - {{- if $.Values.sidecar.dashboards.enabled }} - {{ $.Values.sidecar.dashboards.label }}: {{ $.Values.sidecar.dashboards.labelValue | quote }} - {{- end }} -{{- if $dashboards }} -data: -{{- $dashboardFound := false }} -{{- range $key, $value := $dashboards }} -{{- if (or (hasKey $value "json") (hasKey $value "file")) }} -{{- $dashboardFound = true }} - {{- print $key | nindent 2 }}.json: - {{- if hasKey $value "json" }} - |- - {{- $value.json | nindent 6 }} - {{- end }} - {{- if hasKey $value "file" }} - {{- toYaml ( $files.Get $value.file ) | nindent 4}} - {{- end }} -{{- end }} -{{- end }} -{{- if not $dashboardFound }} - {} -{{- end }} -{{- end }} ---- -{{- end }} - -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/deployment.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/deployment.yaml deleted file mode 100644 index 46c016faa..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/deployment.yaml +++ /dev/null @@ -1,53 +0,0 @@ -{{- if (and (not .Values.useStatefulSet) (or (not .Values.persistence.enabled) (eq .Values.persistence.type "pvc"))) }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if and (not .Values.autoscaling.enabled) (.Values.replicas) }} - replicas: {{ .Values.replicas }} - {{- end }} - revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} - selector: - matchLabels: - {{- include "grafana.selectorLabels" . | nindent 6 }} - {{- with .Values.deploymentStrategy }} - strategy: - {{- toYaml . | trim | nindent 4 }} - {{- end }} - template: - metadata: - labels: - {{- include "grafana.selectorLabels" . | nindent 8 }} - {{- with .Values.podLabels }} - {{- toYaml . | nindent 8 }} - {{- end }} - annotations: - checksum/config: {{ include "grafana.configData" . | sha256sum }} - {{- if .Values.dashboards }} - checksum/dashboards-json-config: {{ include (print $.Template.BasePath "/dashboards-json-configmap.yaml") . | sha256sum }} - {{- end }} - checksum/sc-dashboard-provider-config: {{ include "grafana.configDashboardProviderData" . | sha256sum }} - {{- if and (or (and (not .Values.admin.existingSecret) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD)) (and .Values.ldap.enabled (not .Values.ldap.existingSecret))) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - checksum/secret: {{ include "grafana.secretsData" . | sha256sum }} - {{- end }} - {{- if .Values.envRenderSecret }} - checksum/secret-env: {{ tpl (toYaml .Values.envRenderSecret) . | sha256sum }} - {{- end }} - kubectl.kubernetes.io/default-container: {{ .Chart.Name }} - {{- with .Values.podAnnotations }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- include "grafana.pod" . | nindent 6 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/extra-manifests.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/extra-manifests.yaml deleted file mode 100644 index a9bb3b6ba..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/extra-manifests.yaml +++ /dev/null @@ -1,4 +0,0 @@ -{{ range .Values.extraObjects }} ---- -{{ tpl (toYaml .) $ }} -{{ end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/headless-service.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/headless-service.yaml deleted file mode 100644 index 3028589d3..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/headless-service.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- $sts := list "sts" "StatefulSet" "statefulset" -}} -{{- if or .Values.headlessService (and .Values.persistence.enabled (not .Values.persistence.existingClaim) (has .Values.persistence.type $sts)) }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "grafana.fullname" . }}-headless - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - clusterIP: None - selector: - {{- include "grafana.selectorLabels" . | nindent 4 }} - type: ClusterIP - ports: - - name: {{ .Values.gossipPortName }}-tcp - port: 9094 -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/hpa.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/hpa.yaml deleted file mode 100644 index 46bbcb49a..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/hpa.yaml +++ /dev/null @@ -1,52 +0,0 @@ -{{- $sts := list "sts" "StatefulSet" "statefulset" -}} -{{- if .Values.autoscaling.enabled }} -apiVersion: {{ include "grafana.hpa.apiVersion" . }} -kind: HorizontalPodAutoscaler -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - app.kubernetes.io/name: {{ include "grafana.name" . }} - helm.sh/chart: {{ include "grafana.chart" . }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} -spec: - scaleTargetRef: - apiVersion: apps/v1 - {{- if has .Values.persistence.type $sts }} - kind: StatefulSet - {{- else }} - kind: Deployment - {{- end }} - name: {{ include "grafana.fullname" . }} - minReplicas: {{ .Values.autoscaling.minReplicas }} - maxReplicas: {{ .Values.autoscaling.maxReplicas }} - metrics: - {{- if .Values.autoscaling.targetMemory }} - - type: Resource - resource: - name: memory - {{- if eq (include "grafana.hpa.apiVersion" .) "autoscaling/v2beta1" }} - targetAverageUtilization: {{ .Values.autoscaling.targetMemory }} - {{- else }} - target: - type: Utilization - averageUtilization: {{ .Values.autoscaling.targetMemory }} - {{- end }} - {{- end }} - {{- if .Values.autoscaling.targetCPU }} - - type: Resource - resource: - name: cpu - {{- if eq (include "grafana.hpa.apiVersion" .) "autoscaling/v2beta1" }} - targetAverageUtilization: {{ .Values.autoscaling.targetCPU }} - {{- else }} - target: - type: Utilization - averageUtilization: {{ .Values.autoscaling.targetCPU }} - {{- end }} - {{- end }} - {{- if .Values.autoscaling.behavior }} - behavior: {{ toYaml .Values.autoscaling.behavior | nindent 4 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-deployment.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-deployment.yaml deleted file mode 100644 index ea97969c2..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-deployment.yaml +++ /dev/null @@ -1,131 +0,0 @@ -{{ if .Values.imageRenderer.enabled }} -{{- $root := . -}} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "grafana.fullname" . }}-image-renderer - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.imageRenderer.labels" . | nindent 4 }} - {{- with .Values.imageRenderer.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.imageRenderer.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if and (not .Values.imageRenderer.autoscaling.enabled) (.Values.imageRenderer.replicas) }} - replicas: {{ .Values.imageRenderer.replicas }} - {{- end }} - revisionHistoryLimit: {{ .Values.imageRenderer.revisionHistoryLimit }} - selector: - matchLabels: - {{- include "grafana.imageRenderer.selectorLabels" . | nindent 6 }} - - {{- with .Values.imageRenderer.deploymentStrategy }} - strategy: - {{- toYaml . | trim | nindent 4 }} - {{- end }} - template: - metadata: - labels: - {{- include "grafana.imageRenderer.selectorLabels" . | nindent 8 }} - {{- with .Values.imageRenderer.podLabels }} - {{- toYaml . | nindent 8 }} - {{- end }} - annotations: - checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} - {{- with .Values.imageRenderer.podAnnotations }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- with .Values.imageRenderer.schedulerName }} - schedulerName: "{{ . }}" - {{- end }} - {{- with .Values.imageRenderer.serviceAccountName }} - serviceAccountName: "{{ . }}" - {{- end }} - {{- with .Values.imageRenderer.securityContext }} - securityContext: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.imageRenderer.hostAliases }} - hostAliases: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.imageRenderer.priorityClassName }} - priorityClassName: {{ . }} - {{- end }} - {{- with .Values.imageRenderer.image.pullSecrets }} - imagePullSecrets: - {{- range . }} - - name: {{ tpl . $root }} - {{- end}} - {{- end }} - containers: - - name: {{ .Chart.Name }}-image-renderer - {{- $registry := .Values.global.imageRegistry | default .Values.imageRenderer.image.registry -}} - {{- if .Values.imageRenderer.image.sha }} - image: "{{ $registry }}/{{ .Values.imageRenderer.image.repository }}:{{ .Values.imageRenderer.image.tag }}@sha256:{{ .Values.imageRenderer.image.sha }}" - {{- else }} - image: "{{ $registry }}/{{ .Values.imageRenderer.image.repository }}:{{ .Values.imageRenderer.image.tag }}" - {{- end }} - imagePullPolicy: {{ .Values.imageRenderer.image.pullPolicy }} - {{- if .Values.imageRenderer.command }} - command: - {{- range .Values.imageRenderer.command }} - - {{ . }} - {{- end }} - {{- end}} - ports: - - name: {{ .Values.imageRenderer.service.portName }} - containerPort: {{ .Values.imageRenderer.service.targetPort }} - protocol: TCP - livenessProbe: - httpGet: - path: / - port: {{ .Values.imageRenderer.service.portName }} - env: - - name: HTTP_PORT - value: {{ .Values.imageRenderer.service.targetPort | quote }} - {{- if .Values.imageRenderer.serviceMonitor.enabled }} - - name: ENABLE_METRICS - value: "true" - {{- end }} - {{- range $key, $value := .Values.imageRenderer.envValueFrom }} - - name: {{ $key | quote }} - valueFrom: - {{- tpl (toYaml $value) $ | nindent 16 }} - {{- end }} - {{- range $key, $value := .Values.imageRenderer.env }} - - name: {{ $key | quote }} - value: {{ $value | quote }} - {{- end }} - {{- with .Values.imageRenderer.containerSecurityContext }} - securityContext: - {{- toYaml . | nindent 12 }} - {{- end }} - volumeMounts: - - mountPath: /tmp - name: image-renderer-tmpfs - {{- with .Values.imageRenderer.resources }} - resources: - {{- toYaml . | nindent 12 }} - {{- end }} - {{- with .Values.imageRenderer.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.imageRenderer.affinity }} - affinity: - {{- tpl (toYaml .) $root | nindent 8 }} - {{- end }} - {{- with .Values.imageRenderer.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - volumes: - - name: image-renderer-tmpfs - emptyDir: {} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-hpa.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-hpa.yaml deleted file mode 100644 index b0f0059b7..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-hpa.yaml +++ /dev/null @@ -1,47 +0,0 @@ -{{- if and .Values.imageRenderer.enabled .Values.imageRenderer.autoscaling.enabled }} -apiVersion: {{ include "grafana.hpa.apiVersion" . }} -kind: HorizontalPodAutoscaler -metadata: - name: {{ include "grafana.fullname" . }}-image-renderer - namespace: {{ include "grafana.namespace" . }} - labels: - app.kubernetes.io/name: {{ include "grafana.name" . }}-image-renderer - helm.sh/chart: {{ include "grafana.chart" . }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: {{ include "grafana.fullname" . }}-image-renderer - minReplicas: {{ .Values.imageRenderer.autoscaling.minReplicas }} - maxReplicas: {{ .Values.imageRenderer.autoscaling.maxReplicas }} - metrics: - {{- if .Values.imageRenderer.autoscaling.targetMemory }} - - type: Resource - resource: - name: memory - {{- if eq (include "grafana.hpa.apiVersion" .) "autoscaling/v2beta1" }} - targetAverageUtilization: {{ .Values.imageRenderer.autoscaling.targetMemory }} - {{- else }} - target: - type: Utilization - averageUtilization: {{ .Values.imageRenderer.autoscaling.targetMemory }} - {{- end }} - {{- end }} - {{- if .Values.imageRenderer.autoscaling.targetCPU }} - - type: Resource - resource: - name: cpu - {{- if eq (include "grafana.hpa.apiVersion" .) "autoscaling/v2beta1" }} - targetAverageUtilization: {{ .Values.imageRenderer.autoscaling.targetCPU }} - {{- else }} - target: - type: Utilization - averageUtilization: {{ .Values.imageRenderer.autoscaling.targetCPU }} - {{- end }} - {{- end }} - {{- if .Values.imageRenderer.autoscaling.behavior }} - behavior: {{ toYaml .Values.imageRenderer.autoscaling.behavior | nindent 4 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-network-policy.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-network-policy.yaml deleted file mode 100644 index d1a0eb313..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-network-policy.yaml +++ /dev/null @@ -1,79 +0,0 @@ -{{- if and .Values.imageRenderer.enabled .Values.imageRenderer.networkPolicy.limitIngress }} ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: {{ include "grafana.fullname" . }}-image-renderer-ingress - namespace: {{ include "grafana.namespace" . }} - annotations: - comment: Limit image-renderer ingress traffic from grafana -spec: - podSelector: - matchLabels: - {{- include "grafana.imageRenderer.selectorLabels" . | nindent 6 }} - {{- with .Values.imageRenderer.podLabels }} - {{- toYaml . | nindent 6 }} - {{- end }} - - policyTypes: - - Ingress - ingress: - - ports: - - port: {{ .Values.imageRenderer.service.targetPort }} - protocol: TCP - from: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: {{ include "grafana.namespace" . }} - podSelector: - matchLabels: - {{- include "grafana.selectorLabels" . | nindent 14 }} - {{- with .Values.podLabels }} - {{- toYaml . | nindent 14 }} - {{- end }} - {{- with .Values.imageRenderer.networkPolicy.extraIngressSelectors -}} - {{ toYaml . | nindent 8 }} - {{- end }} -{{- end }} - -{{- if and .Values.imageRenderer.enabled .Values.imageRenderer.networkPolicy.limitEgress }} ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: {{ include "grafana.fullname" . }}-image-renderer-egress - namespace: {{ include "grafana.namespace" . }} - annotations: - comment: Limit image-renderer egress traffic to grafana -spec: - podSelector: - matchLabels: - {{- include "grafana.imageRenderer.selectorLabels" . | nindent 6 }} - {{- with .Values.imageRenderer.podLabels }} - {{- toYaml . | nindent 6 }} - {{- end }} - - policyTypes: - - Egress - egress: - # allow dns resolution - - ports: - - port: 53 - protocol: UDP - - port: 53 - protocol: TCP - # talk only to grafana - - ports: - - port: {{ .Values.service.targetPort }} - protocol: TCP - to: - - namespaceSelector: - matchLabels: - name: {{ include "grafana.namespace" . }} - podSelector: - matchLabels: - {{- include "grafana.selectorLabels" . | nindent 14 }} - {{- with .Values.podLabels }} - {{- toYaml . | nindent 14 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-service.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-service.yaml deleted file mode 100644 index f8da127cf..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-service.yaml +++ /dev/null @@ -1,31 +0,0 @@ -{{- if and .Values.imageRenderer.enabled .Values.imageRenderer.service.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "grafana.fullname" . }}-image-renderer - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.imageRenderer.labels" . | nindent 4 }} - {{- with .Values.imageRenderer.service.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.imageRenderer.service.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - type: ClusterIP - {{- with .Values.imageRenderer.service.clusterIP }} - clusterIP: {{ . }} - {{- end }} - ports: - - name: {{ .Values.imageRenderer.service.portName }} - port: {{ .Values.imageRenderer.service.port }} - protocol: TCP - targetPort: {{ .Values.imageRenderer.service.targetPort }} - {{- with .Values.imageRenderer.appProtocol }} - appProtocol: {{ . }} - {{- end }} - selector: - {{- include "grafana.imageRenderer.selectorLabels" . | nindent 4 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-servicemonitor.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-servicemonitor.yaml deleted file mode 100644 index 5d9f09d26..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/image-renderer-servicemonitor.yaml +++ /dev/null @@ -1,48 +0,0 @@ -{{- if .Values.imageRenderer.serviceMonitor.enabled }} ---- -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "grafana.fullname" . }}-image-renderer - {{- if .Values.imageRenderer.serviceMonitor.namespace }} - namespace: {{ tpl .Values.imageRenderer.serviceMonitor.namespace . }} - {{- else }} - namespace: {{ include "grafana.namespace" . }} - {{- end }} - labels: - {{- include "grafana.imageRenderer.labels" . | nindent 4 }} - {{- with .Values.imageRenderer.serviceMonitor.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - endpoints: - - port: {{ .Values.imageRenderer.service.portName }} - {{- with .Values.imageRenderer.serviceMonitor.interval }} - interval: {{ . }} - {{- end }} - {{- with .Values.imageRenderer.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ . }} - {{- end }} - honorLabels: true - path: {{ .Values.imageRenderer.serviceMonitor.path }} - scheme: {{ .Values.imageRenderer.serviceMonitor.scheme }} - {{- with .Values.imageRenderer.serviceMonitor.tlsConfig }} - tlsConfig: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.imageRenderer.serviceMonitor.relabelings }} - relabelings: - {{- toYaml . | nindent 6 }} - {{- end }} - jobLabel: "{{ .Release.Name }}-image-renderer" - selector: - matchLabels: - {{- include "grafana.imageRenderer.selectorLabels" . | nindent 6 }} - namespaceSelector: - matchNames: - - {{ include "grafana.namespace" . }} - {{- with .Values.imageRenderer.serviceMonitor.targetLabels }} - targetLabels: - {{- toYaml . | nindent 4 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/ingress.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/ingress.yaml deleted file mode 100644 index b2ffd8109..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/ingress.yaml +++ /dev/null @@ -1,78 +0,0 @@ -{{- if .Values.ingress.enabled -}} -{{- $ingressApiIsStable := eq (include "grafana.ingress.isStable" .) "true" -}} -{{- $ingressSupportsIngressClassName := eq (include "grafana.ingress.supportsIngressClassName" .) "true" -}} -{{- $ingressSupportsPathType := eq (include "grafana.ingress.supportsPathType" .) "true" -}} -{{- $fullName := include "grafana.fullname" . -}} -{{- $servicePort := .Values.service.port -}} -{{- $ingressPath := .Values.ingress.path -}} -{{- $ingressPathType := .Values.ingress.pathType -}} -{{- $extraPaths := .Values.ingress.extraPaths -}} -apiVersion: {{ include "grafana.ingress.apiVersion" . }} -kind: Ingress -metadata: - name: {{ $fullName }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.ingress.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.ingress.annotations }} - annotations: - {{- range $key, $value := . }} - {{ $key }}: {{ tpl $value $ | quote }} - {{- end }} - {{- end }} -spec: - {{- if and $ingressSupportsIngressClassName .Values.ingress.ingressClassName }} - ingressClassName: {{ .Values.ingress.ingressClassName }} - {{- end -}} - {{- with .Values.ingress.tls }} - tls: - {{- tpl (toYaml .) $ | nindent 4 }} - {{- end }} - rules: - {{- if .Values.ingress.hosts }} - {{- range .Values.ingress.hosts }} - - host: {{ tpl . $ | quote }} - http: - paths: - {{- with $extraPaths }} - {{- toYaml . | nindent 10 }} - {{- end }} - - path: {{ $ingressPath }} - {{- if $ingressSupportsPathType }} - pathType: {{ $ingressPathType }} - {{- end }} - backend: - {{- if $ingressApiIsStable }} - service: - name: {{ $fullName }} - port: - number: {{ $servicePort }} - {{- else }} - serviceName: {{ $fullName }} - servicePort: {{ $servicePort }} - {{- end }} - {{- end }} - {{- else }} - - http: - paths: - - backend: - {{- if $ingressApiIsStable }} - service: - name: {{ $fullName }} - port: - number: {{ $servicePort }} - {{- else }} - serviceName: {{ $fullName }} - servicePort: {{ $servicePort }} - {{- end }} - {{- with $ingressPath }} - path: {{ . }} - {{- end }} - {{- if $ingressSupportsPathType }} - pathType: {{ $ingressPathType }} - {{- end }} - {{- end -}} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/networkpolicy.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/networkpolicy.yaml deleted file mode 100644 index 4cd3ed697..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/networkpolicy.yaml +++ /dev/null @@ -1,61 +0,0 @@ -{{- if .Values.networkPolicy.enabled }} -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - policyTypes: - {{- if .Values.networkPolicy.ingress }} - - Ingress - {{- end }} - {{- if .Values.networkPolicy.egress.enabled }} - - Egress - {{- end }} - podSelector: - matchLabels: - {{- include "grafana.selectorLabels" . | nindent 6 }} - - {{- if .Values.networkPolicy.egress.enabled }} - egress: - {{- if not .Values.networkPolicy.egress.blockDNSResolution }} - - ports: - - port: 53 - protocol: UDP - {{- end }} - - ports: - {{ .Values.networkPolicy.egress.ports | toJson }} - {{- with .Values.networkPolicy.egress.to }} - to: - {{- toYaml . | nindent 12 }} - {{- end }} - {{- end }} - {{- if .Values.networkPolicy.ingress }} - ingress: - - ports: - - port: {{ .Values.service.targetPort }} - {{- if not .Values.networkPolicy.allowExternal }} - from: - - podSelector: - matchLabels: - {{ include "grafana.fullname" . }}-client: "true" - {{- with .Values.networkPolicy.explicitNamespacesSelector }} - - namespaceSelector: - {{- toYaml . | nindent 12 }} - {{- end }} - - podSelector: - matchLabels: - {{- include "grafana.labels" . | nindent 14 }} - role: read - {{- end }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/poddisruptionbudget.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/poddisruptionbudget.yaml deleted file mode 100644 index 05251214a..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/poddisruptionbudget.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- if .Values.podDisruptionBudget }} -apiVersion: {{ include "grafana.podDisruptionBudget.apiVersion" . }} -kind: PodDisruptionBudget -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- with .Values.podDisruptionBudget.minAvailable }} - minAvailable: {{ . }} - {{- end }} - {{- with .Values.podDisruptionBudget.maxUnavailable }} - maxUnavailable: {{ . }} - {{- end }} - selector: - matchLabels: - {{- include "grafana.selectorLabels" . | nindent 6 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/podsecuritypolicy.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/podsecuritypolicy.yaml deleted file mode 100644 index eed7af95b..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/podsecuritypolicy.yaml +++ /dev/null @@ -1,49 +0,0 @@ -{{- if and .Values.rbac.pspEnabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ include "grafana.fullname" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - annotations: - seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default,runtime/default' - seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' - {{- if .Values.rbac.pspUseAppArmor }} - apparmor.security.beta.kubernetes.io/allowedProfileNames: 'runtime/default' - apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' - {{- end }} -spec: - privileged: false - allowPrivilegeEscalation: false - requiredDropCapabilities: - # Default set from Docker, with DAC_OVERRIDE and CHOWN - - ALL - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'csi' - - 'secret' - - 'downwardAPI' - - 'persistentVolumeClaim' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - readOnlyRootFilesystem: false -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/pvc.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/pvc.yaml deleted file mode 100644 index eb8f87f07..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/pvc.yaml +++ /dev/null @@ -1,36 +0,0 @@ -{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) (eq .Values.persistence.type "pvc")}} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.persistence.extraPvcLabels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.persistence.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.persistence.finalizers }} - finalizers: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - accessModes: - {{- range .Values.persistence.accessModes }} - - {{ . | quote }} - {{- end }} - resources: - requests: - storage: {{ .Values.persistence.size | quote }} - {{- with .Values.persistence.storageClassName }} - storageClassName: {{ . }} - {{- end }} - {{- with .Values.persistence.selectorLabels }} - selector: - matchLabels: - {{- toYaml . | nindent 6 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/role.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/role.yaml deleted file mode 100644 index 4b5edd978..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/role.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if and .Values.rbac.create (not .Values.rbac.useExistingRole) -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -{{- if or .Values.rbac.pspEnabled (and .Values.rbac.namespaced (or .Values.sidecar.dashboards.enabled .Values.sidecar.datasources.enabled .Values.sidecar.plugins.enabled .Values.rbac.extraRoleRules)) }} -rules: - {{- if and .Values.rbac.pspEnabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} - - apiGroups: ['extensions'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: [{{ include "grafana.fullname" . }}] - {{- end }} - {{- if and .Values.rbac.namespaced (or .Values.sidecar.dashboards.enabled .Values.sidecar.datasources.enabled .Values.sidecar.plugins.enabled) }} - - apiGroups: [""] # "" indicates the core API group - resources: ["configmaps", "secrets"] - verbs: ["get", "watch", "list"] - {{- end }} - {{- with .Values.rbac.extraRoleRules }} - {{- toYaml . | nindent 2 }} - {{- end}} -{{- else }} -rules: [] -{{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/rolebinding.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/rolebinding.yaml deleted file mode 100644 index 58f77c6b0..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/rolebinding.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.rbac.create }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - {{- if .Values.rbac.useExistingRole }} - name: {{ .Values.rbac.useExistingRole }} - {{- else }} - name: {{ include "grafana.fullname" . }} - {{- end }} -subjects: -- kind: ServiceAccount - name: {{ include "grafana.serviceAccountName" . }} - namespace: {{ include "grafana.namespace" . }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/secret-env.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/secret-env.yaml deleted file mode 100644 index eb14aac70..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/secret-env.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if .Values.envRenderSecret }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "grafana.fullname" . }}-env - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} -type: Opaque -data: -{{- range $key, $val := .Values.envRenderSecret }} - {{ $key }}: {{ tpl ($val | toString) $ | b64enc | quote }} -{{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/secret.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/secret.yaml deleted file mode 100644 index fd2ca50f4..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/secret.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if or (and (not .Values.admin.existingSecret) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION)) (and .Values.ldap.enabled (not .Values.ldap.existingSecret)) }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -type: Opaque -data: - {{- include "grafana.secretsData" . | nindent 2 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/service.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/service.yaml deleted file mode 100644 index e9396a15c..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/service.yaml +++ /dev/null @@ -1,61 +0,0 @@ -{{- if .Values.service.enabled }} -{{- $root := . }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.service.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.service.annotations }} - annotations: - {{- tpl (toYaml . | nindent 4) $root }} - {{- end }} -spec: - {{- if (or (eq .Values.service.type "ClusterIP") (empty .Values.service.type)) }} - type: ClusterIP - {{- with .Values.service.clusterIP }} - clusterIP: {{ . }} - {{- end }} - {{- else if eq .Values.service.type "LoadBalancer" }} - type: LoadBalancer - {{- with .Values.service.loadBalancerIP }} - loadBalancerIP: {{ . }} - {{- end }} - {{- with .Values.service.loadBalancerClass }} - loadBalancerClass: {{ . }} - {{- end }} - {{- with .Values.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- toYaml . | nindent 4 }} - {{- end }} - {{- else }} - type: {{ .Values.service.type }} - {{- end }} - {{- with .Values.service.externalIPs }} - externalIPs: - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.service.externalTrafficPolicy }} - externalTrafficPolicy: {{ . }} - {{- end }} - ports: - - name: {{ .Values.service.portName }} - port: {{ .Values.service.port }} - protocol: TCP - targetPort: {{ .Values.service.targetPort }} - {{- with .Values.service.appProtocol }} - appProtocol: {{ . }} - {{- end }} - {{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort))) }} - nodePort: {{ .Values.service.nodePort }} - {{- end }} - {{- with .Values.extraExposePorts }} - {{- tpl (toYaml . | nindent 4) $root }} - {{- end }} - selector: - {{- include "grafana.selectorLabels" . | nindent 4 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/serviceaccount.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/serviceaccount.yaml deleted file mode 100644 index 784e71ba6..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/serviceaccount.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if .Values.serviceAccount.create }} -{{- $root := . -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.serviceAccount.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{- tpl (toYaml . | nindent 4) $root }} - {{- end }} - name: {{ include "grafana.serviceAccountName" . }} - namespace: {{ include "grafana.namespace" . }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/servicemonitor.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/servicemonitor.yaml deleted file mode 100644 index 035901352..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/servicemonitor.yaml +++ /dev/null @@ -1,52 +0,0 @@ -{{- if .Values.serviceMonitor.enabled }} ---- -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "grafana.fullname" . }} - {{- if .Values.serviceMonitor.namespace }} - namespace: {{ tpl .Values.serviceMonitor.namespace . }} - {{- else }} - namespace: {{ include "grafana.namespace" . }} - {{- end }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.serviceMonitor.labels }} - {{- tpl (toYaml . | nindent 4) $ }} - {{- end }} -spec: - endpoints: - - port: {{ .Values.service.portName }} - {{- with .Values.serviceMonitor.interval }} - interval: {{ . }} - {{- end }} - {{- with .Values.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ . }} - {{- end }} - honorLabels: true - path: {{ .Values.serviceMonitor.path }} - scheme: {{ .Values.serviceMonitor.scheme }} - {{- with .Values.serviceMonitor.tlsConfig }} - tlsConfig: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.serviceMonitor.relabelings }} - relabelings: - {{- toYaml . | nindent 6 }} - {{- end }} - {{- with .Values.serviceMonitor.metricRelabelings }} - metricRelabelings: - {{- toYaml . | nindent 6 }} - {{- end }} - jobLabel: "{{ .Release.Name }}" - selector: - matchLabels: - {{- include "grafana.selectorLabels" . | nindent 6 }} - namespaceSelector: - matchNames: - - {{ include "grafana.namespace" . }} - {{- with .Values.serviceMonitor.targetLabels }} - targetLabels: - {{- toYaml . | nindent 4 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/statefulset.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/statefulset.yaml deleted file mode 100644 index e6c944a4d..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/statefulset.yaml +++ /dev/null @@ -1,56 +0,0 @@ -{{- $sts := list "sts" "StatefulSet" "statefulset" -}} -{{- if (or (.Values.useStatefulSet) (and .Values.persistence.enabled (not .Values.persistence.existingClaim) (has .Values.persistence.type $sts)))}} -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ include "grafana.fullname" . }} - namespace: {{ include "grafana.namespace" . }} - labels: - {{- include "grafana.labels" . | nindent 4 }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.replicas }} - selector: - matchLabels: - {{- include "grafana.selectorLabels" . | nindent 6 }} - serviceName: {{ include "grafana.fullname" . }}-headless - template: - metadata: - labels: - {{- include "grafana.selectorLabels" . | nindent 8 }} - {{- with .Values.podLabels }} - {{- toYaml . | nindent 8 }} - {{- end }} - annotations: - checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} - checksum/dashboards-json-config: {{ include (print $.Template.BasePath "/dashboards-json-configmap.yaml") . | sha256sum }} - checksum/sc-dashboard-provider-config: {{ include (print $.Template.BasePath "/configmap-dashboard-provider.yaml") . | sha256sum }} - {{- if and (or (and (not .Values.admin.existingSecret) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD)) (and .Values.ldap.enabled (not .Values.ldap.existingSecret))) (not .Values.env.GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION) }} - checksum/secret: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }} - {{- end }} - kubectl.kubernetes.io/default-container: {{ .Chart.Name }} - {{- with .Values.podAnnotations }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- include "grafana.pod" . | nindent 6 }} - {{- if .Values.persistence.enabled}} - volumeClaimTemplates: - - metadata: - name: storage - spec: - accessModes: {{ .Values.persistence.accessModes }} - storageClassName: {{ .Values.persistence.storageClassName }} - resources: - requests: - storage: {{ .Values.persistence.size }} - {{- with .Values.persistence.selectorLabels }} - selector: - matchLabels: - {{- toYaml . | nindent 10 }} - {{- end }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-configmap.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-configmap.yaml deleted file mode 100644 index 01c96c924..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-configmap.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.testFramework.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "grafana.fullname" . }}-test - namespace: {{ include "grafana.namespace" . }} - annotations: - "helm.sh/hook": test-success - "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" - labels: - {{- include "grafana.labels" . | nindent 4 }} -data: - run.sh: |- - @test "Test Health" { - url="http://{{ include "grafana.fullname" . }}/api/health" - - code=$(wget --server-response --spider --timeout 90 --tries 10 ${url} 2>&1 | awk '/^ HTTP/{print $2}') - [ "$code" == "200" ] - } -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-podsecuritypolicy.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-podsecuritypolicy.yaml deleted file mode 100644 index 1821772a4..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-podsecuritypolicy.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if and (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") .Values.testFramework.enabled .Values.rbac.pspEnabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ include "grafana.fullname" . }}-test - annotations: - "helm.sh/hook": test-success - "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" - labels: - {{- include "grafana.labels" . | nindent 4 }} -spec: - allowPrivilegeEscalation: true - privileged: false - hostNetwork: false - hostIPC: false - hostPID: false - fsGroup: - rule: RunAsAny - seLinux: - rule: RunAsAny - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - volumes: - - configMap - - downwardAPI - - emptyDir - - projected - - csi - - secret -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-role.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-role.yaml deleted file mode 100644 index cb4c78204..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-role.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if and (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") .Values.testFramework.enabled .Values.rbac.pspEnabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ include "grafana.fullname" . }}-test - namespace: {{ include "grafana.namespace" . }} - annotations: - "helm.sh/hook": test-success - "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" - labels: - {{- include "grafana.labels" . | nindent 4 }} -rules: - - apiGroups: ['policy'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: [{{ include "grafana.fullname" . }}-test] -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-rolebinding.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-rolebinding.yaml deleted file mode 100644 index f40d791f6..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-rolebinding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if and (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") .Values.testFramework.enabled .Values.rbac.pspEnabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ include "grafana.fullname" . }}-test - namespace: {{ include "grafana.namespace" . }} - annotations: - "helm.sh/hook": test-success - "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" - labels: - {{- include "grafana.labels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ include "grafana.fullname" . }}-test -subjects: - - kind: ServiceAccount - name: {{ include "grafana.serviceAccountNameTest" . }} - namespace: {{ include "grafana.namespace" . }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-serviceaccount.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-serviceaccount.yaml deleted file mode 100644 index 38fba3596..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test-serviceaccount.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if and .Values.testFramework.enabled .Values.serviceAccount.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - {{- include "grafana.labels" . | nindent 4 }} - name: {{ include "grafana.serviceAccountNameTest" . }} - namespace: {{ include "grafana.namespace" . }} - annotations: - "helm.sh/hook": test-success - "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test.yaml b/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test.yaml deleted file mode 100644 index 15067ae30..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/templates/tests/test.yaml +++ /dev/null @@ -1,49 +0,0 @@ -{{- if .Values.testFramework.enabled }} -{{- $root := . }} -apiVersion: v1 -kind: Pod -metadata: - name: {{ include "grafana.fullname" . }}-test - labels: - {{- include "grafana.labels" . | nindent 4 }} - annotations: - "helm.sh/hook": test-success - "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" - namespace: {{ include "grafana.namespace" . }} -spec: - serviceAccountName: {{ include "grafana.serviceAccountNameTest" . }} - {{- with .Values.testFramework.securityContext }} - securityContext: - {{- toYaml . | nindent 4 }} - {{- end }} - {{- if or .Values.image.pullSecrets .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- include "grafana.imagePullSecrets" (dict "root" $root "imagePullSecrets" .Values.image.pullSecrets) | nindent 4 }} - {{- end }} - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- tpl (toYaml .) $root | nindent 4 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 4 }} - {{- end }} - containers: - - name: {{ .Release.Name }}-test - image: "{{ .Values.global.imageRegistry | default .Values.testFramework.image.registry }}/{{ .Values.testFramework.image.repository }}:{{ .Values.testFramework.image.tag }}" - imagePullPolicy: "{{ .Values.testFramework.imagePullPolicy}}" - command: ["/opt/bats/bin/bats", "-t", "/tests/run.sh"] - volumeMounts: - - mountPath: /tests - name: tests - readOnly: true - volumes: - - name: tests - configMap: - name: {{ include "grafana.fullname" . }}-test - restartPolicy: Never -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/grafana/values.yaml b/thunder_deployment/infra/beta9/charts/grafana/values.yaml deleted file mode 100644 index ab853e09c..000000000 --- a/thunder_deployment/infra/beta9/charts/grafana/values.yaml +++ /dev/null @@ -1,1315 +0,0 @@ -global: - # -- Overrides the Docker registry globally for all images - imageRegistry: null - - # To help compatibility with other charts which use global.imagePullSecrets. - # Allow either an array of {name: pullSecret} maps (k8s-style), or an array of strings (more common helm-style). - # Can be tempalted. - # global: - # imagePullSecrets: - # - name: pullSecret1 - # - name: pullSecret2 - # or - # global: - # imagePullSecrets: - # - pullSecret1 - # - pullSecret2 - imagePullSecrets: [] - -rbac: - create: true - ## Use an existing ClusterRole/Role (depending on rbac.namespaced false/true) - # useExistingRole: name-of-some-role - # useExistingClusterRole: name-of-some-clusterRole - pspEnabled: false - pspUseAppArmor: false - namespaced: false - extraRoleRules: [] - # - apiGroups: [] - # resources: [] - # verbs: [] - extraClusterRoleRules: [] - # - apiGroups: [] - # resources: [] - # verbs: [] -serviceAccount: - create: true - name: - nameTest: - ## ServiceAccount labels. - labels: {} -## Service account annotations. Can be templated. -# annotations: -# eks.amazonaws.com/role-arn: arn:aws:iam::123456789000:role/iam-role-name-here - autoMount: true - -replicas: 1 - -## Create a headless service for the deployment -headlessService: false - -## Create HorizontalPodAutoscaler object for deployment type -# -autoscaling: - enabled: false - minReplicas: 1 - maxReplicas: 5 - targetCPU: "60" - targetMemory: "" - behavior: {} - -## See `kubectl explain poddisruptionbudget.spec` for more -## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/ -podDisruptionBudget: {} -# apiVersion: "" -# minAvailable: 1 -# maxUnavailable: 1 - -## See `kubectl explain deployment.spec.strategy` for more -## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy -deploymentStrategy: - type: RollingUpdate - -readinessProbe: - httpGet: - path: /api/health - port: 3000 - -livenessProbe: - httpGet: - path: /api/health - port: 3000 - initialDelaySeconds: 60 - timeoutSeconds: 30 - failureThreshold: 10 - -## Use an alternate scheduler, e.g. "stork". -## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ -## -# schedulerName: "default-scheduler" - -image: - # -- The Docker registry - registry: docker.io - # -- Docker image repository - repository: grafana/grafana - # Overrides the Grafana image tag whose default is the chart appVersion - tag: "" - sha: "" - pullPolicy: IfNotPresent - - ## Optionally specify an array of imagePullSecrets. - ## Secrets must be manually created in the namespace. - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - ## Can be templated. - ## - pullSecrets: [] - # - myRegistrKeySecretName - -testFramework: - enabled: true - image: - # -- The Docker registry - registry: docker.io - repository: bats/bats - tag: "v1.4.1" - imagePullPolicy: IfNotPresent - securityContext: {} - -# dns configuration for pod -dnsPolicy: ~ -dnsConfig: {} - # nameservers: - # - 8.8.8.8 - # options: - # - name: ndots - # value: "2" - # - name: edns0 - -securityContext: - runAsNonRoot: true - runAsUser: 472 - runAsGroup: 472 - fsGroup: 472 - -containerSecurityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - seccompProfile: - type: RuntimeDefault - -# Enable creating the grafana configmap -createConfigmap: true - -# Extra configmaps to mount in grafana pods -# Values are templated. -extraConfigmapMounts: [] - # - name: certs-configmap - # mountPath: /etc/grafana/ssl/ - # subPath: certificates.crt # (optional) - # configMap: certs-configmap - # readOnly: true - - -extraEmptyDirMounts: [] - # - name: provisioning-notifiers - # mountPath: /etc/grafana/provisioning/notifiers - - -# Apply extra labels to common labels. -extraLabels: {} - -## Assign a PriorityClassName to pods if set -# priorityClassName: - -downloadDashboardsImage: - # -- The Docker registry - registry: docker.io - repository: curlimages/curl - tag: 7.85.0 - sha: "" - pullPolicy: IfNotPresent - -downloadDashboards: - env: {} - envFromSecret: "" - resources: {} - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - seccompProfile: - type: RuntimeDefault - envValueFrom: {} - # ENV_NAME: - # configMapKeyRef: - # name: configmap-name - # key: value_key - -## Pod Annotations -# podAnnotations: {} - -## Pod Labels -# podLabels: {} - -podPortName: grafana -gossipPortName: gossip -## Deployment annotations -# annotations: {} - -## Expose the grafana service to be accessed from outside the cluster (LoadBalancer service). -## or access it from within the cluster (ClusterIP service). Set the service type and the port to serve it. -## ref: http://kubernetes.io/docs/user-guide/services/ -## -service: - enabled: true - type: ClusterIP - loadBalancerIP: "" - loadBalancerClass: "" - loadBalancerSourceRanges: [] - port: 80 - targetPort: 3000 - # targetPort: 4181 To be used with a proxy extraContainer - ## Service annotations. Can be templated. - annotations: {} - labels: {} - portName: service - # Adds the appProtocol field to the service. This allows to work with istio protocol selection. Ex: "http" or "tcp" - appProtocol: "" - -serviceMonitor: - ## If true, a ServiceMonitor CRD is created for a prometheus operator - ## https://github.com/coreos/prometheus-operator - ## - enabled: false - path: /metrics - # namespace: monitoring (defaults to use the namespace this chart is deployed to) - labels: {} - interval: 30s - scheme: http - tlsConfig: {} - scrapeTimeout: 30s - relabelings: [] - metricRelabelings: [] - targetLabels: [] - -extraExposePorts: [] - # - name: keycloak - # port: 8080 - # targetPort: 8080 - -# overrides pod.spec.hostAliases in the grafana deployment's pods -hostAliases: [] - # - ip: "1.2.3.4" - # hostnames: - # - "my.host.com" - -ingress: - enabled: false - # For Kubernetes >= 1.18 you should specify the ingress-controller via the field ingressClassName - # See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#specifying-the-class-of-an-ingress - # ingressClassName: nginx - # Values can be templated - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: / - - # pathType is only for k8s >= 1.1= - pathType: Prefix - - hosts: - - chart-example.local - ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services. - extraPaths: [] - # - path: /* - # backend: - # serviceName: ssl-redirect - # servicePort: use-annotation - ## Or for k8s > 1.19 - # - path: /* - # pathType: Prefix - # backend: - # service: - # name: ssl-redirect - # port: - # name: use-annotation - - - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - -resources: {} -# limits: -# cpu: 100m -# memory: 128Mi -# requests: -# cpu: 100m -# memory: 128Mi - -## Node labels for pod assignment -## ref: https://kubernetes.io/docs/user-guide/node-selection/ -# -nodeSelector: {} - -## Tolerations for pod assignment -## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -## -tolerations: [] - -## Affinity for pod assignment (evaluated as template) -## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity -## -affinity: {} - -## Topology Spread Constraints -## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ -## -topologySpreadConstraints: [] - -## Additional init containers (evaluated as template) -## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ -## -extraInitContainers: [] - -## Enable an Specify container in extraContainers. This is meant to allow adding an authentication proxy to a grafana pod -extraContainers: "" -# extraContainers: | -# - name: proxy -# image: quay.io/gambol99/keycloak-proxy:latest -# args: -# - -provider=github -# - -client-id= -# - -client-secret= -# - -github-org= -# - -email-domain=* -# - -cookie-secret= -# - -http-address=http://0.0.0.0:4181 -# - -upstream-url=http://127.0.0.1:3000 -# ports: -# - name: proxy-web -# containerPort: 4181 - -## Volumes that can be used in init containers that will not be mounted to deployment pods -extraContainerVolumes: [] -# - name: volume-from-secret -# secret: -# secretName: secret-to-mount -# - name: empty-dir-volume -# emptyDir: {} - -## Enable persistence using Persistent Volume Claims -## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ -## -persistence: - type: pvc - enabled: false - # storageClassName: default - accessModes: - - ReadWriteOnce - size: 10Gi - # annotations: {} - finalizers: - - kubernetes.io/pvc-protection - # selectorLabels: {} - ## Sub-directory of the PV to mount. Can be templated. - # subPath: "" - ## Name of an existing PVC. Can be templated. - # existingClaim: - ## Extra labels to apply to a PVC. - extraPvcLabels: {} - - ## If persistence is not enabled, this allows to mount the - ## local storage in-memory to improve performance - ## - inMemory: - enabled: false - ## The maximum usage on memory medium EmptyDir would be - ## the minimum value between the SizeLimit specified - ## here and the sum of memory limits of all containers in a pod - ## - # sizeLimit: 300Mi - -initChownData: - ## If false, data ownership will not be reset at startup - ## This allows the grafana-server to be run with an arbitrary user - ## - enabled: true - - ## initChownData container image - ## - image: - # -- The Docker registry - registry: docker.io - repository: library/busybox - tag: "1.31.1" - sha: "" - pullPolicy: IfNotPresent - - ## initChownData resource requests and limits - ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## - resources: {} - # limits: - # cpu: 100m - # memory: 128Mi - # requests: - # cpu: 100m - # memory: 128Mi - securityContext: - runAsNonRoot: false - runAsUser: 0 - seccompProfile: - type: RuntimeDefault - capabilities: - add: - - CHOWN - -# Administrator credentials when not using an existing secret (see below) -adminUser: admin -# adminPassword: strongpassword - -# Use an existing secret for the admin user. -admin: - ## Name of the secret. Can be templated. - existingSecret: "" - userKey: admin-user - passwordKey: admin-password - -## Define command to be executed at startup by grafana container -## Needed if using `vault-env` to manage secrets (ref: https://banzaicloud.com/blog/inject-secrets-into-pods-vault/) -## Default is "run.sh" as defined in grafana's Dockerfile -# command: -# - "sh" -# - "/run.sh" - -## Optionally define args if command is used -## Needed if using `hashicorp/envconsul` to manage secrets -## By default no arguments are set -# args: -# - "-secret" -# - "secret/grafana" -# - "./grafana" - -## Extra environment variables that will be pass onto deployment pods -## -## to provide grafana with access to CloudWatch on AWS EKS: -## 1. create an iam role of type "Web identity" with provider oidc.eks.* (note the provider for later) -## 2. edit the "Trust relationships" of the role, add a line inside the StringEquals clause using the -## same oidc eks provider as noted before (same as the existing line) -## also, replace NAMESPACE and prometheus-operator-grafana with the service account namespace and name -## -## "oidc.eks.us-east-1.amazonaws.com/id/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:sub": "system:serviceaccount:NAMESPACE:prometheus-operator-grafana", -## -## 3. attach a policy to the role, you can use a built in policy called CloudWatchReadOnlyAccess -## 4. use the following env: (replace 123456789000 and iam-role-name-here with your aws account number and role name) -## -## env: -## AWS_ROLE_ARN: arn:aws:iam::123456789000:role/iam-role-name-here -## AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token -## AWS_REGION: us-east-1 -## -## 5. uncomment the EKS section in extraSecretMounts: below -## 6. uncomment the annotation section in the serviceAccount: above -## make sure to replace arn:aws:iam::123456789000:role/iam-role-name-here with your role arn - -env: {} - -## "valueFrom" environment variable references that will be added to deployment pods. Name is templated. -## ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/#envvarsource-v1-core -## Renders in container spec as: -## env: -## ... -## - name: -## valueFrom: -## -envValueFrom: {} - # ENV_NAME: - # configMapKeyRef: - # name: configmap-name - # key: value_key - -## The name of a secret in the same kubernetes namespace which contain values to be added to the environment -## This can be useful for auth tokens, etc. Value is templated. -envFromSecret: "" - -## Sensible environment variables that will be rendered as new secret object -## This can be useful for auth tokens, etc. -## If the secret values contains "{{", they'll need to be properly escaped so that they are not interpreted by Helm -## ref: https://helm.sh/docs/howto/charts_tips_and_tricks/#using-the-tpl-function -envRenderSecret: {} - -## The names of secrets in the same kubernetes namespace which contain values to be added to the environment -## Each entry should contain a name key, and can optionally specify whether the secret must be defined with an optional key. -## Name is templated. -envFromSecrets: [] -## - name: secret-name -## prefix: prefix -## optional: true - -## The names of conifgmaps in the same kubernetes namespace which contain values to be added to the environment -## Each entry should contain a name key, and can optionally specify whether the configmap must be defined with an optional key. -## Name is templated. -## ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#configmapenvsource-v1-core -envFromConfigMaps: [] -## - name: configmap-name -## prefix: prefix -## optional: true - -# Inject Kubernetes services as environment variables. -# See https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#environment-variables -enableServiceLinks: true - -## Additional grafana server secret mounts -# Defines additional mounts with secrets. Secrets must be manually created in the namespace. -extraSecretMounts: [] - # - name: secret-files - # mountPath: /etc/secrets - # secretName: grafana-secret-files - # readOnly: true - # subPath: "" - # - # for AWS EKS (cloudwatch) use the following (see also instruction in env: above) - # - name: aws-iam-token - # mountPath: /var/run/secrets/eks.amazonaws.com/serviceaccount - # readOnly: true - # projected: - # defaultMode: 420 - # sources: - # - serviceAccountToken: - # audience: sts.amazonaws.com - # expirationSeconds: 86400 - # path: token - # - # for CSI e.g. Azure Key Vault use the following - # - name: secrets-store-inline - # mountPath: /run/secrets - # readOnly: true - # csi: - # driver: secrets-store.csi.k8s.io - # readOnly: true - # volumeAttributes: - # secretProviderClass: "akv-grafana-spc" - # nodePublishSecretRef: # Only required when using service principal mode - # name: grafana-akv-creds # Only required when using service principal mode - -## Additional grafana server volume mounts -# Defines additional volume mounts. -extraVolumeMounts: [] - # - name: extra-volume-0 - # mountPath: /mnt/volume0 - # readOnly: true - # - name: extra-volume-1 - # mountPath: /mnt/volume1 - # readOnly: true - # - name: grafana-secrets - # mountPath: /mnt/volume2 - -## Additional Grafana server volumes -extraVolumes: [] - # - name: extra-volume-0 - # existingClaim: volume-claim - # - name: extra-volume-1 - # hostPath: - # path: /usr/shared/ - # type: "" - # - name: grafana-secrets - # csi: - # driver: secrets-store.csi.k8s.io - # readOnly: true - # volumeAttributes: - # secretProviderClass: "grafana-env-spc" - -## Container Lifecycle Hooks. Execute a specific bash command or make an HTTP request -lifecycleHooks: {} - # postStart: - # exec: - # command: [] - -## Pass the plugins you want installed as a list. -## -plugins: [] - # - digrich-bubblechart-panel - # - grafana-clock-panel - ## You can also use other plugin download URL, as long as they are valid zip files, - ## and specify the name of the plugin after the semicolon. Like this: - # - https://grafana.com/api/plugins/marcusolsson-json-datasource/versions/1.3.2/download;marcusolsson-json-datasource - -## Configure grafana datasources -## ref: http://docs.grafana.org/administration/provisioning/#datasources -## -datasources: {} -# datasources.yaml: -# apiVersion: 1 -# datasources: -# - name: Prometheus -# type: prometheus -# url: http://prometheus-prometheus-server -# access: proxy -# isDefault: true -# - name: CloudWatch -# type: cloudwatch -# access: proxy -# uid: cloudwatch -# editable: false -# jsonData: -# authType: default -# defaultRegion: us-east-1 -# deleteDatasources: [] -# - name: Prometheus - -## Configure grafana alerting (can be templated) -## ref: http://docs.grafana.org/administration/provisioning/#alerting -## -alerting: {} - # rules.yaml: - # apiVersion: 1 - # groups: - # - orgId: 1 - # name: '{{ .Chart.Name }}_my_rule_group' - # folder: my_first_folder - # interval: 60s - # rules: - # - uid: my_id_1 - # title: my_first_rule - # condition: A - # data: - # - refId: A - # datasourceUid: '-100' - # model: - # conditions: - # - evaluator: - # params: - # - 3 - # type: gt - # operator: - # type: and - # query: - # params: - # - A - # reducer: - # type: last - # type: query - # datasource: - # type: __expr__ - # uid: '-100' - # expression: 1==0 - # intervalMs: 1000 - # maxDataPoints: 43200 - # refId: A - # type: math - # dashboardUid: my_dashboard - # panelId: 123 - # noDataState: Alerting - # for: 60s - # annotations: - # some_key: some_value - # labels: - # team: sre_team_1 - # contactpoints.yaml: - # secret: - # apiVersion: 1 - # contactPoints: - # - orgId: 1 - # name: cp_1 - # receivers: - # - uid: first_uid - # type: pagerduty - # settings: - # integrationKey: XXX - # severity: critical - # class: ping failure - # component: Grafana - # group: app-stack - # summary: | - # {{ `{{ include "default.message" . }}` }} - -## Configure notifiers -## ref: http://docs.grafana.org/administration/provisioning/#alert-notification-channels -## -notifiers: {} -# notifiers.yaml: -# notifiers: -# - name: email-notifier -# type: email -# uid: email1 -# # either: -# org_id: 1 -# # or -# org_name: Main Org. -# is_default: true -# settings: -# addresses: an_email_address@example.com -# delete_notifiers: - -## Configure grafana dashboard providers -## ref: http://docs.grafana.org/administration/provisioning/#dashboards -## -## `path` must be /var/lib/grafana/dashboards/ -## -dashboardProviders: {} -# dashboardproviders.yaml: -# apiVersion: 1 -# providers: -# - name: 'default' -# orgId: 1 -# folder: '' -# type: file -# disableDeletion: false -# editable: true -# options: -# path: /var/lib/grafana/dashboards/default - -## Configure grafana dashboard to import -## NOTE: To use dashboards you must also enable/configure dashboardProviders -## ref: https://grafana.com/dashboards -## -## dashboards per provider, use provider name as key. -## -dashboards: {} - # default: - # some-dashboard: - # json: | - # $RAW_JSON - # custom-dashboard: - # file: dashboards/custom-dashboard.json - # prometheus-stats: - # gnetId: 2 - # revision: 2 - # datasource: Prometheus - # local-dashboard: - # url: https://example.com/repository/test.json - # token: '' - # local-dashboard-base64: - # url: https://example.com/repository/test-b64.json - # token: '' - # b64content: true - # local-dashboard-gitlab: - # url: https://example.com/repository/test-gitlab.json - # gitlabToken: '' - # local-dashboard-bitbucket: - # url: https://example.com/repository/test-bitbucket.json - # bearerToken: '' - # local-dashboard-azure: - # url: https://example.com/repository/test-azure.json - # basic: '' - # acceptHeader: '*/*' - -## Reference to external ConfigMap per provider. Use provider name as key and ConfigMap name as value. -## A provider dashboards must be defined either by external ConfigMaps or in values.yaml, not in both. -## ConfigMap data example: -## -## data: -## example-dashboard.json: | -## RAW_JSON -## -dashboardsConfigMaps: {} -# default: "" - -## Grafana's primary configuration -## NOTE: values in map will be converted to ini format -## ref: http://docs.grafana.org/installation/configuration/ -## -grafana.ini: - paths: - data: /var/lib/grafana/ - logs: /var/log/grafana - plugins: /var/lib/grafana/plugins - provisioning: /etc/grafana/provisioning - analytics: - check_for_updates: true - log: - mode: console - grafana_net: - url: https://grafana.net - server: - domain: "{{ if (and .Values.ingress.enabled .Values.ingress.hosts) }}{{ .Values.ingress.hosts | first }}{{ else }}''{{ end }}" -## grafana Authentication can be enabled with the following values on grafana.ini - # server: - # The full public facing url you use in browser, used for redirects and emails - # root_url: - # https://grafana.com/docs/grafana/latest/auth/github/#enable-github-in-grafana - # auth.github: - # enabled: false - # allow_sign_up: false - # scopes: user:email,read:org - # auth_url: https://github.com/login/oauth/authorize - # token_url: https://github.com/login/oauth/access_token - # api_url: https://api.github.com/user - # team_ids: - # allowed_organizations: - # client_id: - # client_secret: -## LDAP Authentication can be enabled with the following values on grafana.ini -## NOTE: Grafana will fail to start if the value for ldap.toml is invalid - # auth.ldap: - # enabled: true - # allow_sign_up: true - # config_file: /etc/grafana/ldap.toml - -## Grafana's LDAP configuration -## Templated by the template in _helpers.tpl -## NOTE: To enable the grafana.ini must be configured with auth.ldap.enabled -## ref: http://docs.grafana.org/installation/configuration/#auth-ldap -## ref: http://docs.grafana.org/installation/ldap/#configuration -ldap: - enabled: false - # `existingSecret` is a reference to an existing secret containing the ldap configuration - # for Grafana in a key `ldap-toml`. - existingSecret: "" - # `config` is the content of `ldap.toml` that will be stored in the created secret - config: "" - # config: |- - # verbose_logging = true - - # [[servers]] - # host = "my-ldap-server" - # port = 636 - # use_ssl = true - # start_tls = false - # ssl_skip_verify = false - # bind_dn = "uid=%s,ou=users,dc=myorg,dc=com" - -## Grafana's SMTP configuration -## NOTE: To enable, grafana.ini must be configured with smtp.enabled -## ref: http://docs.grafana.org/installation/configuration/#smtp -smtp: - # `existingSecret` is a reference to an existing secret containing the smtp configuration - # for Grafana. - existingSecret: "" - userKey: "user" - passwordKey: "password" - -## Sidecars that collect the configmaps with specified label and stores the included files them into the respective folders -## Requires at least Grafana 5 to work and can't be used together with parameters dashboardProviders, datasources and dashboards -sidecar: - image: - # -- The Docker registry - registry: quay.io - repository: kiwigrid/k8s-sidecar - tag: 1.25.2 - sha: "" - imagePullPolicy: IfNotPresent - resources: {} -# limits: -# cpu: 100m -# memory: 100Mi -# requests: -# cpu: 50m -# memory: 50Mi - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - seccompProfile: - type: RuntimeDefault - # skipTlsVerify Set to true to skip tls verification for kube api calls - # skipTlsVerify: true - enableUniqueFilenames: false - readinessProbe: {} - livenessProbe: {} - # Log level default for all sidecars. Can be one of: DEBUG, INFO, WARN, ERROR, CRITICAL. Defaults to INFO - # logLevel: INFO - alerts: - enabled: false - # Additional environment variables for the alerts sidecar - env: {} - # Do not reprocess already processed unchanged resources on k8s API reconnect. - # ignoreAlreadyProcessed: true - # label that the configmaps with alert are marked with - label: grafana_alert - # value of label that the configmaps with alert are set to - labelValue: "" - # Log level. Can be one of: DEBUG, INFO, WARN, ERROR, CRITICAL. - # logLevel: INFO - # If specified, the sidecar will search for alert config-maps inside this namespace. - # Otherwise the namespace in which the sidecar is running will be used. - # It's also possible to specify ALL to search in all namespaces - searchNamespace: null - # Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. - watchMethod: WATCH - # search in configmap, secret or both - resource: both - # watchServerTimeout: request to the server, asking it to cleanly close the connection after that. - # defaults to 60sec; much higher values like 3600 seconds (1h) are feasible for non-Azure K8S - # watchServerTimeout: 3600 - # - # watchClientTimeout: is a client-side timeout, configuring your local socket. - # If you have a network outage dropping all packets with no RST/FIN, - # this is how long your client waits before realizing & dropping the connection. - # defaults to 66sec (sic!) - # watchClientTimeout: 60 - # - # Endpoint to send request to reload alerts - reloadURL: "http://localhost:3000/api/admin/provisioning/alerting/reload" - # Absolute path to shell script to execute after a alert got reloaded - script: null - skipReload: false - # This is needed if skipReload is true, to load any alerts defined at startup time. - # Deploy the alert sidecar as an initContainer. - initAlerts: false - # Additional alert sidecar volume mounts - extraMounts: [] - # Sets the size limit of the alert sidecar emptyDir volume - sizeLimit: {} - dashboards: - enabled: false - # Additional environment variables for the dashboards sidecar - env: {} - # Do not reprocess already processed unchanged resources on k8s API reconnect. - # ignoreAlreadyProcessed: true - SCProvider: true - # label that the configmaps with dashboards are marked with - label: grafana_dashboard - # value of label that the configmaps with dashboards are set to - labelValue: "" - # Log level. Can be one of: DEBUG, INFO, WARN, ERROR, CRITICAL. - # logLevel: INFO - # folder in the pod that should hold the collected dashboards (unless `defaultFolderName` is set) - folder: /tmp/dashboards - # The default folder name, it will create a subfolder under the `folder` and put dashboards in there instead - defaultFolderName: null - # Namespaces list. If specified, the sidecar will search for config-maps/secrets inside these namespaces. - # Otherwise the namespace in which the sidecar is running will be used. - # It's also possible to specify ALL to search in all namespaces. - searchNamespace: null - # Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. - watchMethod: WATCH - # search in configmap, secret or both - resource: both - # If specified, the sidecar will look for annotation with this name to create folder and put graph here. - # You can use this parameter together with `provider.foldersFromFilesStructure`to annotate configmaps and create folder structure. - folderAnnotation: null - # Endpoint to send request to reload alerts - reloadURL: "http://localhost:3000/api/admin/provisioning/dashboards/reload" - # Absolute path to shell script to execute after a configmap got reloaded - script: null - skipReload: false - # watchServerTimeout: request to the server, asking it to cleanly close the connection after that. - # defaults to 60sec; much higher values like 3600 seconds (1h) are feasible for non-Azure K8S - # watchServerTimeout: 3600 - # - # watchClientTimeout: is a client-side timeout, configuring your local socket. - # If you have a network outage dropping all packets with no RST/FIN, - # this is how long your client waits before realizing & dropping the connection. - # defaults to 66sec (sic!) - # watchClientTimeout: 60 - # - # provider configuration that lets grafana manage the dashboards - provider: - # name of the provider, should be unique - name: sidecarProvider - # orgid as configured in grafana - orgid: 1 - # folder in which the dashboards should be imported in grafana - folder: '' - # type of the provider - type: file - # disableDelete to activate a import-only behaviour - disableDelete: false - # allow updating provisioned dashboards from the UI - allowUiUpdates: false - # allow Grafana to replicate dashboard structure from filesystem - foldersFromFilesStructure: false - # Additional dashboard sidecar volume mounts - extraMounts: [] - # Sets the size limit of the dashboard sidecar emptyDir volume - sizeLimit: {} - datasources: - enabled: false - # Additional environment variables for the datasourcessidecar - env: {} - envValueFrom: {} - # Do not reprocess already processed unchanged resources on k8s API reconnect. - # ignoreAlreadyProcessed: true - # label that the configmaps with datasources are marked with - label: grafana_datasource - # value of label that the configmaps with datasources are set to - labelValue: "" - # Log level. Can be one of: DEBUG, INFO, WARN, ERROR, CRITICAL. - # logLevel: INFO - # If specified, the sidecar will search for datasource config-maps inside this namespace. - # Otherwise the namespace in which the sidecar is running will be used. - # It's also possible to specify ALL to search in all namespaces - searchNamespace: null - # Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. - watchMethod: WATCH - # search in configmap, secret or both - resource: both - # watchServerTimeout: request to the server, asking it to cleanly close the connection after that. - # defaults to 60sec; much higher values like 3600 seconds (1h) are feasible for non-Azure K8S - # watchServerTimeout: 3600 - # - # watchClientTimeout: is a client-side timeout, configuring your local socket. - # If you have a network outage dropping all packets with no RST/FIN, - # this is how long your client waits before realizing & dropping the connection. - # defaults to 66sec (sic!) - # watchClientTimeout: 60 - # - # Endpoint to send request to reload datasources - reloadURL: "http://localhost:3000/api/admin/provisioning/datasources/reload" - # Absolute path to shell script to execute after a datasource got reloaded - script: null - skipReload: false - # This is needed if skipReload is true, to load any datasources defined at startup time. - # Deploy the datasources sidecar as an initContainer. - initDatasources: false - # Sets the size limit of the datasource sidecar emptyDir volume - sizeLimit: {} - plugins: - enabled: false - # Additional environment variables for the plugins sidecar - env: {} - # Do not reprocess already processed unchanged resources on k8s API reconnect. - # ignoreAlreadyProcessed: true - # label that the configmaps with plugins are marked with - label: grafana_plugin - # value of label that the configmaps with plugins are set to - labelValue: "" - # Log level. Can be one of: DEBUG, INFO, WARN, ERROR, CRITICAL. - # logLevel: INFO - # If specified, the sidecar will search for plugin config-maps inside this namespace. - # Otherwise the namespace in which the sidecar is running will be used. - # It's also possible to specify ALL to search in all namespaces - searchNamespace: null - # Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. - watchMethod: WATCH - # search in configmap, secret or both - resource: both - # watchServerTimeout: request to the server, asking it to cleanly close the connection after that. - # defaults to 60sec; much higher values like 3600 seconds (1h) are feasible for non-Azure K8S - # watchServerTimeout: 3600 - # - # watchClientTimeout: is a client-side timeout, configuring your local socket. - # If you have a network outage dropping all packets with no RST/FIN, - # this is how long your client waits before realizing & dropping the connection. - # defaults to 66sec (sic!) - # watchClientTimeout: 60 - # - # Endpoint to send request to reload plugins - reloadURL: "http://localhost:3000/api/admin/provisioning/plugins/reload" - # Absolute path to shell script to execute after a plugin got reloaded - script: null - skipReload: false - # Deploy the datasource sidecar as an initContainer in addition to a container. - # This is needed if skipReload is true, to load any plugins defined at startup time. - initPlugins: false - # Sets the size limit of the plugin sidecar emptyDir volume - sizeLimit: {} - notifiers: - enabled: false - # Additional environment variables for the notifierssidecar - env: {} - # Do not reprocess already processed unchanged resources on k8s API reconnect. - # ignoreAlreadyProcessed: true - # label that the configmaps with notifiers are marked with - label: grafana_notifier - # value of label that the configmaps with notifiers are set to - labelValue: "" - # Log level. Can be one of: DEBUG, INFO, WARN, ERROR, CRITICAL. - # logLevel: INFO - # If specified, the sidecar will search for notifier config-maps inside this namespace. - # Otherwise the namespace in which the sidecar is running will be used. - # It's also possible to specify ALL to search in all namespaces - searchNamespace: null - # Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. - watchMethod: WATCH - # search in configmap, secret or both - resource: both - # watchServerTimeout: request to the server, asking it to cleanly close the connection after that. - # defaults to 60sec; much higher values like 3600 seconds (1h) are feasible for non-Azure K8S - # watchServerTimeout: 3600 - # - # watchClientTimeout: is a client-side timeout, configuring your local socket. - # If you have a network outage dropping all packets with no RST/FIN, - # this is how long your client waits before realizing & dropping the connection. - # defaults to 66sec (sic!) - # watchClientTimeout: 60 - # - # Endpoint to send request to reload notifiers - reloadURL: "http://localhost:3000/api/admin/provisioning/notifications/reload" - # Absolute path to shell script to execute after a notifier got reloaded - script: null - skipReload: false - # Deploy the notifier sidecar as an initContainer in addition to a container. - # This is needed if skipReload is true, to load any notifiers defined at startup time. - initNotifiers: false - # Sets the size limit of the notifier sidecar emptyDir volume - sizeLimit: {} - -## Override the deployment namespace -## -namespaceOverride: "" - -## Number of old ReplicaSets to retain -## -revisionHistoryLimit: 10 - -## Add a seperate remote image renderer deployment/service -imageRenderer: - deploymentStrategy: {} - # Enable the image-renderer deployment & service - enabled: false - replicas: 1 - autoscaling: - enabled: false - minReplicas: 1 - maxReplicas: 5 - targetCPU: "60" - targetMemory: "" - behavior: {} - image: - # -- The Docker registry - registry: docker.io - # image-renderer Image repository - repository: grafana/grafana-image-renderer - # image-renderer Image tag - tag: latest - # image-renderer Image sha (optional) - sha: "" - # image-renderer ImagePullPolicy - pullPolicy: Always - # extra environment variables - env: - HTTP_HOST: "0.0.0.0" - # RENDERING_ARGS: --no-sandbox,--disable-gpu,--window-size=1280x758 - # RENDERING_MODE: clustered - # IGNORE_HTTPS_ERRORS: true - - ## "valueFrom" environment variable references that will be added to deployment pods. Name is templated. - ## ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/#envvarsource-v1-core - ## Renders in container spec as: - ## env: - ## ... - ## - name: - ## valueFrom: - ## - envValueFrom: {} - # ENV_NAME: - # configMapKeyRef: - # name: configmap-name - # key: value_key - - # image-renderer deployment serviceAccount - serviceAccountName: "" - # image-renderer deployment securityContext - securityContext: {} - # image-renderer deployment container securityContext - containerSecurityContext: - seccompProfile: - type: RuntimeDefault - capabilities: - drop: ['ALL'] - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - ## image-renderer pod annotation - podAnnotations: {} - # image-renderer deployment Host Aliases - hostAliases: [] - # image-renderer deployment priority class - priorityClassName: '' - service: - # Enable the image-renderer service - enabled: true - # image-renderer service port name - portName: 'http' - # image-renderer service port used by both service and deployment - port: 8081 - targetPort: 8081 - # Adds the appProtocol field to the image-renderer service. This allows to work with istio protocol selection. Ex: "http" or "tcp" - appProtocol: "" - serviceMonitor: - ## If true, a ServiceMonitor CRD is created for a prometheus operator - ## https://github.com/coreos/prometheus-operator - ## - enabled: false - path: /metrics - # namespace: monitoring (defaults to use the namespace this chart is deployed to) - labels: {} - interval: 1m - scheme: http - tlsConfig: {} - scrapeTimeout: 30s - relabelings: [] - # See: https://doc.crds.dev/github.com/prometheus-operator/kube-prometheus/monitoring.coreos.com/ServiceMonitor/v1@v0.11.0#spec-targetLabels - targetLabels: [] - # - targetLabel1 - # - targetLabel2 - # If https is enabled in Grafana, this needs to be set as 'https' to correctly configure the callback used in Grafana - grafanaProtocol: http - # In case a sub_path is used this needs to be added to the image renderer callback - grafanaSubPath: "" - # name of the image-renderer port on the pod - podPortName: http - # number of image-renderer replica sets to keep - revisionHistoryLimit: 10 - networkPolicy: - # Enable a NetworkPolicy to limit inbound traffic to only the created grafana pods - limitIngress: true - # Enable a NetworkPolicy to limit outbound traffic to only the created grafana pods - limitEgress: false - # Allow additional services to access image-renderer (eg. Prometheus operator when ServiceMonitor is enabled) - extraIngressSelectors: [] - resources: {} -# limits: -# cpu: 100m -# memory: 100Mi -# requests: -# cpu: 50m -# memory: 50Mi - ## Node labels for pod assignment - ## ref: https://kubernetes.io/docs/user-guide/node-selection/ - # - nodeSelector: {} - - ## Tolerations for pod assignment - ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - ## - tolerations: [] - - ## Affinity for pod assignment (evaluated as template) - ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity - ## - affinity: {} - - ## Use an alternate scheduler, e.g. "stork". - ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ - ## - # schedulerName: "default-scheduler" - -networkPolicy: - ## @param networkPolicy.enabled Enable creation of NetworkPolicy resources. Only Ingress traffic is filtered for now. - ## - enabled: false - ## @param networkPolicy.allowExternal Don't require client label for connections - ## The Policy model to apply. When set to false, only pods with the correct - ## client label will have network access to grafana port defined. - ## When true, grafana will accept connections from any source - ## (with the correct destination port). - ## - ingress: true - ## @param networkPolicy.ingress When true enables the creation - ## an ingress network policy - ## - allowExternal: true - ## @param networkPolicy.explicitNamespacesSelector A Kubernetes LabelSelector to explicitly select namespaces from which traffic could be allowed - ## If explicitNamespacesSelector is missing or set to {}, only client Pods that are in the networkPolicy's namespace - ## and that match other criteria, the ones that have the good label, can reach the grafana. - ## But sometimes, we want the grafana to be accessible to clients from other namespaces, in this case, we can use this - ## LabelSelector to select these namespaces, note that the networkPolicy's namespace should also be explicitly added. - ## - ## Example: - ## explicitNamespacesSelector: - ## matchLabels: - ## role: frontend - ## matchExpressions: - ## - {key: role, operator: In, values: [frontend]} - ## - explicitNamespacesSelector: {} - ## - ## - ## - ## - ## - ## - egress: - ## @param networkPolicy.egress.enabled When enabled, an egress network policy will be - ## created allowing grafana to connect to external data sources from kubernetes cluster. - enabled: false - ## - ## @param networkPolicy.egress.blockDNSResolution When enabled, DNS resolution will be blocked - ## for all pods in the grafana namespace. - blockDNSResolution: false - ## - ## @param networkPolicy.egress.ports Add individual ports to be allowed by the egress - ports: [] - ## Add ports to the egress by specifying - port: - ## E.X. - ## - port: 80 - ## - port: 443 - ## - ## @param networkPolicy.egress.to Allow egress traffic to specific destinations - to: [] - ## Add destinations to the egress by specifying - ipBlock: - ## E.X. - ## to: - ## - namespaceSelector: - ## matchExpressions: - ## - {key: role, operator: In, values: [grafana]} - ## - ## - ## - ## - ## - -# Enable backward compatibility of kubernetes where version below 1.13 doesn't have the enableServiceLinks option -enableKubeBackwardCompatibility: false -useStatefulSet: false -# Create a dynamic manifests via values: -extraObjects: [] - # - apiVersion: "kubernetes-client.io/v1" - # kind: ExternalSecret - # metadata: - # name: grafana-secrets - # spec: - # backendType: gcpSecretsManager - # data: - # - key: grafana-admin-password - # name: adminPassword - -# assertNoLeakedSecrets is a helper function defined in _helpers.tpl that checks if secret -# values are not exposed in the rendered grafana.ini configmap. It is enabled by default. -# -# To pass values into grafana.ini without exposing them in a configmap, use variable expansion: -# https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#variable-expansion -# -# Alternatively, if you wish to allow secret values to be exposed in the rendered grafana.ini configmap, -# you can disable this check by setting assertNoLeakedSecrets to false. -assertNoLeakedSecrets: true diff --git a/thunder_deployment/infra/beta9/charts/postgresql/.helmignore b/thunder_deployment/infra/beta9/charts/postgresql/.helmignore deleted file mode 100644 index fb56657ab..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj -# img folder -img/ diff --git a/thunder_deployment/infra/beta9/charts/postgresql/Chart.lock b/thunder_deployment/infra/beta9/charts/postgresql/Chart.lock deleted file mode 100644 index 5f5e5abcf..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: oci://registry-1.docker.io/bitnamicharts - version: 2.14.1 -digest: sha256:5ccbe5f1fe4459864a8c9d7329c400b678666b6cfb1450818a830bda81995bc3 -generated: "2023-12-20T20:39:13.141839286Z" diff --git a/thunder_deployment/infra/beta9/charts/postgresql/Chart.yaml b/thunder_deployment/infra/beta9/charts/postgresql/Chart.yaml deleted file mode 100644 index e9c12678c..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/Chart.yaml +++ /dev/null @@ -1,37 +0,0 @@ -annotations: - category: Database - images: | - - name: os-shell - image: docker.io/bitnami/os-shell:11-debian-11-r95 - - name: postgres-exporter - image: docker.io/bitnami/postgres-exporter:0.15.0-debian-11-r6 - - name: postgresql - image: docker.io/bitnami/postgresql:16.1.0-debian-11-r24 - licenses: Apache-2.0 -apiVersion: v2 -appVersion: 16.1.0 -dependencies: -- name: common - repository: oci://registry-1.docker.io/bitnamicharts - tags: - - bitnami-common - version: 2.x.x -description: PostgreSQL (Postgres) is an open source object-relational database known - for reliability and data integrity. ACID-compliant, it supports foreign keys, joins, - views, triggers and stored procedures. -home: https://bitnami.com -icon: https://bitnami.com/assets/stacks/postgresql/img/postgresql-stack-220x234.png -keywords: -- postgresql -- postgres -- database -- sql -- replication -- cluster -maintainers: -- name: VMware, Inc. - url: https://github.com/bitnami/charts -name: postgresql -sources: -- https://github.com/bitnami/charts/tree/main/bitnami/postgresql -version: 13.4.3 diff --git a/thunder_deployment/infra/beta9/charts/postgresql/README.md b/thunder_deployment/infra/beta9/charts/postgresql/README.md deleted file mode 100644 index 24a4b1fe6..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/README.md +++ /dev/null @@ -1,998 +0,0 @@ - - -# Bitnami package for PostgreSQL - -PostgreSQL (Postgres) is an open source object-relational database known for reliability and data integrity. ACID-compliant, it supports foreign keys, joins, views, triggers and stored procedures. - -[Overview of PostgreSQL](http://www.postgresql.org) - -Trademarks: This software listing is packaged by Bitnami. The respective trademarks mentioned in the offering are owned by the respective companies, and use of them does not imply any affiliation or endorsement. - -## TL;DR - -```console -helm install my-release oci://registry-1.docker.io/bitnamicharts/postgresql -``` - -Looking to use PostgreSQL in production? Try [VMware Tanzu Application Catalog](https://bitnami.com/enterprise), the enterprise edition of Bitnami Application Catalog. - -## Introduction - -This chart bootstraps a [PostgreSQL](https://github.com/bitnami/containers/tree/main/bitnami/postgresql) deployment on a [Kubernetes](https://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. - -For HA, please see [this repo](https://github.com/bitnami/charts/tree/main/bitnami/postgresql-ha) - -Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. - -## Prerequisites - -- Kubernetes 1.23+ -- Helm 3.8.0+ -- PV provisioner support in the underlying infrastructure - -## Installing the Chart - -To install the chart with the release name `my-release`: - -```console -helm install my-release oci://REGISTRY_NAME/REPOSITORY_NAME/postgresql -``` - -> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. - -The command deploys PostgreSQL on the Kubernetes cluster in the default configuration. The [Parameters](#parameters) section lists the parameters that can be configured during installation. - -> **Tip**: List all releases using `helm list` - -## Uninstalling the Chart - -To uninstall/delete the `my-release` deployment: - -```console -helm delete my-release -``` - -The command removes all the Kubernetes components but PVC's associated with the chart and deletes the release. - -To delete the PVC's associated with `my-release`: - -```console -kubectl delete pvc -l release=my-release -``` - -> **Note**: Deleting the PVC's will delete postgresql data as well. Please be cautious before doing it. - -## Parameters - -### Global parameters - -| Name | Description | Value | -| ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----- | -| `global.imageRegistry` | Global Docker image registry | `""` | -| `global.imagePullSecrets` | Global Docker registry secret names as an array | `[]` | -| `global.storageClass` | Global StorageClass for Persistent Volume(s) | `""` | -| `global.postgresql.auth.postgresPassword` | Password for the "postgres" admin user (overrides `auth.postgresPassword`) | `""` | -| `global.postgresql.auth.username` | Name for a custom user to create (overrides `auth.username`) | `""` | -| `global.postgresql.auth.password` | Password for the custom user to create (overrides `auth.password`) | `""` | -| `global.postgresql.auth.database` | Name for a custom database to create (overrides `auth.database`) | `""` | -| `global.postgresql.auth.existingSecret` | Name of existing secret to use for PostgreSQL credentials (overrides `auth.existingSecret`). | `""` | -| `global.postgresql.auth.secretKeys.adminPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials (overrides `auth.secretKeys.adminPasswordKey`). Only used when `global.postgresql.auth.existingSecret` is set. | `""` | -| `global.postgresql.auth.secretKeys.userPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials (overrides `auth.secretKeys.userPasswordKey`). Only used when `global.postgresql.auth.existingSecret` is set. | `""` | -| `global.postgresql.auth.secretKeys.replicationPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials (overrides `auth.secretKeys.replicationPasswordKey`). Only used when `global.postgresql.auth.existingSecret` is set. | `""` | -| `global.postgresql.service.ports.postgresql` | PostgreSQL service port (overrides `service.ports.postgresql`) | `""` | - -### Common parameters - -| Name | Description | Value | -| ------------------------ | -------------------------------------------------------------------------------------------- | --------------- | -| `kubeVersion` | Override Kubernetes version | `""` | -| `nameOverride` | String to partially override common.names.fullname template (will maintain the release name) | `""` | -| `fullnameOverride` | String to fully override common.names.fullname template | `""` | -| `clusterDomain` | Kubernetes Cluster Domain | `cluster.local` | -| `extraDeploy` | Array of extra objects to deploy with the release (evaluated as a template) | `[]` | -| `commonLabels` | Add labels to all the deployed resources | `{}` | -| `commonAnnotations` | Add annotations to all the deployed resources | `{}` | -| `diagnosticMode.enabled` | Enable diagnostic mode (all probes will be disabled and the command will be overridden) | `false` | -| `diagnosticMode.command` | Command to override all containers in the statefulset | `["sleep"]` | -| `diagnosticMode.args` | Args to override all containers in the statefulset | `["infinity"]` | - -### PostgreSQL common parameters - -| Name | Description | Value | -| ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | -| `image.registry` | PostgreSQL image registry | `REGISTRY_NAME` | -| `image.repository` | PostgreSQL image repository | `REPOSITORY_NAME/postgresql` | -| `image.digest` | PostgreSQL image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | -| `image.pullPolicy` | PostgreSQL image pull policy | `IfNotPresent` | -| `image.pullSecrets` | Specify image pull secrets | `[]` | -| `image.debug` | Specify if debug values should be set | `false` | -| `auth.enablePostgresUser` | Assign a password to the "postgres" admin user. Otherwise, remote access will be blocked for this user | `true` | -| `auth.postgresPassword` | Password for the "postgres" admin user. Ignored if `auth.existingSecret` is provided | `""` | -| `auth.username` | Name for a custom user to create | `""` | -| `auth.password` | Password for the custom user to create. Ignored if `auth.existingSecret` is provided | `""` | -| `auth.database` | Name for a custom database to create | `""` | -| `auth.replicationUsername` | Name of the replication user | `repl_user` | -| `auth.replicationPassword` | Password for the replication user. Ignored if `auth.existingSecret` is provided | `""` | -| `auth.existingSecret` | Name of existing secret to use for PostgreSQL credentials. `auth.postgresPassword`, `auth.password`, and `auth.replicationPassword` will be ignored and picked up from this secret. The secret might also contains the key `ldap-password` if LDAP is enabled. `ldap.bind_password` will be ignored and picked from this secret in this case. | `""` | -| `auth.secretKeys.adminPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials. Only used when `auth.existingSecret` is set. | `postgres-password` | -| `auth.secretKeys.userPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials. Only used when `auth.existingSecret` is set. | `password` | -| `auth.secretKeys.replicationPasswordKey` | Name of key in existing secret to use for PostgreSQL credentials. Only used when `auth.existingSecret` is set. | `replication-password` | -| `auth.usePasswordFiles` | Mount credentials as a files instead of using an environment variable | `false` | -| `architecture` | PostgreSQL architecture (`standalone` or `replication`) | `standalone` | -| `replication.synchronousCommit` | Set synchronous commit mode. Allowed values: `on`, `remote_apply`, `remote_write`, `local` and `off` | `off` | -| `replication.numSynchronousReplicas` | Number of replicas that will have synchronous replication. Note: Cannot be greater than `readReplicas.replicaCount`. | `0` | -| `replication.applicationName` | Cluster application name. Useful for advanced replication settings | `my_application` | -| `containerPorts.postgresql` | PostgreSQL container port | `5432` | -| `audit.logHostname` | Log client hostnames | `false` | -| `audit.logConnections` | Add client log-in operations to the log file | `false` | -| `audit.logDisconnections` | Add client log-outs operations to the log file | `false` | -| `audit.pgAuditLog` | Add operations to log using the pgAudit extension | `""` | -| `audit.pgAuditLogCatalog` | Log catalog using pgAudit | `off` | -| `audit.clientMinMessages` | Message log level to share with the user | `error` | -| `audit.logLinePrefix` | Template for log line prefix (default if not set) | `""` | -| `audit.logTimezone` | Timezone for the log timestamps | `""` | -| `ldap.enabled` | Enable LDAP support | `false` | -| `ldap.server` | IP address or name of the LDAP server. | `""` | -| `ldap.port` | Port number on the LDAP server to connect to | `""` | -| `ldap.prefix` | String to prepend to the user name when forming the DN to bind | `""` | -| `ldap.suffix` | String to append to the user name when forming the DN to bind | `""` | -| `ldap.basedn` | Root DN to begin the search for the user in | `""` | -| `ldap.binddn` | DN of user to bind to LDAP | `""` | -| `ldap.bindpw` | Password for the user to bind to LDAP | `""` | -| `ldap.searchAttribute` | Attribute to match against the user name in the search | `""` | -| `ldap.searchFilter` | The search filter to use when doing search+bind authentication | `""` | -| `ldap.scheme` | Set to `ldaps` to use LDAPS | `""` | -| `ldap.tls.enabled` | Se to true to enable TLS encryption | `false` | -| `ldap.uri` | LDAP URL beginning in the form `ldap[s]://host[:port]/basedn`. If provided, all the other LDAP parameters will be ignored. | `""` | -| `postgresqlDataDir` | PostgreSQL data dir folder | `/bitnami/postgresql/data` | -| `postgresqlSharedPreloadLibraries` | Shared preload libraries (comma-separated list) | `pgaudit` | -| `shmVolume.enabled` | Enable emptyDir volume for /dev/shm for PostgreSQL pod(s) | `true` | -| `shmVolume.sizeLimit` | Set this to enable a size limit on the shm tmpfs | `""` | -| `tls.enabled` | Enable TLS traffic support | `false` | -| `tls.autoGenerated` | Generate automatically self-signed TLS certificates | `false` | -| `tls.preferServerCiphers` | Whether to use the server's TLS cipher preferences rather than the client's | `true` | -| `tls.certificatesSecret` | Name of an existing secret that contains the certificates | `""` | -| `tls.certFilename` | Certificate filename | `""` | -| `tls.certKeyFilename` | Certificate key filename | `""` | -| `tls.certCAFilename` | CA Certificate filename | `""` | -| `tls.crlFilename` | File containing a Certificate Revocation List | `""` | - -### PostgreSQL Primary parameters - -| Name | Description | Value | -| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | --------------------- | -| `primary.name` | Name of the primary database (eg primary, master, leader, ...) | `primary` | -| `primary.configuration` | PostgreSQL Primary main configuration to be injected as ConfigMap | `""` | -| `primary.pgHbaConfiguration` | PostgreSQL Primary client authentication configuration | `""` | -| `primary.existingConfigmap` | Name of an existing ConfigMap with PostgreSQL Primary configuration | `""` | -| `primary.extendedConfiguration` | Extended PostgreSQL Primary configuration (appended to main or default configuration) | `""` | -| `primary.existingExtendedConfigmap` | Name of an existing ConfigMap with PostgreSQL Primary extended configuration | `""` | -| `primary.initdb.args` | PostgreSQL initdb extra arguments | `""` | -| `primary.initdb.postgresqlWalDir` | Specify a custom location for the PostgreSQL transaction log | `""` | -| `primary.initdb.scripts` | Dictionary of initdb scripts | `{}` | -| `primary.initdb.scriptsConfigMap` | ConfigMap with scripts to be run at first boot | `""` | -| `primary.initdb.scriptsSecret` | Secret with scripts to be run at first boot (in case it contains sensitive information) | `""` | -| `primary.initdb.user` | Specify the PostgreSQL username to execute the initdb scripts | `""` | -| `primary.initdb.password` | Specify the PostgreSQL password to execute the initdb scripts | `""` | -| `primary.standby.enabled` | Whether to enable current cluster's primary as standby server of another cluster or not | `false` | -| `primary.standby.primaryHost` | The Host of replication primary in the other cluster | `""` | -| `primary.standby.primaryPort` | The Port of replication primary in the other cluster | `""` | -| `primary.extraEnvVars` | Array with extra environment variables to add to PostgreSQL Primary nodes | `[]` | -| `primary.extraEnvVarsCM` | Name of existing ConfigMap containing extra env vars for PostgreSQL Primary nodes | `""` | -| `primary.extraEnvVarsSecret` | Name of existing Secret containing extra env vars for PostgreSQL Primary nodes | `""` | -| `primary.command` | Override default container command (useful when using custom images) | `[]` | -| `primary.args` | Override default container args (useful when using custom images) | `[]` | -| `primary.livenessProbe.enabled` | Enable livenessProbe on PostgreSQL Primary containers | `true` | -| `primary.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `30` | -| `primary.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `10` | -| `primary.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `5` | -| `primary.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `6` | -| `primary.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` | -| `primary.readinessProbe.enabled` | Enable readinessProbe on PostgreSQL Primary containers | `true` | -| `primary.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `5` | -| `primary.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `10` | -| `primary.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `5` | -| `primary.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `6` | -| `primary.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` | -| `primary.startupProbe.enabled` | Enable startupProbe on PostgreSQL Primary containers | `false` | -| `primary.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `30` | -| `primary.startupProbe.periodSeconds` | Period seconds for startupProbe | `10` | -| `primary.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `1` | -| `primary.startupProbe.failureThreshold` | Failure threshold for startupProbe | `15` | -| `primary.startupProbe.successThreshold` | Success threshold for startupProbe | `1` | -| `primary.customLivenessProbe` | Custom livenessProbe that overrides the default one | `{}` | -| `primary.customReadinessProbe` | Custom readinessProbe that overrides the default one | `{}` | -| `primary.customStartupProbe` | Custom startupProbe that overrides the default one | `{}` | -| `primary.lifecycleHooks` | for the PostgreSQL Primary container to automate configuration before or after startup | `{}` | -| `primary.resources.limits` | The resources limits for the PostgreSQL Primary containers | `{}` | -| `primary.resources.requests.memory` | The requested memory for the PostgreSQL Primary containers | `256Mi` | -| `primary.resources.requests.cpu` | The requested cpu for the PostgreSQL Primary containers | `250m` | -| `primary.podSecurityContext.enabled` | Enable security context | `true` | -| `primary.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | -| `primary.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | -| `primary.podSecurityContext.supplementalGroups` | Set filesystem extra groups | `[]` | -| `primary.podSecurityContext.fsGroup` | Group ID for the pod | `1001` | -| `primary.containerSecurityContext.enabled` | Enabled containers' Security Context | `true` | -| `primary.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | -| `primary.containerSecurityContext.runAsUser` | Set containers' Security Context runAsUser | `1001` | -| `primary.containerSecurityContext.runAsNonRoot` | Set container's Security Context runAsNonRoot | `true` | -| `primary.containerSecurityContext.privileged` | Set container's Security Context privileged | `false` | -| `primary.containerSecurityContext.readOnlyRootFilesystem` | Set container's Security Context readOnlyRootFilesystem | `false` | -| `primary.containerSecurityContext.allowPrivilegeEscalation` | Set container's Security Context allowPrivilegeEscalation | `false` | -| `primary.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped | `["ALL"]` | -| `primary.containerSecurityContext.seccompProfile.type` | Set container's Security Context seccomp profile | `RuntimeDefault` | -| `primary.automountServiceAccountToken` | Mount Service Account token in pod | `false` | -| `primary.hostAliases` | PostgreSQL primary pods host aliases | `[]` | -| `primary.hostNetwork` | Specify if host network should be enabled for PostgreSQL pod (postgresql primary) | `false` | -| `primary.hostIPC` | Specify if host IPC should be enabled for PostgreSQL pod (postgresql primary) | `false` | -| `primary.labels` | Map of labels to add to the statefulset (postgresql primary) | `{}` | -| `primary.annotations` | Annotations for PostgreSQL primary pods | `{}` | -| `primary.podLabels` | Map of labels to add to the pods (postgresql primary) | `{}` | -| `primary.podAnnotations` | Map of annotations to add to the pods (postgresql primary) | `{}` | -| `primary.podAffinityPreset` | PostgreSQL primary pod affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` | `""` | -| `primary.podAntiAffinityPreset` | PostgreSQL primary pod anti-affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` | `soft` | -| `primary.nodeAffinityPreset.type` | PostgreSQL primary node affinity preset type. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` | `""` | -| `primary.nodeAffinityPreset.key` | PostgreSQL primary node label key to match Ignored if `primary.affinity` is set. | `""` | -| `primary.nodeAffinityPreset.values` | PostgreSQL primary node label values to match. Ignored if `primary.affinity` is set. | `[]` | -| `primary.affinity` | Affinity for PostgreSQL primary pods assignment | `{}` | -| `primary.nodeSelector` | Node labels for PostgreSQL primary pods assignment | `{}` | -| `primary.tolerations` | Tolerations for PostgreSQL primary pods assignment | `[]` | -| `primary.topologySpreadConstraints` | Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template | `[]` | -| `primary.priorityClassName` | Priority Class to use for each pod (postgresql primary) | `""` | -| `primary.schedulerName` | Use an alternate scheduler, e.g. "stork". | `""` | -| `primary.terminationGracePeriodSeconds` | Seconds PostgreSQL primary pod needs to terminate gracefully | `""` | -| `primary.updateStrategy.type` | PostgreSQL Primary statefulset strategy type | `RollingUpdate` | -| `primary.updateStrategy.rollingUpdate` | PostgreSQL Primary statefulset rolling update configuration parameters | `{}` | -| `primary.extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for the PostgreSQL Primary container(s) | `[]` | -| `primary.extraVolumes` | Optionally specify extra list of additional volumes for the PostgreSQL Primary pod(s) | `[]` | -| `primary.sidecars` | Add additional sidecar containers to the PostgreSQL Primary pod(s) | `[]` | -| `primary.initContainers` | Add additional init containers to the PostgreSQL Primary pod(s) | `[]` | -| `primary.extraPodSpec` | Optionally specify extra PodSpec for the PostgreSQL Primary pod(s) | `{}` | -| `primary.service.type` | Kubernetes Service type | `ClusterIP` | -| `primary.service.ports.postgresql` | PostgreSQL service port | `5432` | -| `primary.service.nodePorts.postgresql` | Node port for PostgreSQL | `""` | -| `primary.service.clusterIP` | Static clusterIP or None for headless services | `""` | -| `primary.service.annotations` | Annotations for PostgreSQL primary service | `{}` | -| `primary.service.loadBalancerIP` | Load balancer IP if service type is `LoadBalancer` | `""` | -| `primary.service.externalTrafficPolicy` | Enable client source IP preservation | `Cluster` | -| `primary.service.loadBalancerSourceRanges` | Addresses that are allowed when service is LoadBalancer | `[]` | -| `primary.service.extraPorts` | Extra ports to expose in the PostgreSQL primary service | `[]` | -| `primary.service.sessionAffinity` | Session Affinity for Kubernetes service, can be "None" or "ClientIP" | `None` | -| `primary.service.sessionAffinityConfig` | Additional settings for the sessionAffinity | `{}` | -| `primary.service.headless.annotations` | Additional custom annotations for headless PostgreSQL primary service | `{}` | -| `primary.persistence.enabled` | Enable PostgreSQL Primary data persistence using PVC | `true` | -| `primary.persistence.existingClaim` | Name of an existing PVC to use | `""` | -| `primary.persistence.mountPath` | The path the volume will be mounted at | `/bitnami/postgresql` | -| `primary.persistence.subPath` | The subdirectory of the volume to mount to | `""` | -| `primary.persistence.storageClass` | PVC Storage Class for PostgreSQL Primary data volume | `""` | -| `primary.persistence.accessModes` | PVC Access Mode for PostgreSQL volume | `["ReadWriteOnce"]` | -| `primary.persistence.size` | PVC Storage Request for PostgreSQL volume | `8Gi` | -| `primary.persistence.annotations` | Annotations for the PVC | `{}` | -| `primary.persistence.labels` | Labels for the PVC | `{}` | -| `primary.persistence.selector` | Selector to match an existing Persistent Volume (this value is evaluated as a template) | `{}` | -| `primary.persistence.dataSource` | Custom PVC data source | `{}` | -| `primary.persistentVolumeClaimRetentionPolicy.enabled` | Enable Persistent volume retention policy for Primary Statefulset | `false` | -| `primary.persistentVolumeClaimRetentionPolicy.whenScaled` | Volume retention behavior when the replica count of the StatefulSet is reduced | `Retain` | -| `primary.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted | `Retain` | - -### PostgreSQL read only replica parameters (only used when `architecture` is set to `replication`) - -| Name | Description | Value | -| ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | --------------------- | -| `readReplicas.name` | Name of the read replicas database (eg secondary, slave, ...) | `read` | -| `readReplicas.replicaCount` | Number of PostgreSQL read only replicas | `1` | -| `readReplicas.extendedConfiguration` | Extended PostgreSQL read only replicas configuration (appended to main or default configuration) | `""` | -| `readReplicas.extraEnvVars` | Array with extra environment variables to add to PostgreSQL read only nodes | `[]` | -| `readReplicas.extraEnvVarsCM` | Name of existing ConfigMap containing extra env vars for PostgreSQL read only nodes | `""` | -| `readReplicas.extraEnvVarsSecret` | Name of existing Secret containing extra env vars for PostgreSQL read only nodes | `""` | -| `readReplicas.command` | Override default container command (useful when using custom images) | `[]` | -| `readReplicas.args` | Override default container args (useful when using custom images) | `[]` | -| `readReplicas.livenessProbe.enabled` | Enable livenessProbe on PostgreSQL read only containers | `true` | -| `readReplicas.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `30` | -| `readReplicas.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `10` | -| `readReplicas.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `5` | -| `readReplicas.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `6` | -| `readReplicas.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` | -| `readReplicas.readinessProbe.enabled` | Enable readinessProbe on PostgreSQL read only containers | `true` | -| `readReplicas.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `5` | -| `readReplicas.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `10` | -| `readReplicas.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `5` | -| `readReplicas.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `6` | -| `readReplicas.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` | -| `readReplicas.startupProbe.enabled` | Enable startupProbe on PostgreSQL read only containers | `false` | -| `readReplicas.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `30` | -| `readReplicas.startupProbe.periodSeconds` | Period seconds for startupProbe | `10` | -| `readReplicas.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `1` | -| `readReplicas.startupProbe.failureThreshold` | Failure threshold for startupProbe | `15` | -| `readReplicas.startupProbe.successThreshold` | Success threshold for startupProbe | `1` | -| `readReplicas.customLivenessProbe` | Custom livenessProbe that overrides the default one | `{}` | -| `readReplicas.customReadinessProbe` | Custom readinessProbe that overrides the default one | `{}` | -| `readReplicas.customStartupProbe` | Custom startupProbe that overrides the default one | `{}` | -| `readReplicas.lifecycleHooks` | for the PostgreSQL read only container to automate configuration before or after startup | `{}` | -| `readReplicas.resources.limits` | The resources limits for the PostgreSQL read only containers | `{}` | -| `readReplicas.resources.requests.memory` | The requested memory for the PostgreSQL read only containers | `256Mi` | -| `readReplicas.resources.requests.cpu` | The requested cpu for the PostgreSQL read only containers | `250m` | -| `readReplicas.podSecurityContext.enabled` | Enable security context | `true` | -| `readReplicas.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | -| `readReplicas.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | -| `readReplicas.podSecurityContext.supplementalGroups` | Set filesystem extra groups | `[]` | -| `readReplicas.podSecurityContext.fsGroup` | Group ID for the pod | `1001` | -| `readReplicas.containerSecurityContext.enabled` | Enabled containers' Security Context | `true` | -| `readReplicas.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | -| `readReplicas.containerSecurityContext.runAsUser` | Set containers' Security Context runAsUser | `1001` | -| `readReplicas.containerSecurityContext.runAsNonRoot` | Set container's Security Context runAsNonRoot | `true` | -| `readReplicas.containerSecurityContext.privileged` | Set container's Security Context privileged | `false` | -| `readReplicas.containerSecurityContext.readOnlyRootFilesystem` | Set container's Security Context readOnlyRootFilesystem | `false` | -| `readReplicas.containerSecurityContext.allowPrivilegeEscalation` | Set container's Security Context allowPrivilegeEscalation | `false` | -| `readReplicas.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped | `["ALL"]` | -| `readReplicas.containerSecurityContext.seccompProfile.type` | Set container's Security Context seccomp profile | `RuntimeDefault` | -| `readReplicas.automountServiceAccountToken` | Mount Service Account token in pod | `false` | -| `readReplicas.hostAliases` | PostgreSQL read only pods host aliases | `[]` | -| `readReplicas.hostNetwork` | Specify if host network should be enabled for PostgreSQL pod (PostgreSQL read only) | `false` | -| `readReplicas.hostIPC` | Specify if host IPC should be enabled for PostgreSQL pod (postgresql primary) | `false` | -| `readReplicas.labels` | Map of labels to add to the statefulset (PostgreSQL read only) | `{}` | -| `readReplicas.annotations` | Annotations for PostgreSQL read only pods | `{}` | -| `readReplicas.podLabels` | Map of labels to add to the pods (PostgreSQL read only) | `{}` | -| `readReplicas.podAnnotations` | Map of annotations to add to the pods (PostgreSQL read only) | `{}` | -| `readReplicas.podAffinityPreset` | PostgreSQL read only pod affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` | `""` | -| `readReplicas.podAntiAffinityPreset` | PostgreSQL read only pod anti-affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` | `soft` | -| `readReplicas.nodeAffinityPreset.type` | PostgreSQL read only node affinity preset type. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` | `""` | -| `readReplicas.nodeAffinityPreset.key` | PostgreSQL read only node label key to match Ignored if `primary.affinity` is set. | `""` | -| `readReplicas.nodeAffinityPreset.values` | PostgreSQL read only node label values to match. Ignored if `primary.affinity` is set. | `[]` | -| `readReplicas.affinity` | Affinity for PostgreSQL read only pods assignment | `{}` | -| `readReplicas.nodeSelector` | Node labels for PostgreSQL read only pods assignment | `{}` | -| `readReplicas.tolerations` | Tolerations for PostgreSQL read only pods assignment | `[]` | -| `readReplicas.topologySpreadConstraints` | Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template | `[]` | -| `readReplicas.priorityClassName` | Priority Class to use for each pod (PostgreSQL read only) | `""` | -| `readReplicas.schedulerName` | Use an alternate scheduler, e.g. "stork". | `""` | -| `readReplicas.terminationGracePeriodSeconds` | Seconds PostgreSQL read only pod needs to terminate gracefully | `""` | -| `readReplicas.updateStrategy.type` | PostgreSQL read only statefulset strategy type | `RollingUpdate` | -| `readReplicas.updateStrategy.rollingUpdate` | PostgreSQL read only statefulset rolling update configuration parameters | `{}` | -| `readReplicas.extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for the PostgreSQL read only container(s) | `[]` | -| `readReplicas.extraVolumes` | Optionally specify extra list of additional volumes for the PostgreSQL read only pod(s) | `[]` | -| `readReplicas.sidecars` | Add additional sidecar containers to the PostgreSQL read only pod(s) | `[]` | -| `readReplicas.initContainers` | Add additional init containers to the PostgreSQL read only pod(s) | `[]` | -| `readReplicas.extraPodSpec` | Optionally specify extra PodSpec for the PostgreSQL read only pod(s) | `{}` | -| `readReplicas.service.type` | Kubernetes Service type | `ClusterIP` | -| `readReplicas.service.ports.postgresql` | PostgreSQL service port | `5432` | -| `readReplicas.service.nodePorts.postgresql` | Node port for PostgreSQL | `""` | -| `readReplicas.service.clusterIP` | Static clusterIP or None for headless services | `""` | -| `readReplicas.service.annotations` | Annotations for PostgreSQL read only service | `{}` | -| `readReplicas.service.loadBalancerIP` | Load balancer IP if service type is `LoadBalancer` | `""` | -| `readReplicas.service.externalTrafficPolicy` | Enable client source IP preservation | `Cluster` | -| `readReplicas.service.loadBalancerSourceRanges` | Addresses that are allowed when service is LoadBalancer | `[]` | -| `readReplicas.service.extraPorts` | Extra ports to expose in the PostgreSQL read only service | `[]` | -| `readReplicas.service.sessionAffinity` | Session Affinity for Kubernetes service, can be "None" or "ClientIP" | `None` | -| `readReplicas.service.sessionAffinityConfig` | Additional settings for the sessionAffinity | `{}` | -| `readReplicas.service.headless.annotations` | Additional custom annotations for headless PostgreSQL read only service | `{}` | -| `readReplicas.persistence.enabled` | Enable PostgreSQL read only data persistence using PVC | `true` | -| `readReplicas.persistence.existingClaim` | Name of an existing PVC to use | `""` | -| `readReplicas.persistence.mountPath` | The path the volume will be mounted at | `/bitnami/postgresql` | -| `readReplicas.persistence.subPath` | The subdirectory of the volume to mount to | `""` | -| `readReplicas.persistence.storageClass` | PVC Storage Class for PostgreSQL read only data volume | `""` | -| `readReplicas.persistence.accessModes` | PVC Access Mode for PostgreSQL volume | `["ReadWriteOnce"]` | -| `readReplicas.persistence.size` | PVC Storage Request for PostgreSQL volume | `8Gi` | -| `readReplicas.persistence.annotations` | Annotations for the PVC | `{}` | -| `readReplicas.persistence.labels` | Labels for the PVC | `{}` | -| `readReplicas.persistence.selector` | Selector to match an existing Persistent Volume (this value is evaluated as a template) | `{}` | -| `readReplicas.persistence.dataSource` | Custom PVC data source | `{}` | -| `readReplicas.persistentVolumeClaimRetentionPolicy.enabled` | Enable Persistent volume retention policy for read only Statefulset | `false` | -| `readReplicas.persistentVolumeClaimRetentionPolicy.whenScaled` | Volume retention behavior when the replica count of the StatefulSet is reduced | `Retain` | -| `readReplicas.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted | `Retain` | - -### Backup parameters - -| Name | Description | Value | -| ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `backup.enabled` | Enable the logical dump of the database "regularly" | `false` | -| `backup.cronjob.schedule` | Set the cronjob parameter schedule | `@daily` | -| `backup.cronjob.timeZone` | Set the cronjob parameter timeZone | `""` | -| `backup.cronjob.concurrencyPolicy` | Set the cronjob parameter concurrencyPolicy | `Allow` | -| `backup.cronjob.failedJobsHistoryLimit` | Set the cronjob parameter failedJobsHistoryLimit | `1` | -| `backup.cronjob.successfulJobsHistoryLimit` | Set the cronjob parameter successfulJobsHistoryLimit | `3` | -| `backup.cronjob.startingDeadlineSeconds` | Set the cronjob parameter startingDeadlineSeconds | `""` | -| `backup.cronjob.ttlSecondsAfterFinished` | Set the cronjob parameter ttlSecondsAfterFinished | `""` | -| `backup.cronjob.restartPolicy` | Set the cronjob parameter restartPolicy | `OnFailure` | -| `backup.cronjob.podSecurityContext.enabled` | Enable PodSecurityContext for CronJob/Backup | `true` | -| `backup.cronjob.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | -| `backup.cronjob.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | -| `backup.cronjob.podSecurityContext.supplementalGroups` | Set filesystem extra groups | `[]` | -| `backup.cronjob.podSecurityContext.fsGroup` | Group ID for the CronJob | `1001` | -| `backup.cronjob.containerSecurityContext.enabled` | Enabled containers' Security Context | `true` | -| `backup.cronjob.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | -| `backup.cronjob.containerSecurityContext.runAsUser` | Set containers' Security Context runAsUser | `1001` | -| `backup.cronjob.containerSecurityContext.runAsNonRoot` | Set container's Security Context runAsNonRoot | `true` | -| `backup.cronjob.containerSecurityContext.privileged` | Set container's Security Context privileged | `false` | -| `backup.cronjob.containerSecurityContext.readOnlyRootFilesystem` | Set container's Security Context readOnlyRootFilesystem | `false` | -| `backup.cronjob.containerSecurityContext.allowPrivilegeEscalation` | Set container's Security Context allowPrivilegeEscalation | `false` | -| `backup.cronjob.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped | `["ALL"]` | -| `backup.cronjob.containerSecurityContext.seccompProfile.type` | Set container's Security Context seccomp profile | `RuntimeDefault` | -| `backup.cronjob.command` | Set backup container's command to run | `["/bin/sh","-c","pg_dumpall --clean --if-exists --load-via-partition-root --quote-all-identifiers --no-password --file=${PGDUMP_DIR}/pg_dumpall-$(date '+%Y-%m-%d-%H-%M').pgdump"]` | -| `backup.cronjob.labels` | Set the cronjob labels | `{}` | -| `backup.cronjob.annotations` | Set the cronjob annotations | `{}` | -| `backup.cronjob.nodeSelector` | Node labels for PostgreSQL backup CronJob pod assignment | `{}` | -| `backup.cronjob.storage.existingClaim` | Provide an existing `PersistentVolumeClaim` (only when `architecture=standalone`) | `""` | -| `backup.cronjob.storage.resourcePolicy` | Setting it to "keep" to avoid removing PVCs during a helm delete operation. Leaving it empty will delete PVCs after the chart deleted | `""` | -| `backup.cronjob.storage.storageClass` | PVC Storage Class for the backup data volume | `""` | -| `backup.cronjob.storage.accessModes` | PV Access Mode | `["ReadWriteOnce"]` | -| `backup.cronjob.storage.size` | PVC Storage Request for the backup data volume | `8Gi` | -| `backup.cronjob.storage.annotations` | PVC annotations | `{}` | -| `backup.cronjob.storage.mountPath` | Path to mount the volume at | `/backup/pgdump` | -| `backup.cronjob.storage.subPath` | Subdirectory of the volume to mount at | `""` | -| `backup.cronjob.storage.volumeClaimTemplates.selector` | A label query over volumes to consider for binding (e.g. when using local volumes) | `{}` | - -### NetworkPolicy parameters - -| Name | Description | Value | -| ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | -| `networkPolicy.enabled` | Enable network policies | `false` | -| `networkPolicy.metrics.enabled` | Enable network policies for metrics (prometheus) | `false` | -| `networkPolicy.metrics.namespaceSelector` | Monitoring namespace selector labels. These labels will be used to identify the prometheus' namespace. | `{}` | -| `networkPolicy.metrics.podSelector` | Monitoring pod selector labels. These labels will be used to identify the Prometheus pods. | `{}` | -| `networkPolicy.ingressRules.primaryAccessOnlyFrom.enabled` | Enable ingress rule that makes PostgreSQL primary node only accessible from a particular origin. | `false` | -| `networkPolicy.ingressRules.primaryAccessOnlyFrom.namespaceSelector` | Namespace selector label that is allowed to access the PostgreSQL primary node. This label will be used to identified the allowed namespace(s). | `{}` | -| `networkPolicy.ingressRules.primaryAccessOnlyFrom.podSelector` | Pods selector label that is allowed to access the PostgreSQL primary node. This label will be used to identified the allowed pod(s). | `{}` | -| `networkPolicy.ingressRules.primaryAccessOnlyFrom.customRules` | Custom network policy for the PostgreSQL primary node. | `[]` | -| `networkPolicy.ingressRules.readReplicasAccessOnlyFrom.enabled` | Enable ingress rule that makes PostgreSQL read-only nodes only accessible from a particular origin. | `false` | -| `networkPolicy.ingressRules.readReplicasAccessOnlyFrom.namespaceSelector` | Namespace selector label that is allowed to access the PostgreSQL read-only nodes. This label will be used to identified the allowed namespace(s). | `{}` | -| `networkPolicy.ingressRules.readReplicasAccessOnlyFrom.podSelector` | Pods selector label that is allowed to access the PostgreSQL read-only nodes. This label will be used to identified the allowed pod(s). | `{}` | -| `networkPolicy.ingressRules.readReplicasAccessOnlyFrom.customRules` | Custom network policy for the PostgreSQL read-only nodes. | `[]` | -| `networkPolicy.egressRules.denyConnectionsToExternal` | Enable egress rule that denies outgoing traffic outside the cluster, except for DNS (port 53). | `false` | -| `networkPolicy.egressRules.customRules` | Custom network policy rule | `[]` | - -### Volume Permissions parameters - -| Name | Description | Value | -| ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | -------------------------- | -| `volumePermissions.enabled` | Enable init container that changes the owner and group of the persistent volume | `false` | -| `volumePermissions.image.registry` | Init container volume-permissions image registry | `REGISTRY_NAME` | -| `volumePermissions.image.repository` | Init container volume-permissions image repository | `REPOSITORY_NAME/os-shell` | -| `volumePermissions.image.digest` | Init container volume-permissions image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | -| `volumePermissions.image.pullPolicy` | Init container volume-permissions image pull policy | `IfNotPresent` | -| `volumePermissions.image.pullSecrets` | Init container volume-permissions image pull secrets | `[]` | -| `volumePermissions.resources.limits` | Init container volume-permissions resource limits | `{}` | -| `volumePermissions.resources.requests` | Init container volume-permissions resource requests | `{}` | -| `volumePermissions.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | -| `volumePermissions.containerSecurityContext.runAsUser` | User ID for the init container | `0` | -| `volumePermissions.containerSecurityContext.runAsGroup` | Group ID for the init container | `0` | -| `volumePermissions.containerSecurityContext.runAsNonRoot` | runAsNonRoot for the init container | `false` | -| `volumePermissions.containerSecurityContext.seccompProfile.type` | seccompProfile.type for the init container | `RuntimeDefault` | - -### Other Parameters - -| Name | Description | Value | -| --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------- | -| `serviceBindings.enabled` | Create secret for service binding (Experimental) | `false` | -| `serviceAccount.create` | Enable creation of ServiceAccount for PostgreSQL pod | `true` | -| `serviceAccount.name` | The name of the ServiceAccount to use. | `""` | -| `serviceAccount.automountServiceAccountToken` | Allows auto mount of ServiceAccountToken on the serviceAccount created | `false` | -| `serviceAccount.annotations` | Additional custom annotations for the ServiceAccount | `{}` | -| `rbac.create` | Create Role and RoleBinding (required for PSP to work) | `false` | -| `rbac.rules` | Custom RBAC rules to set | `[]` | -| `psp.create` | Whether to create a PodSecurityPolicy. WARNING: PodSecurityPolicy is deprecated in Kubernetes v1.21 or later, unavailable in v1.25 or later | `false` | - -### Metrics Parameters - -| Name | Description | Value | -| ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ----------------------------------- | -| `metrics.enabled` | Start a prometheus exporter | `false` | -| `metrics.image.registry` | PostgreSQL Prometheus Exporter image registry | `REGISTRY_NAME` | -| `metrics.image.repository` | PostgreSQL Prometheus Exporter image repository | `REPOSITORY_NAME/postgres-exporter` | -| `metrics.image.digest` | PostgreSQL image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | -| `metrics.image.pullPolicy` | PostgreSQL Prometheus Exporter image pull policy | `IfNotPresent` | -| `metrics.image.pullSecrets` | Specify image pull secrets | `[]` | -| `metrics.collectors` | Control enabled collectors | `{}` | -| `metrics.customMetrics` | Define additional custom metrics | `{}` | -| `metrics.extraEnvVars` | Extra environment variables to add to PostgreSQL Prometheus exporter | `[]` | -| `metrics.containerSecurityContext.enabled` | Enabled containers' Security Context | `true` | -| `metrics.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | -| `metrics.containerSecurityContext.runAsUser` | Set containers' Security Context runAsUser | `1001` | -| `metrics.containerSecurityContext.runAsNonRoot` | Set container's Security Context runAsNonRoot | `true` | -| `metrics.containerSecurityContext.privileged` | Set container's Security Context privileged | `false` | -| `metrics.containerSecurityContext.readOnlyRootFilesystem` | Set container's Security Context readOnlyRootFilesystem | `false` | -| `metrics.containerSecurityContext.allowPrivilegeEscalation` | Set container's Security Context allowPrivilegeEscalation | `false` | -| `metrics.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped | `["ALL"]` | -| `metrics.containerSecurityContext.seccompProfile.type` | Set container's Security Context seccomp profile | `RuntimeDefault` | -| `metrics.livenessProbe.enabled` | Enable livenessProbe on PostgreSQL Prometheus exporter containers | `true` | -| `metrics.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `5` | -| `metrics.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `10` | -| `metrics.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `5` | -| `metrics.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `6` | -| `metrics.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` | -| `metrics.readinessProbe.enabled` | Enable readinessProbe on PostgreSQL Prometheus exporter containers | `true` | -| `metrics.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `5` | -| `metrics.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `10` | -| `metrics.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `5` | -| `metrics.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `6` | -| `metrics.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` | -| `metrics.startupProbe.enabled` | Enable startupProbe on PostgreSQL Prometheus exporter containers | `false` | -| `metrics.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `10` | -| `metrics.startupProbe.periodSeconds` | Period seconds for startupProbe | `10` | -| `metrics.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `1` | -| `metrics.startupProbe.failureThreshold` | Failure threshold for startupProbe | `15` | -| `metrics.startupProbe.successThreshold` | Success threshold for startupProbe | `1` | -| `metrics.customLivenessProbe` | Custom livenessProbe that overrides the default one | `{}` | -| `metrics.customReadinessProbe` | Custom readinessProbe that overrides the default one | `{}` | -| `metrics.customStartupProbe` | Custom startupProbe that overrides the default one | `{}` | -| `metrics.containerPorts.metrics` | PostgreSQL Prometheus exporter metrics container port | `9187` | -| `metrics.resources.limits` | The resources limits for the PostgreSQL Prometheus exporter container | `{}` | -| `metrics.resources.requests` | The requested resources for the PostgreSQL Prometheus exporter container | `{}` | -| `metrics.service.ports.metrics` | PostgreSQL Prometheus Exporter service port | `9187` | -| `metrics.service.clusterIP` | Static clusterIP or None for headless services | `""` | -| `metrics.service.sessionAffinity` | Control where client requests go, to the same pod or round-robin | `None` | -| `metrics.service.annotations` | Annotations for Prometheus to auto-discover the metrics endpoint | `{}` | -| `metrics.serviceMonitor.enabled` | Create ServiceMonitor Resource for scraping metrics using Prometheus Operator | `false` | -| `metrics.serviceMonitor.namespace` | Namespace for the ServiceMonitor Resource (defaults to the Release Namespace) | `""` | -| `metrics.serviceMonitor.interval` | Interval at which metrics should be scraped. | `""` | -| `metrics.serviceMonitor.scrapeTimeout` | Timeout after which the scrape is ended | `""` | -| `metrics.serviceMonitor.labels` | Additional labels that can be used so ServiceMonitor will be discovered by Prometheus | `{}` | -| `metrics.serviceMonitor.selector` | Prometheus instance selector labels | `{}` | -| `metrics.serviceMonitor.relabelings` | RelabelConfigs to apply to samples before scraping | `[]` | -| `metrics.serviceMonitor.metricRelabelings` | MetricRelabelConfigs to apply to samples before ingestion | `[]` | -| `metrics.serviceMonitor.honorLabels` | Specify honorLabels parameter to add the scrape endpoint | `false` | -| `metrics.serviceMonitor.jobLabel` | The name of the label on the target service to use as the job name in prometheus. | `""` | -| `metrics.prometheusRule.enabled` | Create a PrometheusRule for Prometheus Operator | `false` | -| `metrics.prometheusRule.namespace` | Namespace for the PrometheusRule Resource (defaults to the Release Namespace) | `""` | -| `metrics.prometheusRule.labels` | Additional labels that can be used so PrometheusRule will be discovered by Prometheus | `{}` | -| `metrics.prometheusRule.rules` | PrometheusRule definitions | `[]` | - -Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example, - -```console -helm install my-release \ - --set auth.postgresPassword=secretpassword - oci://REGISTRY_NAME/REPOSITORY_NAME/postgresql -``` - -> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. - -The above command sets the PostgreSQL `postgres` account password to `secretpassword`. - -> NOTE: Once this chart is deployed, it is not possible to change the application's access credentials, such as usernames or passwords, using Helm. To change these application credentials after deployment, delete any persistent volumes (PVs) used by the chart and re-deploy it, or use the application's built-in administrative tools if available. -> **Warning** Setting a password will be ignored on new installation in case when previous PostgreSQL release was deleted through the helm command. In that case, old PVC will have an old password, and setting it through helm won't take effect. Deleting persistent volumes (PVs) will solve the issue. Refer to [issue 2061](https://github.com/bitnami/charts/issues/2061) for more details - -Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example, - -```console -helm install my-release -f values.yaml oci://REGISTRY_NAME/REPOSITORY_NAME/postgresql -``` - -> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. -> **Tip**: You can use the default [values.yaml](https://github.com/bitnami/charts/tree/main/bitnami/postgresql/values.yaml) - -## Configuration and installation details - -### [Rolling VS Immutable tags](https://docs.bitnami.com/tutorials/understand-rolling-tags-containers) - -It is strongly recommended to use immutable tags in a production environment. This ensures your deployment does not change automatically if the same tag is updated with a different image. - -Bitnami will release a new chart updating its containers if a new version of the main container, significant changes, or critical vulnerabilities exist. - -### Customizing primary and read replica services in a replicated configuration - -At the top level, there is a service object which defines the services for both primary and readReplicas. For deeper customization, there are service objects for both the primary and read types individually. This allows you to override the values in the top level service object so that the primary and read can be of different service types and with different clusterIPs / nodePorts. Also in the case you want the primary and read to be of type nodePort, you will need to set the nodePorts to different values to prevent a collision. The values that are deeper in the primary.service or readReplicas.service objects will take precedence over the top level service object. - -### Use a different PostgreSQL version - -To modify the application version used in this chart, specify a different version of the image using the `image.tag` parameter and/or a different repository using the `image.repository` parameter. - -### LDAP - -LDAP support can be enabled in the chart by specifying the `ldap.` parameters while creating a release. The following parameters should be configured to properly enable the LDAP support in the chart. - -- **ldap.enabled**: Enable LDAP support. Defaults to `false`. -- **ldap.uri**: LDAP URL beginning in the form `ldap[s]://:`. No defaults. -- **ldap.base**: LDAP base DN. No defaults. -- **ldap.binddn**: LDAP bind DN. No defaults. -- **ldap.bindpw**: LDAP bind password. No defaults. -- **ldap.bslookup**: LDAP base lookup. No defaults. -- **ldap.nss_initgroups_ignoreusers**: LDAP ignored users. `root,nslcd`. -- **ldap.scope**: LDAP search scope. No defaults. -- **ldap.tls_reqcert**: LDAP TLS check on server certificates. No defaults. - -For example: - -```text -ldap.enabled="true" -ldap.uri="ldap://my_ldap_server" -ldap.base="dc=example\,dc=org" -ldap.binddn="cn=admin\,dc=example\,dc=org" -ldap.bindpw="admin" -ldap.bslookup="ou=group-ok\,dc=example\,dc=org" -ldap.nss_initgroups_ignoreusers="root\,nslcd" -ldap.scope="sub" -ldap.tls_reqcert="demand" -``` - -Next, login to the PostgreSQL server using the `psql` client and add the PAM authenticated LDAP users. - -> Note: Parameters including commas must be escaped as shown in the above example. - -### postgresql.conf / pg_hba.conf files as configMap - -This helm chart also supports to customize the PostgreSQL configuration file. You can add additional PostgreSQL configuration parameters using the `primary.extendedConfiguration`/`readReplicas.extendedConfiguration` parameters as a string. Alternatively, to replace the entire default configuration use `primary.configuration`. - -You can also add a custom pg_hba.conf using the `primary.pgHbaConfiguration` parameter. - -In addition to these options, you can also set an external ConfigMap with all the configuration files. This is done by setting the `primary.existingConfigmap` parameter. Note that this will override the two previous options. - -### Initialize a fresh instance - -The [Bitnami PostgreSQL](https://github.com/bitnami/containers/tree/main/bitnami/postgresql) image allows you to use your custom scripts to initialize a fresh instance. In order to execute the scripts, you can specify custom scripts using the `primary.initdb.scripts` parameter as a string. - -In addition, you can also set an external ConfigMap with all the initialization scripts. This is done by setting the `primary.initdb.scriptsConfigMap` parameter. Note that this will override the two previous options. If your initialization scripts contain sensitive information such as credentials or passwords, you can use the `primary.initdb.scriptsSecret` parameter. - -The allowed extensions are `.sh`, `.sql` and `.sql.gz`. - -### Securing traffic using TLS - -TLS support can be enabled in the chart by specifying the `tls.` parameters while creating a release. The following parameters should be configured to properly enable the TLS support in the chart: - -- `tls.enabled`: Enable TLS support. Defaults to `false` -- `tls.certificatesSecret`: Name of an existing secret that contains the certificates. No defaults. -- `tls.certFilename`: Certificate filename. No defaults. -- `tls.certKeyFilename`: Certificate key filename. No defaults. - -For example: - -- First, create the secret with the cetificates files: - - ```console - kubectl create secret generic certificates-tls-secret --from-file=./cert.crt --from-file=./cert.key --from-file=./ca.crt - ``` - -- Then, use the following parameters: - - ```console - volumePermissions.enabled=true - tls.enabled=true - tls.certificatesSecret="certificates-tls-secret" - tls.certFilename="cert.crt" - tls.certKeyFilename="cert.key" - ``` - - > Note TLS and VolumePermissions: PostgreSQL requires certain permissions on sensitive files (such as certificate keys) to start up. Due to an on-going [issue](https://github.com/kubernetes/kubernetes/issues/57923) regarding kubernetes permissions and the use of `containerSecurityContext.runAsUser`, you must enable `volumePermissions` to ensure everything works as expected. - -### Sidecars - -If you need additional containers to run within the same pod as PostgreSQL (e.g. an additional metrics or logging exporter), you can do so via the `sidecars` config parameter. Simply define your container according to the Kubernetes container spec. - -```yaml -# For the PostgreSQL primary -primary: - sidecars: - - name: your-image-name - image: your-image - imagePullPolicy: Always - ports: - - name: portname - containerPort: 1234 -# For the PostgreSQL replicas -readReplicas: - sidecars: - - name: your-image-name - image: your-image - imagePullPolicy: Always - ports: - - name: portname - containerPort: 1234 -``` - -### Metrics - -The chart optionally can start a metrics exporter for [prometheus](https://prometheus.io). The metrics endpoint (port 9187) is not exposed and it is expected that the metrics are collected from inside the k8s cluster using something similar as the described in the [example Prometheus scrape configuration](https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus-kubernetes.yml). - -The exporter allows to create custom metrics from additional SQL queries. See the Chart's `values.yaml` for an example and consult the [exporters documentation](https://github.com/wrouesnel/postgres_exporter#adding-new-metrics-via-a-config-file) for more details. - -### Use of global variables - -In more complex scenarios, we may have the following tree of dependencies - -```text - +--------------+ - | | - +------------+ Chart 1 +-----------+ - | | | | - | --------+------+ | - | | | - | | | - | | | - | | | - v v v -+-------+------+ +--------+------+ +--------+------+ -| | | | | | -| PostgreSQL | | Sub-chart 1 | | Sub-chart 2 | -| | | | | | -+--------------+ +---------------+ +---------------+ -``` - -The three charts below depend on the parent chart Chart 1. However, subcharts 1 and 2 may need to connect to PostgreSQL as well. In order to do so, subcharts 1 and 2 need to know the PostgreSQL credentials, so one option for deploying could be deploy Chart 1 with the following parameters: - -```text -postgresql.auth.username=testuser -subchart1.postgresql.auth.username=testuser -subchart2.postgresql.auth.username=testuser -postgresql.auth.password=testpass -subchart1.postgresql.auth.password=testpass -subchart2.postgresql.auth.password=testpass -postgresql.auth.database=testdb -subchart1.postgresql.auth.database=testdb -subchart2.postgresql.auth.database=testdb -``` - -If the number of dependent sub-charts increases, installing the chart with parameters can become increasingly difficult. An alternative would be to set the credentials using global variables as follows: - -```text -global.postgresql.auth.username=testuser -global.postgresql.auth.password=testpass -global.postgresql.auth.database=testdb -``` - -This way, the credentials will be available in all of the subcharts. - -### Persistence - -The [Bitnami PostgreSQL](https://github.com/bitnami/containers/tree/main/bitnami/postgresql) image stores the PostgreSQL data and configurations at the `/bitnami/postgresql` path of the container. - -Persistent Volume Claims are used to keep the data across deployments. This is known to work in GCE, AWS, and minikube. -See the [Parameters](#parameters) section to configure the PVC or to disable persistence. - -If you already have data in it, you will fail to sync to standby nodes for all commits, details can refer to the [code present in the container repository](https://github.com/bitnami/containers/tree/main/bitnami/postgresql). If you need to use those data, please covert them to sql and import after `helm install` finished. - -### Backup and restore PostgreSQL deployments - -To back up and restore Bitnami PostgreSQL Helm chart deployments on Kubernetes, you need to back up the persistent volumes from the source deployment and attach them to a new deployment using [Velero](https://velero.io/), a Kubernetes backup/restore tool. - -These are the steps you will usually follow to back up and restore your PostgreSQL cluster data: - -- Install Velero on the source and destination clusters. -- Use Velero to back up the PersistentVolumes (PVs) used by the deployment on the source cluster. -- Use Velero to restore the backed-up PVs on the destination cluster. -- Create a new deployment on the destination cluster with the same chart, deployment name, credentials and other parameters as the original. This new deployment will use the restored PVs and hence the original data. - -Refer to our detailed [tutorial on backing up and restoring PostgreSQL deployments on Kubernetes](https://docs.bitnami.com/tutorials/migrate-data-bitnami-velero/) for more information. - -### NetworkPolicy - -To enable network policy for PostgreSQL, install [a networking plugin that implements the Kubernetes NetworkPolicy spec](https://kubernetes.io/docs/tasks/administer-cluster/declare-network-policy#before-you-begin), and set `networkPolicy.enabled` to `true`. - -For Kubernetes v1.5 & v1.6, you must also turn on NetworkPolicy by setting the DefaultDeny namespace annotation. Note: this will enforce policy for _all_ pods in the namespace: - -```console -kubectl annotate namespace default "net.beta.kubernetes.io/network-policy={\"ingress\":{\"isolation\":\"DefaultDeny\"}}" -``` - -With NetworkPolicy enabled, traffic will be limited to just port 5432. - -For more precise policy, set `networkPolicy.allowExternal=false`. This will only allow pods with the generated client label to connect to PostgreSQL. -This label will be displayed in the output of a successful install. - -### Differences between Bitnami PostgreSQL image and [Docker Official](https://hub.docker.com/_/postgres) image - -- The Docker Official PostgreSQL image does not support replication. If you pass any replication environment variable, this would be ignored. The only environment variables supported by the Docker Official image are POSTGRES_USER, POSTGRES_DB, POSTGRES_PASSWORD, POSTGRES_INITDB_ARGS, POSTGRES_INITDB_WALDIR and PGDATA. All the remaining environment variables are specific to the Bitnami PostgreSQL image. -- The Bitnami PostgreSQL image is non-root by default. This requires that you run the pod with `securityContext` and updates the permissions of the volume with an `initContainer`. A key benefit of this configuration is that the pod follows security best practices and is prepared to run on Kubernetes distributions with hard security constraints like OpenShift. -- For OpenShift up to 4.10, let set the volume permissions, security context, runAsUser and fsGroup automatically by OpenShift and disable the predefined settings of the helm chart: primary.securityContext.enabled=false,primary.containerSecurityContext.enabled=false,volumePermissions.enabled=false,shmVolume.enabled=false -- For OpenShift 4.11 and higher, let set OpenShift the runAsUser and fsGroup automatically. Configure the pod and container security context to restrictive defaults and disable the volume permissions setup: primary. - podSecurityContext.fsGroup=null,primary.podSecurityContext.seccompProfile.type=RuntimeDefault,primary.containerSecurityContext.runAsUser=null,primary.containerSecurityContext.allowPrivilegeEscalation=false,primary.containerSecurityContext.runAsNonRoot=true,primary.containerSecurityContext.seccompProfile.type=RuntimeDefault,primary.containerSecurityContext.capabilities.drop=['ALL'],volumePermissions.enabled=false,shmVolume.enabled=false - -### Setting Pod's affinity - -This chart allows you to set your custom affinity using the `XXX.affinity` parameter(s). Find more information about Pod's affinity in the [kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity). - -As an alternative, you can use of the preset configurations for pod affinity, pod anti-affinity, and node affinity available at the [bitnami/common](https://github.com/bitnami/charts/tree/main/bitnami/common#affinities) chart. To do so, set the `XXX.podAffinityPreset`, `XXX.podAntiAffinityPreset`, or `XXX.nodeAffinityPreset` parameters. - -## Troubleshooting - -Find more information about how to deal with common errors related to Bitnami's Helm charts in [this troubleshooting guide](https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues). - -## Upgrading - -### To 13.0.0 - -This major version changes the default PostgreSQL image from 15.x to 16.x. Follow the [official instructions](https://www.postgresql.org/docs/16/upgrading.html) to upgrade to 16.x. - -### To 12.0.0 - -This major version changes the default PostgreSQL image from 14.x to 15.x. Follow the [official instructions](https://www.postgresql.org/docs/15/upgrading.html) to upgrade to 15.x. - -### To 11.0.0 - -In this version the application version was bumped to _14.x_ series. Also, this major release renames several values in this chart and adds missing features, in order to be inline with the rest of assets in the Bitnami charts repository. - -- _replication.enabled_ parameter is deprecated in favor of _architecture_ parameter that accepts two values: _standalone_ and _replication_. -- _replication.singleService_ and _replication.uniqueServices_ parameters are deprecated. When using replication, each statefulset (primary and read-only) has its own headless service & service allowing to connect to read-only replicas through the service (round-robin) or individually. -- _postgresqlPostgresPassword_, _postgresqlUsername_, _postgresqlPassword_, _postgresqlDatabase_, _replication.user_, _replication.password_, and _existingSecret_ parameters have been regrouped under the _auth_ map. The _auth_ map uses a new perspective to configure authentication, so please read carefully each sub-parameter description. -- _extraEnv_ has been deprecated in favor of _primary.extraEnvVars_ and _readReplicas.extraEnvVars_. -- _postgresqlConfiguration_, _pgHbaConfiguration_, _configurationConfigMap_, _postgresqlExtendedConf_, and _extendedConfConfigMap_ have been deprecated in favor of _primary.configuration_, _primary.pgHbaConfiguration_, _primary.existingConfigmap_, _primary.extendedConfiguration_, and _primary.existingExtendedConfigmap_. -- _postgresqlInitdbArgs_, _postgresqlInitdbWalDir_, _initdbScripts_, _initdbScriptsConfigMap_, _initdbScriptsSecret_, _initdbUser_ and _initdbPassword_ have been regrouped under the _primary.initdb_ map. -- _postgresqlMaxConnections_, _postgresqlPostgresConnectionLimit_, _postgresqlDbUserConnectionLimit_, _postgresqlTcpKeepalivesInterval_, _postgresqlTcpKeepalivesIdle_, _postgresqlTcpKeepalivesCount_, _postgresqlStatementTimeout_ and _postgresqlPghbaRemoveFilters_ parameters are deprecated. Use _XXX.extraEnvVars_ instead. -- _primaryAsStandBy_ has been deprecated in favor of _primary.standby_. -- _securityContext_ and _containerSecurityContext_ have been deprecated in favor of _primary.podSecurityContext_, _primary.containerSecurityContext_, _readReplicas.podSecurityContext_, and _readReplicas.containerSecurityContext_. -- _livenessProbe_ and _readinessProbe_ maps have been deprecated in favor of _primary.livenessProbe_, _primary.readinessProbe_, _readReplicas.livenessProbe_ and _readReplicas.readinessProbe_ maps. -- _persistence_ map has been deprecated in favor of _primary.persistence_ and _readReplicas.persistence_ maps. -- _networkPolicy_ map has been completely refactored. -- _service_ map has been deprecated in favor of _primary.service_ and _readReplicas.service_ maps. -- _metrics.service.port_ has been regrouped under the _metrics.service.ports_ map. -- _serviceAccount.enabled_ and _serviceAccount.autoMount_ have been deprecated in favor of _serviceAccount.create_ and _serviceAccount.automountServiceAccountToken_. - -#### How to upgrade to version 11.0.0 - -To upgrade to _11.0.0_ from _10.x_, it should be done reusing the PVC(s) used to hold the PostgreSQL data on your previous release. To do so, follow the instructions below (the following example assumes that the release name is _postgresql_): - -> NOTE: Please, create a backup of your database before running any of these actions. - -1. Obtain the credentials and the names of the PVCs used to hold the PostgreSQL data on your current release: - -```console -export POSTGRESQL_PASSWORD=$(kubectl get secret --namespace default postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode) -export POSTGRESQL_PVC=$(kubectl get pvc -l app.kubernetes.io/instance=postgresql,role=primary -o jsonpath="{.items[0].metadata.name}") -``` - -1. Delete the PostgreSQL statefulset (notice the option _--cascade=false_) and secret: - -```console -kubectl delete statefulsets.apps postgresql-postgresql --namespace default --cascade=false -kubectl delete secret postgresql --namespace default -``` - -1. Upgrade your release using the same PostgreSQL version: - -```console -CURRENT_VERSION=$(kubectl exec postgresql-postgresql-0 -- bash -c 'echo $BITNAMI_IMAGE_VERSION') -helm upgrade postgresql bitnami/postgresql \ - --set auth.postgresPassword=$POSTGRESQL_PASSWORD \ - --set primary.persistence.existingClaim=$POSTGRESQL_PVC \ - --set image.tag=$CURRENT_VERSION -``` - -1. You will have to delete the existing PostgreSQL pod and the new statefulset is going to create a new one - -```console -kubectl delete pod postgresql-postgresql-0 -``` - -1. Finally, you should see the lines below in PostgreSQL container logs: - -```text -$ kubectl logs $(kubectl get pods -l app.kubernetes.io/instance=postgresql,app.kubernetes.io/name=postgresql,app.kubernetes.io/component=primary -o jsonpath="{.items[0].metadata.name}") -... -postgresql 08:05:12.59 INFO ==> Deploying PostgreSQL with persisted data... -... -``` - -> NOTE: the instructions above reuse the same PostgreSQL version you were using in your chart release. Otherwise, you will find an error such as the one below when upgrading since the new chart major version also bumps the application version. To workaround this issue you need to upgrade database, please refer to the [official PostgreSQL documentation](https://www.postgresql.org/docs/current/upgrading.html) for more information about this. - -```console -$ kubectl logs $(kubectl get pods -l app.kubernetes.io/instance=postgresql,app.kubernetes.io/name=postgresql,app.kubernetes.io/component=primary -o jsonpath="{.items[0].metadata.name}") - ... -postgresql 08:10:14.72 INFO ==> ** Starting PostgreSQL ** -2022-02-01 08:10:14.734 GMT [1] FATAL: database files are incompatible with server -2022-02-01 08:10:14.734 GMT [1] DETAIL: The data directory was initialized by PostgreSQL version 11, which is not compatible with this version 14.1. -``` - -### To 10.0.0 - -[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. - -- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. -- Move dependency information from the _requirements.yaml_ to the _Chart.yaml_ -- After running _helm dependency update_, a _Chart.lock_ file is generated containing the same structure used in the previous _requirements.lock_ -- The different fields present in the _Chart.yaml_ file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Chart. -- The term _master_ has been replaced with _primary_ and _slave_ with _readReplicas_ throughout the chart. Role names have changed from _master_ and _slave_ to _primary_ and _read_. - -#### Considerations when upgrading to this version - -- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version does not support Helm v2 anymore. -- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3. - -#### Useful links - -- [Bitnami Tutorial](https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues) -- [Helm docs](https://helm.sh/docs/topics/v2_v3_migration) -- [Helm Blog](https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3) - -#### How to upgrade to version 10.0.0 - -To upgrade to _10.0.0_ from _9.x_, it should be done reusing the PVC(s) used to hold the PostgreSQL data on your previous release. To do so, follow the instructions below (the following example assumes that the release name is _postgresql_): - -> NOTE: Please, create a backup of your database before running any of those actions. - -1. Obtain the credentials and the names of the PVCs used to hold the PostgreSQL data on your current release: - -```console -export POSTGRESQL_PASSWORD=$(kubectl get secret --namespace default postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode) -export POSTGRESQL_PVC=$(kubectl get pvc -l app.kubernetes.io/instance=postgresql,role=primary -o jsonpath="{.items[0].metadata.name}") -``` - -1. Delete the PostgreSQL statefulset (notice the option _--cascade=false_): - -```console -kubectl delete statefulsets.apps postgresql-postgresql --namespace default --cascade=false -``` - -1. Upgrade your release using the same PostgreSQL version: - -```console -helm upgrade postgresql bitnami/postgresql \ - --set postgresqlPassword=$POSTGRESQL_PASSWORD \ - --set persistence.existingClaim=$POSTGRESQL_PVC -``` - -1. Delete the existing PostgreSQL pod and the new statefulset will create a new one: - -```console -kubectl delete pod postgresql-postgresql-0 -``` - -1. Finally, you should see the lines below in PostgreSQL container logs: - -```text -$ kubectl logs $(kubectl get pods -l app.kubernetes.io/instance=postgresql,app.kubernetes.io/name=postgresql,role=primary -o jsonpath="{.items[0].metadata.name}") -... -postgresql 08:05:12.59 INFO ==> Deploying PostgreSQL with persisted data... -... -``` - -### To 9.0.0 - -In this version the chart was adapted to follow the [Helm standard labels](https://helm.sh/docs/chart_best_practices/labels/#standard-labels). - -- Some inmutable objects were modified to adopt Helm standard labels introducing backward incompatibilities. - -#### How to upgrade to version 9.0.0 - -To upgrade to _9.0.0_ from _8.x_, it should be done reusing the PVC(s) used to hold the PostgreSQL data on your previous release. To do so, follow the instructions below (the following example assumes that the release name is _postgresql_): - -> NOTE: Please, create a backup of your database before running any of those actions. - -1. Obtain the credentials and the names of the PVCs used to hold the PostgreSQL data on your current release: - -```console -export POSTGRESQL_PASSWORD=$(kubectl get secret --namespace default postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode) -export POSTGRESQL_PVC=$(kubectl get pvc -l app=postgresql,role=master -o jsonpath="{.items[0].metadata.name}") -``` - -1. Delete the PostgreSQL statefulset (notice the option _--cascade=false_): - -```console -kubectl delete statefulsets.apps postgresql-postgresql --namespace default --cascade=false -``` - -1. Upgrade your release using the same PostgreSQL version: - -```console -helm upgrade postgresql bitnami/postgresql \ - --set postgresqlPassword=$POSTGRESQL_PASSWORD \ - --set persistence.existingClaim=$POSTGRESQL_PVC -``` - -1. Delete the existing PostgreSQL pod and the new statefulset will create a new one: - -```console -kubectl delete pod postgresql-postgresql-0 -``` - -1. Finally, you should see the lines below in PostgreSQL container logs: - -```text -$ kubectl logs $(kubectl get pods -l app.kubernetes.io/instance=postgresql,app.kubernetes.io/name=postgresql,role=master -o jsonpath="{.items[0].metadata.name}") -... -postgresql 08:05:12.59 INFO ==> Deploying PostgreSQL with persisted data... -... -``` - -## License - -Copyright © 2024 Broadcom. The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. - -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 - - - -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. \ No newline at end of file diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/.helmignore b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/.helmignore deleted file mode 100644 index 50af03172..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/.helmignore +++ /dev/null @@ -1,22 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/Chart.yaml b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/Chart.yaml deleted file mode 100644 index 9a6aa881f..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/Chart.yaml +++ /dev/null @@ -1,23 +0,0 @@ -annotations: - category: Infrastructure - licenses: Apache-2.0 -apiVersion: v2 -appVersion: 2.14.1 -description: A Library Helm Chart for grouping common logic between bitnami charts. - This chart is not deployable by itself. -home: https://bitnami.com -icon: https://bitnami.com/downloads/logos/bitnami-mark.png -keywords: -- common -- helper -- template -- function -- bitnami -maintainers: -- name: VMware, Inc. - url: https://github.com/bitnami/charts -name: common -sources: -- https://github.com/bitnami/charts -type: library -version: 2.14.1 diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/README.md b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/README.md deleted file mode 100644 index a76fa46a2..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/README.md +++ /dev/null @@ -1,235 +0,0 @@ -# Bitnami Common Library Chart - -A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between Bitnami charts. - -## TL;DR - -```yaml -dependencies: - - name: common - version: 2.x.x - repository: oci://registry-1.docker.io/bitnamicharts -``` - -```console -helm dependency update -``` - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.names.fullname" . }} -data: - myvalue: "Hello World" -``` - -Looking to use our applications in production? Try [VMware Tanzu Application Catalog](https://bitnami.com/enterprise), the enterprise edition of Bitnami Application Catalog. - -## Introduction - -This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. - -Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. - -## Prerequisites - -- Kubernetes 1.23+ -- Helm 3.8.0+ - -## Parameters - -## Special input schemas - -### ImageRoot - -```yaml -registry: - type: string - description: Docker registry where the image is located - example: docker.io - -repository: - type: string - description: Repository and image name - example: bitnami/nginx - -tag: - type: string - description: image tag - example: 1.16.1-debian-10-r63 - -pullPolicy: - type: string - description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' - -pullSecrets: - type: array - items: - type: string - description: Optionally specify an array of imagePullSecrets (evaluated as templates). - -debug: - type: boolean - description: Set to true if you would like to see extra information on logs - example: false - -## An instance would be: -# registry: docker.io -# repository: bitnami/nginx -# tag: 1.16.1-debian-10-r63 -# pullPolicy: IfNotPresent -# debug: false -``` - -### Persistence - -```yaml -enabled: - type: boolean - description: Whether enable persistence. - example: true - -storageClass: - type: string - description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. - example: "-" - -accessMode: - type: string - description: Access mode for the Persistent Volume Storage. - example: ReadWriteOnce - -size: - type: string - description: Size the Persistent Volume Storage. - example: 8Gi - -path: - type: string - description: Path to be persisted. - example: /bitnami - -## An instance would be: -# enabled: true -# storageClass: "-" -# accessMode: ReadWriteOnce -# size: 8Gi -# path: /bitnami -``` - -### ExistingSecret - -```yaml -name: - type: string - description: Name of the existing secret. - example: mySecret -keyMapping: - description: Mapping between the expected key name and the name of the key in the existing secret. - type: object - -## An instance would be: -# name: mySecret -# keyMapping: -# password: myPasswordKey -``` - -#### Example of use - -When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. - -```yaml -# templates/secret.yaml ---- -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "common.names.fullname" . }} - labels: - app: {{ include "common.names.fullname" . }} -type: Opaque -data: - password: {{ .Values.password | b64enc | quote }} - -# templates/dpl.yaml ---- -... - env: - - name: PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} - key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} -... - -# values.yaml ---- -name: mySecret -keyMapping: - password: myPasswordKey -``` - -### ValidateValue - -#### NOTES.txt - -```console -{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} - -{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} -``` - -If we force those values to be empty we will see some alerts - -```console -helm install test mychart --set path.to.value00="",path.to.value01="" - 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: - - export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) - - 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: - - export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) -``` - -## Upgrading - -### To 1.0.0 - -[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. - -#### What changes were introduced in this major version? - -- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. -- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. -- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts - -#### Considerations when upgrading to this version - -- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues -- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore -- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 - -#### Useful links - -- -- -- - -## License - -Copyright © 2023 VMware, Inc. - -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 - - - -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. diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_affinities.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_affinities.tpl deleted file mode 100644 index e85b1df45..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_affinities.tpl +++ /dev/null @@ -1,139 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} - -{{/* -Return a soft nodeAffinity definition -{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.soft" -}} -preferredDuringSchedulingIgnoredDuringExecution: - - preference: - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} - weight: 1 -{{- end -}} - -{{/* -Return a hard nodeAffinity definition -{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.hard" -}} -requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} -{{- end -}} - -{{/* -Return a nodeAffinity definition -{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.nodes.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.nodes.hard" . -}} - {{- end -}} -{{- end -}} - -{{/* -Return a topologyKey definition -{{ include "common.affinities.topologyKey" (dict "topologyKey" "BAR") -}} -*/}} -{{- define "common.affinities.topologyKey" -}} -{{ .topologyKey | default "kubernetes.io/hostname" -}} -{{- end -}} - -{{/* -Return a soft podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.soft" (dict "component" "FOO" "customLabels" .Values.podLabels "extraMatchLabels" .Values.extraMatchLabels "topologyKey" "BAR" "extraPodAffinityTerms" .Values.extraPodAffinityTerms "context" $) -}} -*/}} -{{- define "common.affinities.pods.soft" -}} -{{- $component := default "" .component -}} -{{- $customLabels := default (dict) .customLabels -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -{{- $extraPodAffinityTerms := default (list) .extraPodAffinityTerms -}} -preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" ( dict "customLabels" $customLabels "context" .context )) | nindent 10 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} - weight: 1 - {{- range $extraPodAffinityTerms }} - - podAffinityTerm: - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" ( dict "customLabels" $customLabels "context" $.context )) | nindent 10 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := .extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} - weight: {{ .weight | default 1 -}} - {{- end -}} -{{- end -}} - -{{/* -Return a hard podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.hard" (dict "component" "FOO" "customLabels" .Values.podLabels "extraMatchLabels" .Values.extraMatchLabels "topologyKey" "BAR" "extraPodAffinityTerms" .Values.extraPodAffinityTerms "context" $) -}} -*/}} -{{- define "common.affinities.pods.hard" -}} -{{- $component := default "" .component -}} -{{- $customLabels := default (dict) .customLabels -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -{{- $extraPodAffinityTerms := default (list) .extraPodAffinityTerms -}} -requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" ( dict "customLabels" $customLabels "context" .context )) | nindent 8 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} - {{- range $extraPodAffinityTerms }} - - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" ( dict "customLabels" $customLabels "context" $.context )) | nindent 8 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := .extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} - {{- end -}} -{{- end -}} - -{{/* -Return a podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.pods" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.pods.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.pods.hard" . -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_capabilities.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_capabilities.tpl deleted file mode 100644 index 115674af8..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_capabilities.tpl +++ /dev/null @@ -1,229 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} - -{{/* -Return the target Kubernetes version -*/}} -{{- define "common.capabilities.kubeVersion" -}} -{{- if .Values.global }} - {{- if .Values.global.kubeVersion }} - {{- .Values.global.kubeVersion -}} - {{- else }} - {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} - {{- end -}} -{{- else }} -{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for poddisruptionbudget. -*/}} -{{- define "common.capabilities.policy.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "policy/v1beta1" -}} -{{- else -}} -{{- print "policy/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for networkpolicy. -*/}} -{{- define "common.capabilities.networkPolicy.apiVersion" -}} -{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for cronjob. -*/}} -{{- define "common.capabilities.cronjob.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "batch/v1beta1" -}} -{{- else -}} -{{- print "batch/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for daemonset. -*/}} -{{- define "common.capabilities.daemonset.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for deployment. -*/}} -{{- define "common.capabilities.deployment.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for statefulset. -*/}} -{{- define "common.capabilities.statefulset.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apps/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for ingress. -*/}} -{{- define "common.capabilities.ingress.apiVersion" -}} -{{- if .Values.ingress -}} -{{- if .Values.ingress.apiVersion -}} -{{- .Values.ingress.apiVersion -}} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end }} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for RBAC resources. -*/}} -{{- define "common.capabilities.rbac.apiVersion" -}} -{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "rbac.authorization.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "rbac.authorization.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for CRDs. -*/}} -{{- define "common.capabilities.crd.apiVersion" -}} -{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiextensions.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiextensions.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for APIService. -*/}} -{{- define "common.capabilities.apiService.apiVersion" -}} -{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiregistration.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiregistration.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for Horizontal Pod Autoscaler. -*/}} -{{- define "common.capabilities.hpa.apiVersion" -}} -{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} -{{- if .beta2 -}} -{{- print "autoscaling/v2beta2" -}} -{{- else -}} -{{- print "autoscaling/v2beta1" -}} -{{- end -}} -{{- else -}} -{{- print "autoscaling/v2" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for Vertical Pod Autoscaler. -*/}} -{{- define "common.capabilities.vpa.apiVersion" -}} -{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} -{{- if .beta2 -}} -{{- print "autoscaling/v2beta2" -}} -{{- else -}} -{{- print "autoscaling/v2beta1" -}} -{{- end -}} -{{- else -}} -{{- print "autoscaling/v2" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if PodSecurityPolicy is supported -*/}} -{{- define "common.capabilities.psp.supported" -}} -{{- if semverCompare "<1.25-0" (include "common.capabilities.kubeVersion" .) -}} - {{- true -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if AdmissionConfiguration is supported -*/}} -{{- define "common.capabilities.admissionConfiguration.supported" -}} -{{- if semverCompare ">=1.23-0" (include "common.capabilities.kubeVersion" .) -}} - {{- true -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for AdmissionConfiguration. -*/}} -{{- define "common.capabilities.admissionConfiguration.apiVersion" -}} -{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiserver.config.k8s.io/v1alpha1" -}} -{{- else if semverCompare "<1.25-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiserver.config.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiserver.config.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for PodSecurityConfiguration. -*/}} -{{- define "common.capabilities.podSecurityConfiguration.apiVersion" -}} -{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "pod-security.admission.config.k8s.io/v1alpha1" -}} -{{- else if semverCompare "<1.25-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "pod-security.admission.config.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "pod-security.admission.config.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the used Helm version is 3.3+. -A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. -This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. -**To be removed when the catalog's minimun Helm version is 3.3** -*/}} -{{- define "common.capabilities.supportsHelmVersion" -}} -{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_errors.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_errors.tpl deleted file mode 100644 index 07ded6f64..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_errors.tpl +++ /dev/null @@ -1,28 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Through error when upgrading using empty passwords values that must not be empty. - -Usage: -{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} -{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} -{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} - -Required password params: - - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. - - context - Context - Required. Parent context. -*/}} -{{- define "common.errors.upgrade.passwords.empty" -}} - {{- $validationErrors := join "" .validationErrors -}} - {{- if and $validationErrors .context.Release.IsUpgrade -}} - {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} - {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} - {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} - {{- $errorString = print $errorString "\n%s" -}} - {{- printf $errorString $validationErrors | fail -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_images.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_images.tpl deleted file mode 100644 index 1bcb779df..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_images.tpl +++ /dev/null @@ -1,117 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper image name -{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" .Values.global ) }} -*/}} -{{- define "common.images.image" -}} -{{- $registryName := .imageRoot.registry -}} -{{- $repositoryName := .imageRoot.repository -}} -{{- $separator := ":" -}} -{{- $termination := .imageRoot.tag | toString -}} -{{- if .global }} - {{- if .global.imageRegistry }} - {{- $registryName = .global.imageRegistry -}} - {{- end -}} -{{- end -}} -{{- if .imageRoot.digest }} - {{- $separator = "@" -}} - {{- $termination = .imageRoot.digest | toString -}} -{{- end -}} -{{- if $registryName }} - {{- printf "%s/%s%s%s" $registryName $repositoryName $separator $termination -}} -{{- else -}} - {{- printf "%s%s%s" $repositoryName $separator $termination -}} -{{- end -}} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) -{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} -*/}} -{{- define "common.images.pullSecrets" -}} - {{- $pullSecrets := list }} - - {{- if .global }} - {{- range .global.imagePullSecrets -}} - {{- if kindIs "map" . -}} - {{- $pullSecrets = append $pullSecrets .name -}} - {{- else -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end }} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- if kindIs "map" . -}} - {{- $pullSecrets = append $pullSecrets .name -}} - {{- else -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets | uniq }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names evaluating values as templates -{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} -*/}} -{{- define "common.images.renderPullSecrets" -}} - {{- $pullSecrets := list }} - {{- $context := .context }} - - {{- if $context.Values.global }} - {{- range $context.Values.global.imagePullSecrets -}} - {{- if kindIs "map" . -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" .name "context" $context)) -}} - {{- else -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- if kindIs "map" . -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" .name "context" $context)) -}} - {{- else -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets | uniq }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} - -{{/* -Return the proper image version (ingores image revision/prerelease info & fallbacks to chart appVersion) -{{ include "common.images.version" ( dict "imageRoot" .Values.path.to.the.image "chart" .Chart ) }} -*/}} -{{- define "common.images.version" -}} -{{- $imageTag := .imageRoot.tag | toString -}} -{{/* regexp from https://github.com/Masterminds/semver/blob/23f51de38a0866c5ef0bfc42b3f735c73107b700/version.go#L41-L44 */}} -{{- if regexMatch `^([0-9]+)(\.[0-9]+)?(\.[0-9]+)?(-([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?(\+([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?$` $imageTag -}} - {{- $version := semver $imageTag -}} - {{- printf "%d.%d.%d" $version.Major $version.Minor $version.Patch -}} -{{- else -}} - {{- print .chart.AppVersion -}} -{{- end -}} -{{- end -}} - diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_ingress.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_ingress.tpl deleted file mode 100644 index efa5b85c7..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_ingress.tpl +++ /dev/null @@ -1,73 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} - -{{/* -Generate backend entry that is compatible with all Kubernetes API versions. - -Usage: -{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} - -Params: - - serviceName - String. Name of an existing service backend - - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.ingress.backend" -}} -{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} -{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} -serviceName: {{ .serviceName }} -servicePort: {{ .servicePort }} -{{- else -}} -service: - name: {{ .serviceName }} - port: - {{- if typeIs "string" .servicePort }} - name: {{ .servicePort }} - {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} - number: {{ .servicePort | int }} - {{- end }} -{{- end -}} -{{- end -}} - -{{/* -Print "true" if the API pathType field is supported -Usage: -{{ include "common.ingress.supportsPathType" . }} -*/}} -{{- define "common.ingress.supportsPathType" -}} -{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the ingressClassname field is supported -Usage: -{{ include "common.ingress.supportsIngressClassname" . }} -*/}} -{{- define "common.ingress.supportsIngressClassname" -}} -{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if cert-manager required annotations for TLS signed -certificates are set in the Ingress annotations -Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations -Usage: -{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} -*/}} -{{- define "common.ingress.certManagerRequest" -}} -{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") (hasKey .annotations "kubernetes.io/tls-acme") }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_labels.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_labels.tpl deleted file mode 100644 index d90a6cdc0..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_labels.tpl +++ /dev/null @@ -1,46 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} - -{{/* -Kubernetes standard labels -{{ include "common.labels.standard" (dict "customLabels" .Values.commonLabels "context" $) -}} -*/}} -{{- define "common.labels.standard" -}} -{{- if and (hasKey . "customLabels") (hasKey . "context") -}} -{{- $default := dict "app.kubernetes.io/name" (include "common.names.name" .context) "helm.sh/chart" (include "common.names.chart" .context) "app.kubernetes.io/instance" .context.Release.Name "app.kubernetes.io/managed-by" .context.Release.Service -}} -{{- with .context.Chart.AppVersion -}} -{{- $_ := set $default "app.kubernetes.io/version" . -}} -{{- end -}} -{{ template "common.tplvalues.merge" (dict "values" (list .customLabels $default) "context" .context) }} -{{- else -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -helm.sh/chart: {{ include "common.names.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- with .Chart.AppVersion }} -app.kubernetes.io/version: {{ . | quote }} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Labels used on immutable fields such as deploy.spec.selector.matchLabels or svc.spec.selector -{{ include "common.labels.matchLabels" (dict "customLabels" .Values.podLabels "context" $) -}} - -We don't want to loop over custom labels appending them to the selector -since it's very likely that it will break deployments, services, etc. -However, it's important to overwrite the standard labels if the user -overwrote them on metadata.labels fields. -*/}} -{{- define "common.labels.matchLabels" -}} -{{- if and (hasKey . "customLabels") (hasKey . "context") -}} -{{ merge (pick (include "common.tplvalues.render" (dict "value" .customLabels "context" .context) | fromYaml) "app.kubernetes.io/name" "app.kubernetes.io/instance") (dict "app.kubernetes.io/name" (include "common.names.name" .context) "app.kubernetes.io/instance" .context.Release.Name ) | toYaml }} -{{- else -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_names.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_names.tpl deleted file mode 100644 index a222924f1..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_names.tpl +++ /dev/null @@ -1,71 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "common.names.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "common.names.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "common.names.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a default fully qualified dependency name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -Usage: -{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} -*/}} -{{- define "common.names.dependency.fullname" -}} -{{- if .chartValues.fullnameOverride -}} -{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .chartName .chartValues.nameOverride -}} -{{- if contains $name .context.Release.Name -}} -{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Allow the release namespace to be overridden for multi-namespace deployments in combined charts. -*/}} -{{- define "common.names.namespace" -}} -{{- default .Release.Namespace .Values.namespaceOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a fully qualified app name adding the installation's namespace. -*/}} -{{- define "common.names.fullname.namespace" -}} -{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_secrets.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_secrets.tpl deleted file mode 100644 index 84dbe3803..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_secrets.tpl +++ /dev/null @@ -1,182 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Generate secret name. - -Usage: -{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/main/bitnami/common#existingsecret - - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.secrets.name" -}} -{{- $name := (include "common.names.fullname" .context) -}} - -{{- if .defaultNameSuffix -}} -{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{- with .existingSecret -}} -{{- if not (typeIs "string" .) -}} -{{- with .name -}} -{{- $name = . -}} -{{- end -}} -{{- else -}} -{{- $name = . -}} -{{- end -}} -{{- end -}} - -{{- printf "%s" $name -}} -{{- end -}} - -{{/* -Generate secret key. - -Usage: -{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/main/bitnami/common#existingsecret - - key - String - Required. Name of the key in the secret. -*/}} -{{- define "common.secrets.key" -}} -{{- $key := .key -}} - -{{- if .existingSecret -}} - {{- if not (typeIs "string" .existingSecret) -}} - {{- if .existingSecret.keyMapping -}} - {{- $key = index .existingSecret.keyMapping $.key -}} - {{- end -}} - {{- end }} -{{- end -}} - -{{- printf "%s" $key -}} -{{- end -}} - -{{/* -Generate secret password or retrieve one if already created. - -Usage: -{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - key - String - Required - Name of the key in the secret. - - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. - - length - int - Optional - Length of the generated random password. - - strong - Boolean - Optional - Whether to add symbols to the generated random password. - - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. - - context - Context - Required - Parent context. - - failOnNew - Boolean - Optional - Default to true. If set to false, skip errors adding new keys to existing secrets. - - skipB64enc - Boolean - Optional - Default to false. If set to true, no the secret will not be base64 encrypted. - - skipQuote - Boolean - Optional - Default to false. If set to true, no quotes will be added around the secret. -The order in which this function returns a secret password: - 1. Already existing 'Secret' resource - (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) - 2. Password provided via the values.yaml - (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) - 3. Randomly generated secret password - (A new random secret password with the length specified in the 'length' parameter will be generated and returned) - -*/}} -{{- define "common.secrets.passwords.manage" -}} - -{{- $password := "" }} -{{- $subchart := "" }} -{{- $chartName := default "" .chartName }} -{{- $passwordLength := default 10 .length }} -{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} -{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} -{{- $secretData := (lookup "v1" "Secret" (include "common.names.namespace" .context) .secret).data }} -{{- if $secretData }} - {{- if hasKey $secretData .key }} - {{- $password = index $secretData .key | b64dec }} - {{- else if not (eq .failOnNew false) }} - {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} - {{- else if $providedPasswordValue }} - {{- $password = $providedPasswordValue | toString }} - {{- end -}} -{{- else if $providedPasswordValue }} - {{- $password = $providedPasswordValue | toString }} -{{- else }} - - {{- if .context.Values.enabled }} - {{- $subchart = $chartName }} - {{- end -}} - - {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} - {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} - {{- $passwordValidationErrors := list $requiredPasswordError -}} - {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} - - {{- if .strong }} - {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} - {{- $password = randAscii $passwordLength }} - {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} - {{- $password = printf "%s%s" $subStr $password | toString | shuffle }} - {{- else }} - {{- $password = randAlphaNum $passwordLength }} - {{- end }} -{{- end -}} -{{- if not .skipB64enc }} -{{- $password = $password | b64enc }} -{{- end -}} -{{- if .skipQuote -}} -{{- printf "%s" $password -}} -{{- else -}} -{{- printf "%s" $password | quote -}} -{{- end -}} -{{- end -}} - -{{/* -Reuses the value from an existing secret, otherwise sets its value to a default value. - -Usage: -{{ include "common.secrets.lookup" (dict "secret" "secret-name" "key" "keyName" "defaultValue" .Values.myValue "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - key - String - Required - Name of the key in the secret. - - defaultValue - String - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. - - context - Context - Required - Parent context. - -*/}} -{{- define "common.secrets.lookup" -}} -{{- $value := "" -}} -{{- $secretData := (lookup "v1" "Secret" (include "common.names.namespace" .context) .secret).data -}} -{{- if and $secretData (hasKey $secretData .key) -}} - {{- $value = index $secretData .key -}} -{{- else if .defaultValue -}} - {{- $value = .defaultValue | toString | b64enc -}} -{{- end -}} -{{- if $value -}} -{{- printf "%s" $value -}} -{{- end -}} -{{- end -}} - -{{/* -Returns whether a previous generated secret already exists - -Usage: -{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - context - Context - Required - Parent context. -*/}} -{{- define "common.secrets.exists" -}} -{{- $secret := (lookup "v1" "Secret" (include "common.names.namespace" .context) .secret) }} -{{- if $secret }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_storage.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_storage.tpl deleted file mode 100644 index 16405a0f8..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_storage.tpl +++ /dev/null @@ -1,28 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper Storage Class -{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} -*/}} -{{- define "common.storage.class" -}} - -{{- $storageClass := .persistence.storageClass -}} -{{- if .global -}} - {{- if .global.storageClass -}} - {{- $storageClass = .global.storageClass -}} - {{- end -}} -{{- end -}} - -{{- if $storageClass -}} - {{- if (eq "-" $storageClass) -}} - {{- printf "storageClassName: \"\"" -}} - {{- else }} - {{- printf "storageClassName: %s" $storageClass -}} - {{- end -}} -{{- end -}} - -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_tplvalues.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_tplvalues.tpl deleted file mode 100644 index a8ed7637e..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_tplvalues.tpl +++ /dev/null @@ -1,38 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Renders a value that contains template perhaps with scope if the scope is present. -Usage: -{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $ ) }} -{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $ "scope" $app ) }} -*/}} -{{- define "common.tplvalues.render" -}} -{{- $value := typeIs "string" .value | ternary .value (.value | toYaml) }} -{{- if contains "{{" (toJson .value) }} - {{- if .scope }} - {{- tpl (cat "{{- with $.RelativeScope -}}" $value "{{- end }}") (merge (dict "RelativeScope" .scope) .context) }} - {{- else }} - {{- tpl $value .context }} - {{- end }} -{{- else }} - {{- $value }} -{{- end }} -{{- end -}} - -{{/* -Merge a list of values that contains template after rendering them. -Merge precedence is consistent with http://masterminds.github.io/sprig/dicts.html#merge-mustmerge -Usage: -{{ include "common.tplvalues.merge" ( dict "values" (list .Values.path.to.the.Value1 .Values.path.to.the.Value2) "context" $ ) }} -*/}} -{{- define "common.tplvalues.merge" -}} -{{- $dst := dict -}} -{{- range .values -}} -{{- $dst = include "common.tplvalues.render" (dict "value" . "context" $.context "scope" $.scope) | fromYaml | merge $dst -}} -{{- end -}} -{{ $dst | toYaml }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_utils.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_utils.tpl deleted file mode 100644 index bfbddf054..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_utils.tpl +++ /dev/null @@ -1,77 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Print instructions to get a secret value. -Usage: -{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} -*/}} -{{- define "common.utils.secret.getvalue" -}} -{{- $varname := include "common.utils.fieldToEnvVar" . -}} -export {{ $varname }}=$(kubectl get secret --namespace {{ include "common.names.namespace" .context | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) -{{- end -}} - -{{/* -Build env var name given a field -Usage: -{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} -*/}} -{{- define "common.utils.fieldToEnvVar" -}} - {{- $fieldNameSplit := splitList "-" .field -}} - {{- $upperCaseFieldNameSplit := list -}} - - {{- range $fieldNameSplit -}} - {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} - {{- end -}} - - {{ join "_" $upperCaseFieldNameSplit }} -{{- end -}} - -{{/* -Gets a value from .Values given -Usage: -{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} -*/}} -{{- define "common.utils.getValueFromKey" -}} -{{- $splitKey := splitList "." .key -}} -{{- $value := "" -}} -{{- $latestObj := $.context.Values -}} -{{- range $splitKey -}} - {{- if not $latestObj -}} - {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} - {{- end -}} - {{- $value = ( index $latestObj . ) -}} - {{- $latestObj = $value -}} -{{- end -}} -{{- printf "%v" (default "" $value) -}} -{{- end -}} - -{{/* -Returns first .Values key with a defined value or first of the list if all non-defined -Usage: -{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} -*/}} -{{- define "common.utils.getKeyFromList" -}} -{{- $key := first .keys -}} -{{- $reverseKeys := reverse .keys }} -{{- range $reverseKeys }} - {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} - {{- if $value -}} - {{- $key = . }} - {{- end -}} -{{- end -}} -{{- printf "%s" $key -}} -{{- end -}} - -{{/* -Checksum a template at "path" containing a *single* resource (ConfigMap,Secret) for use in pod annotations, excluding the metadata (see #18376). -Usage: -{{ include "common.utils.checksumTemplate" (dict "path" "/configmap.yaml" "context" $) }} -*/}} -{{- define "common.utils.checksumTemplate" -}} -{{- $obj := include (print .context.Template.BasePath .path) .context | fromYaml -}} -{{ omit $obj "apiVersion" "kind" "metadata" | toYaml | sha256sum }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_warnings.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_warnings.tpl deleted file mode 100644 index 66dffc1fe..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/_warnings.tpl +++ /dev/null @@ -1,19 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Warning about using rolling tag. -Usage: -{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} -*/}} -{{- define "common.warnings.rollingTag" -}} - -{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} -WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. -+info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ -{{- end }} - -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_cassandra.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_cassandra.tpl deleted file mode 100644 index eda9aada5..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_cassandra.tpl +++ /dev/null @@ -1,77 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Cassandra required passwords are not empty. - -Usage: -{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.cassandra.passwords" -}} - {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} - {{- $enabled := include "common.cassandra.values.enabled" . -}} - {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} - {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.dbUser.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled cassandra. - -Usage: -{{ include "common.cassandra.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.cassandra.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.cassandra.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key dbUser - -Usage: -{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.key.dbUser" -}} - {{- if .subchart -}} - cassandra.dbUser - {{- else -}} - dbUser - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mariadb.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mariadb.tpl deleted file mode 100644 index 17d83a2fd..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mariadb.tpl +++ /dev/null @@ -1,108 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MariaDB required passwords are not empty. - -Usage: -{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mariadb.passwords" -}} - {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mariadb.values.enabled" . -}} - {{- $architecture := include "common.mariadb.values.architecture" . -}} - {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mariadb. - -Usage: -{{ include "common.mariadb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mariadb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mariadb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.key.auth" -}} - {{- if .subchart -}} - mariadb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mongodb.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mongodb.tpl deleted file mode 100644 index bbb445b86..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mongodb.tpl +++ /dev/null @@ -1,113 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MongoDB® required passwords are not empty. - -Usage: -{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mongodb.passwords" -}} - {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mongodb.values.enabled" . -}} - {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} - {{- $architecture := include "common.mongodb.values.architecture" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} - {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} - - {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} - {{- if and $valueUsername $valueDatabase -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replicaset") -}} - {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mongodb. - -Usage: -{{ include "common.mongodb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mongodb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mongodb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.key.auth" -}} - {{- if .subchart -}} - mongodb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mysql.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mysql.tpl deleted file mode 100644 index ca3953f86..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_mysql.tpl +++ /dev/null @@ -1,108 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MySQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mysql.passwords" -}} - {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mysql.values.enabled" . -}} - {{- $architecture := include "common.mysql.values.architecture" . -}} - {{- $authPrefix := include "common.mysql.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mysql. - -Usage: -{{ include "common.mysql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mysql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mysql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.key.auth" -}} - {{- if .subchart -}} - mysql.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_postgresql.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_postgresql.tpl deleted file mode 100644 index 8c9aa570e..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_postgresql.tpl +++ /dev/null @@ -1,134 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate PostgreSQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.postgresql.passwords" -}} - {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} - {{- $enabled := include "common.postgresql.values.enabled" . -}} - {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} - {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} - - {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} - {{- if (eq $enabledReplication "true") -}} - {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to decide whether evaluate global values. - -Usage: -{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} -Params: - - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" -*/}} -{{- define "common.postgresql.values.use.global" -}} - {{- if .context.Values.global -}} - {{- if .context.Values.global.postgresql -}} - {{- index .context.Values.global.postgresql .key | quote -}} - {{- end -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.existingSecret" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} - - {{- if .subchart -}} - {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} - {{- else -}} - {{- default (.context.Values.existingSecret | quote) $globalValue -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled postgresql. - -Usage: -{{ include "common.postgresql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key postgressPassword. - -Usage: -{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.postgressPassword" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} - - {{- if not $globalValue -}} - {{- if .subchart -}} - postgresql.postgresqlPassword - {{- else -}} - postgresqlPassword - {{- end -}} - {{- else -}} - global.postgresql.postgresqlPassword - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled.replication. - -Usage: -{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.enabled.replication" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.replication.enabled -}} - {{- else -}} - {{- printf "%v" .context.Values.replication.enabled -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key replication.password. - -Usage: -{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.replicationPassword" -}} - {{- if .subchart -}} - postgresql.replication.password - {{- else -}} - replication.password - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_redis.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_redis.tpl deleted file mode 100644 index fc0d208dd..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_redis.tpl +++ /dev/null @@ -1,81 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Redis® required passwords are not empty. - -Usage: -{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.redis.passwords" -}} - {{- $enabled := include "common.redis.values.enabled" . -}} - {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} - {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} - - {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} - {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} - - {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} - {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} - {{- if eq $useAuth "true" -}} - {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled redis. - -Usage: -{{ include "common.redis.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.redis.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.redis.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right prefix path for the values - -Usage: -{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.redis.values.keys.prefix" -}} - {{- if .subchart -}}redis.{{- else -}}{{- end -}} -{{- end -}} - -{{/* -Checks whether the redis chart's includes the standarizations (version >= 14) - -Usage: -{{ include "common.redis.values.standarized.version" (dict "context" $) }} -*/}} -{{- define "common.redis.values.standarized.version" -}} - - {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} - {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} - - {{- if $standarizedAuthValues -}} - {{- true -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_validations.tpl b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_validations.tpl deleted file mode 100644 index 31ceda871..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/templates/validations/_validations.tpl +++ /dev/null @@ -1,51 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate values must not be empty. - -Usage: -{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} -{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" -*/}} -{{- define "common.validations.values.multiple.empty" -}} - {{- range .required -}} - {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} - {{- end -}} -{{- end -}} - -{{/* -Validate a value must not be empty. - -Usage: -{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" - - subchart - String - Optional - Name of the subchart that the validated password is part of. -*/}} -{{- define "common.validations.values.single.empty" -}} - {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} - {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} - - {{- if not $value -}} - {{- $varname := "my-value" -}} - {{- $getCurrentValue := "" -}} - {{- if and .secret .field -}} - {{- $varname = include "common.utils.fieldToEnvVar" . -}} - {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} - {{- end -}} - {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/values.yaml b/thunder_deployment/infra/beta9/charts/postgresql/charts/common/values.yaml deleted file mode 100644 index 9abe0e154..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/charts/common/values.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright VMware, Inc. -# SPDX-License-Identifier: APACHE-2.0 - -## bitnami/common -## It is required by CI/CD tools and processes. -## @skip exampleValue -## -exampleValue: common-chart diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/NOTES.txt b/thunder_deployment/infra/beta9/charts/postgresql/templates/NOTES.txt deleted file mode 100644 index 73c4a34e5..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/NOTES.txt +++ /dev/null @@ -1,115 +0,0 @@ -CHART NAME: {{ .Chart.Name }} -CHART VERSION: {{ .Chart.Version }} -APP VERSION: {{ .Chart.AppVersion }} - -** Please be patient while the chart is being deployed ** - -{{- if .Values.diagnosticMode.enabled }} -The chart has been deployed in diagnostic mode. All probes have been disabled and the command has been overwritten with: - - command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 4 }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 4 }} - -Get the list of pods by executing: - - kubectl get pods --namespace {{ .Release.Namespace }} -l app.kubernetes.io/instance={{ .Release.Name }} - -Access the pod you want to debug by executing - - kubectl exec --namespace {{ .Release.Namespace }} -ti -- /opt/bitnami/scripts/postgresql/entrypoint.sh /bin/bash - -In order to replicate the container startup scripts execute this command: - - /opt/bitnami/scripts/postgresql/entrypoint.sh /opt/bitnami/scripts/postgresql/run.sh - -{{- else }} - -{{- $customUser := include "postgresql.v1.username" . }} -{{- $postgresPassword := include "common.secrets.lookup" (dict "secret" (include "common.names.fullname" .) "key" .Values.auth.secretKeys.adminPasswordKey "defaultValue" (ternary .Values.auth.postgresPassword .Values.auth.password (eq $customUser "postgres")) "context" $) -}} -{{- $authEnabled := and (not (or .Values.global.postgresql.auth.existingSecret .Values.auth.existingSecret)) (or $postgresPassword .Values.auth.enablePostgresUser (and (not (empty $customUser)) (ne $customUser "postgres"))) }} -{{- if not $authEnabled }} - -WARNING: PostgreSQL has been configured without authentication, this is not recommended for production environments. -{{- end }} - -PostgreSQL can be accessed via port {{ include "postgresql.v1.service.port" . }} on the following DNS names from within your cluster: - - {{ include "postgresql.v1.primary.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local - Read/Write connection - -{{- if eq .Values.architecture "replication" }} - - {{ include "postgresql.v1.readReplica.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local - Read only connection - -{{- end }} - -{{- if and (not (empty $customUser)) (ne $customUser "postgres") }} -{{- if .Values.auth.enablePostgresUser }} - -To get the password for "postgres" run: - - export POSTGRES_ADMIN_PASSWORD=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ include "postgresql.v1.secretName" . }} -o jsonpath="{.data.{{include "postgresql.v1.adminPasswordKey" .}}}" | base64 -d) -{{- end }} - -To get the password for "{{ $customUser }}" run: - - export POSTGRES_PASSWORD=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ include "postgresql.v1.secretName" . }} -o jsonpath="{.data.{{include "postgresql.v1.userPasswordKey" .}}}" | base64 -d) -{{- else }} -{{- if .Values.auth.enablePostgresUser }} - -To get the password for "{{ default "postgres" $customUser }}" run: - - export POSTGRES_PASSWORD=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ include "postgresql.v1.secretName" . }} -o jsonpath="{.data.{{ ternary "password" (include "postgresql.v1.adminPasswordKey" .) (and (not (empty $customUser)) (ne $customUser "postgres")) }}}" | base64 -d) -{{- end }} -{{- end }} - -To connect to your database run the following command: - {{- if $authEnabled }} - - kubectl run {{ include "common.names.fullname" . }}-client --rm --tty -i --restart='Never' --namespace {{ .Release.Namespace }} --image {{ include "postgresql.v1.image" . }} --env="PGPASSWORD=$POSTGRES_PASSWORD" \ - --command -- psql --host {{ include "postgresql.v1.primary.fullname" . }} -U {{ default "postgres" $customUser }} -d {{- if include "postgresql.v1.database" . }} {{ include "postgresql.v1.database" . }}{{- else }} postgres{{- end }} -p {{ include "postgresql.v1.service.port" . }} - {{- else }} - - kubectl run {{ include "common.names.fullname" . }}-client --rm --tty -i --restart='Never' --namespace {{ .Release.Namespace }} --image {{ include "postgresql.v1.image" . }} \ - --command -- psql --host {{ include "postgresql.v1.primary.fullname" . }} -d {{- if include "postgresql.v1.database" . }} {{ include "postgresql.v1.database" . }}{{- else }} postgres{{- end }} -p {{ include "postgresql.v1.service.port" . }} - {{- end }} - - > NOTE: If you access the container using bash, make sure that you execute "/opt/bitnami/scripts/postgresql/entrypoint.sh /bin/bash" in order to avoid the error "psql: local user with ID {{ .Values.primary.containerSecurityContext.runAsUser }}} does not exist" - -To connect to your database from outside the cluster execute the following commands: - -{{- if contains "NodePort" .Values.primary.service.type }} - - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "postgresql.v1.primary.fullname" . }}) - {{- if $authEnabled }} - PGPASSWORD="$POSTGRES_PASSWORD" psql --host $NODE_IP --port $NODE_PORT -U {{ default "postgres" $customUser }} -d {{- if include "postgresql.v1.database" . }} {{ include "postgresql.v1.database" . }}{{- else }} postgres{{- end }} - {{- else }} - psql --host $NODE_IP --port $NODE_PORT -d {{- if include "postgresql.v1.database" . }} {{ include "postgresql.v1.database" . }}{{- else }} postgres{{- end }} - {{- end }} -{{- else if contains "LoadBalancer" .Values.primary.service.type }} - - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - Watch the status with: 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ include "postgresql.v1.primary.fullname" . }}' - - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "postgresql.v1.primary.fullname" . }} --template "{{ "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}" }}") - {{- if $authEnabled }} - PGPASSWORD="$POSTGRES_PASSWORD" psql --host $SERVICE_IP --port {{ include "postgresql.v1.service.port" . }} -U {{ default "postgres" $customUser }} -d {{- if include "postgresql.v1.database" . }} {{ include "postgresql.v1.database" . }}{{- else }} postgres{{- end }} - {{- else }} - psql --host $SERVICE_IP --port {{ include "postgresql.v1.service.port" . }} -d {{- if include "postgresql.v1.database" . }} {{ include "postgresql.v1.database" . }}{{- else }} postgres{{- end }} - {{- end }} -{{- else if contains "ClusterIP" .Values.primary.service.type }} - - kubectl port-forward --namespace {{ .Release.Namespace }} svc/{{ include "postgresql.v1.primary.fullname" . }} {{ include "postgresql.v1.service.port" . }}:{{ include "postgresql.v1.service.port" . }} & - {{- if $authEnabled }} - PGPASSWORD="$POSTGRES_PASSWORD" psql --host 127.0.0.1 -U {{ default "postgres" $customUser }} -d {{- if include "postgresql.v1.database" . }} {{ include "postgresql.v1.database" . }}{{- else }} postgres{{- end }} -p {{ include "postgresql.v1.service.port" . }} - {{- else }} - psql --host 127.0.0.1 -d {{- if include "postgresql.v1.database" . }} {{ include "postgresql.v1.database" . }}{{- else }} postgres{{- end }} -p {{ include "postgresql.v1.service.port" . }} - {{- end }} -{{- end }} -{{- end }} - -WARNING: The configured password will be ignored on new installation in case when previous PostgreSQL release was deleted through the helm command. In that case, old PVC will have an old password, and setting it through helm won't take effect. Deleting persistent volumes (PVs) will solve the issue. - -{{- include "postgresql.v1.validateValues" . -}} -{{- include "common.warnings.rollingTag" .Values.image -}} -{{- include "common.warnings.rollingTag" .Values.volumePermissions.image }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/_helpers.tpl b/thunder_deployment/infra/beta9/charts/postgresql/templates/_helpers.tpl deleted file mode 100644 index 0ab9fd037..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/_helpers.tpl +++ /dev/null @@ -1,406 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} - -{{/* -Create a default fully qualified app name for PostgreSQL Primary objects -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "postgresql.v1.primary.fullname" -}} -{{- if eq .Values.architecture "replication" -}} - {{- printf "%s-%s" (include "common.names.fullname" .) .Values.primary.name | trunc 63 | trimSuffix "-" -}} -{{- else -}} - {{- include "common.names.fullname" . -}} -{{- end -}} -{{- end -}} - -{{/* -Create a default fully qualified app name for PostgreSQL read-only replicas objects -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "postgresql.v1.readReplica.fullname" -}} -{{- printf "%s-%s" (include "common.names.fullname" .) .Values.readReplicas.name | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create the default FQDN for PostgreSQL primary headless service -We truncate at 63 chars because of the DNS naming spec. -*/}} -{{- define "postgresql.v1.primary.svc.headless" -}} -{{- printf "%s-hl" (include "postgresql.v1.primary.fullname" .) | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create the default FQDN for PostgreSQL read-only replicas headless service -We truncate at 63 chars because of the DNS naming spec. -*/}} -{{- define "postgresql.v1.readReplica.svc.headless" -}} -{{- printf "%s-hl" (include "postgresql.v1.readReplica.fullname" .) | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Return the proper PostgreSQL image name -*/}} -{{- define "postgresql.v1.image" -}} -{{ include "common.images.image" (dict "imageRoot" .Values.image "global" .Values.global) }} -{{- end -}} - -{{/* -Return the proper PostgreSQL metrics image name -*/}} -{{- define "postgresql.v1.metrics.image" -}} -{{ include "common.images.image" (dict "imageRoot" .Values.metrics.image "global" .Values.global) }} -{{- end -}} - -{{/* -Return the proper image name (for the init container volume-permissions image) -*/}} -{{- define "postgresql.v1.volumePermissions.image" -}} -{{ include "common.images.image" (dict "imageRoot" .Values.volumePermissions.image "global" .Values.global) }} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names -*/}} -{{- define "postgresql.v1.imagePullSecrets" -}} -{{ include "common.images.renderPullSecrets" (dict "images" (list .Values.image .Values.metrics.image .Values.volumePermissions.image) "context" $) }} -{{- end -}} - -{{/* -Return the name for a custom user to create -*/}} -{{- define "postgresql.v1.username" -}} -{{- if .Values.global.postgresql.auth.username -}} - {{- .Values.global.postgresql.auth.username -}} -{{- else -}} - {{- .Values.auth.username -}} -{{- end -}} -{{- end -}} - -{{/* -Return the name for a custom database to create -*/}} -{{- define "postgresql.v1.database" -}} -{{- if .Values.global.postgresql.auth.database -}} - {{- printf "%s" (tpl .Values.global.postgresql.auth.database $) -}} -{{- else if .Values.auth.database -}} - {{- printf "%s" (tpl .Values.auth.database $) -}} -{{- end -}} -{{- end -}} - -{{/* -Get the password secret. -*/}} -{{- define "postgresql.v1.secretName" -}} -{{- if .Values.global.postgresql.auth.existingSecret -}} - {{- printf "%s" (tpl .Values.global.postgresql.auth.existingSecret $) -}} -{{- else if .Values.auth.existingSecret -}} - {{- printf "%s" (tpl .Values.auth.existingSecret $) -}} -{{- else -}} - {{- printf "%s" (include "common.names.fullname" .) -}} -{{- end -}} -{{- end -}} - -{{/* -Get the replication-password key. -*/}} -{{- define "postgresql.v1.replicationPasswordKey" -}} -{{- if or .Values.global.postgresql.auth.existingSecret .Values.auth.existingSecret -}} - {{- if .Values.global.postgresql.auth.secretKeys.replicationPasswordKey -}} - {{- printf "%s" (tpl .Values.global.postgresql.auth.secretKeys.replicationPasswordKey $) -}} - {{- else if .Values.auth.secretKeys.replicationPasswordKey -}} - {{- printf "%s" (tpl .Values.auth.secretKeys.replicationPasswordKey $) -}} - {{- else -}} - {{- "replication-password" -}} - {{- end -}} -{{- else -}} - {{- "replication-password" -}} -{{- end -}} -{{- end -}} - -{{/* -Get the admin-password key. -*/}} -{{- define "postgresql.v1.adminPasswordKey" -}} -{{- if or .Values.global.postgresql.auth.existingSecret .Values.auth.existingSecret -}} - {{- if .Values.global.postgresql.auth.secretKeys.adminPasswordKey -}} - {{- printf "%s" (tpl .Values.global.postgresql.auth.secretKeys.adminPasswordKey $) -}} - {{- else if .Values.auth.secretKeys.adminPasswordKey -}} - {{- printf "%s" (tpl .Values.auth.secretKeys.adminPasswordKey $) -}} - {{- end -}} -{{- else -}} - {{- "postgres-password" -}} -{{- end -}} -{{- end -}} - -{{/* -Get the user-password key. -*/}} -{{- define "postgresql.v1.userPasswordKey" -}} -{{- if or .Values.global.postgresql.auth.existingSecret .Values.auth.existingSecret -}} - {{- if or (empty (include "postgresql.v1.username" .)) (eq (include "postgresql.v1.username" .) "postgres") -}} - {{- printf "%s" (include "postgresql.v1.adminPasswordKey" .) -}} - {{- else -}} - {{- if .Values.global.postgresql.auth.secretKeys.userPasswordKey -}} - {{- printf "%s" (tpl .Values.global.postgresql.auth.secretKeys.userPasswordKey $) -}} - {{- else if .Values.auth.secretKeys.userPasswordKey -}} - {{- printf "%s" (tpl .Values.auth.secretKeys.userPasswordKey $) -}} - {{- end -}} - {{- end -}} -{{- else -}} - {{- "password" -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if a secret object should be created -*/}} -{{- define "postgresql.v1.createSecret" -}} -{{- $customUser := include "postgresql.v1.username" . -}} -{{- $postgresPassword := include "common.secrets.lookup" (dict "secret" (include "common.names.fullname" .) "key" .Values.auth.secretKeys.adminPasswordKey "defaultValue" (ternary (coalesce .Values.global.postgresql.auth.postgresPassword .Values.auth.postgresPassword .Values.global.postgresql.auth.password .Values.auth.password) (coalesce .Values.global.postgresql.auth.postgresPassword .Values.auth.postgresPassword) (or (empty $customUser) (eq $customUser "postgres"))) "context" $) -}} -{{- if and (not (or .Values.global.postgresql.auth.existingSecret .Values.auth.existingSecret)) (or $postgresPassword .Values.auth.enablePostgresUser (and (not (empty $customUser)) (ne $customUser "postgres")) (eq .Values.architecture "replication") (and .Values.ldap.enabled (or .Values.ldap.bind_password .Values.ldap.bindpw))) -}} - {{- true -}} -{{- end -}} -{{- end -}} - -{{/* -Return PostgreSQL service port -*/}} -{{- define "postgresql.v1.service.port" -}} -{{- if .Values.global.postgresql.service.ports.postgresql -}} - {{- .Values.global.postgresql.service.ports.postgresql -}} -{{- else -}} - {{- .Values.primary.service.ports.postgresql -}} -{{- end -}} -{{- end -}} - -{{/* -Return PostgreSQL service port -*/}} -{{- define "postgresql.v1.readReplica.service.port" -}} -{{- if .Values.global.postgresql.service.ports.postgresql -}} - {{- .Values.global.postgresql.service.ports.postgresql -}} -{{- else -}} - {{- .Values.readReplicas.service.ports.postgresql -}} -{{- end -}} -{{- end -}} - -{{/* -Get the PostgreSQL primary configuration ConfigMap name. -*/}} -{{- define "postgresql.v1.primary.configmapName" -}} -{{- if .Values.primary.existingConfigmap -}} - {{- printf "%s" (tpl .Values.primary.existingConfigmap $) -}} -{{- else -}} - {{- printf "%s-configuration" (include "postgresql.v1.primary.fullname" .) -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if a configmap object should be created for PostgreSQL primary with the configuration -*/}} -{{- define "postgresql.v1.primary.createConfigmap" -}} -{{- if and (or .Values.primary.configuration .Values.primary.pgHbaConfiguration) (not .Values.primary.existingConfigmap) -}} - {{- true -}} -{{- else -}} -{{- end -}} -{{- end -}} - -{{/* -Get the PostgreSQL primary extended configuration ConfigMap name. -*/}} -{{- define "postgresql.v1.primary.extendedConfigmapName" -}} -{{- if .Values.primary.existingExtendedConfigmap -}} - {{- printf "%s" (tpl .Values.primary.existingExtendedConfigmap $) -}} -{{- else -}} - {{- printf "%s-extended-configuration" (include "postgresql.v1.primary.fullname" .) -}} -{{- end -}} -{{- end -}} - -{{/* -Get the PostgreSQL read replica extended configuration ConfigMap name. -*/}} -{{- define "postgresql.v1.readReplicas.extendedConfigmapName" -}} - {{- printf "%s-extended-configuration" (include "postgresql.v1.readReplica.fullname" .) -}} -{{- end -}} - -{{/* -Return true if a configmap object should be created for PostgreSQL primary with the extended configuration -*/}} -{{- define "postgresql.v1.primary.createExtendedConfigmap" -}} -{{- if and .Values.primary.extendedConfiguration (not .Values.primary.existingExtendedConfigmap) -}} - {{- true -}} -{{- else -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if a configmap object should be created for PostgreSQL read replica with the extended configuration -*/}} -{{- define "postgresql.v1.readReplicas.createExtendedConfigmap" -}} -{{- if .Values.readReplicas.extendedConfiguration -}} - {{- true -}} -{{- else -}} -{{- end -}} -{{- end -}} - -{{/* - Create the name of the service account to use - */}} -{{- define "postgresql.v1.serviceAccountName" -}} -{{- if .Values.serviceAccount.create -}} - {{ default (include "common.names.fullname" .) .Values.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* -Return true if a configmap should be mounted with PostgreSQL configuration -*/}} -{{- define "postgresql.v1.mountConfigurationCM" -}} -{{- if or .Values.primary.configuration .Values.primary.pgHbaConfiguration .Values.primary.existingConfigmap -}} - {{- true -}} -{{- end -}} -{{- end -}} - -{{/* -Get the initialization scripts ConfigMap name. -*/}} -{{- define "postgresql.v1.initdb.scriptsCM" -}} -{{- if .Values.primary.initdb.scriptsConfigMap -}} - {{- printf "%s" (tpl .Values.primary.initdb.scriptsConfigMap $) -}} -{{- else -}} - {{- printf "%s-init-scripts" (include "postgresql.v1.primary.fullname" .) -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if TLS is enabled for LDAP connection -*/}} -{{- define "postgresql.v1.ldap.tls.enabled" -}} -{{- if and (kindIs "string" .Values.ldap.tls) (not (empty .Values.ldap.tls)) -}} - {{- true -}} -{{- else if and (kindIs "map" .Values.ldap.tls) .Values.ldap.tls.enabled -}} - {{- true -}} -{{- end -}} -{{- end -}} - -{{/* -Get the readiness probe command -*/}} -{{- define "postgresql.v1.readinessProbeCommand" -}} -{{- $customUser := include "postgresql.v1.username" . -}} -- | -{{- if (include "postgresql.v1.database" .) }} - exec pg_isready -U {{ default "postgres" $customUser | quote }} -d "dbname={{ include "postgresql.v1.database" . }} {{- if .Values.tls.enabled }} sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}{{- end }}" -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} -{{- else }} - exec pg_isready -U {{ default "postgres" $customUser | quote }} {{- if .Values.tls.enabled }} -d "sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}"{{- end }} -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} -{{- end }} -{{- if contains "bitnami/" .Values.image.repository }} - [ -f /opt/bitnami/postgresql/tmp/.initialized ] || [ -f /bitnami/postgresql/.initialized ] -{{- end }} -{{- end -}} - -{{/* -Compile all warnings into a single message, and call fail. -*/}} -{{- define "postgresql.v1.validateValues" -}} -{{- $messages := list -}} -{{- $messages := append $messages (include "postgresql.v1.validateValues.ldapConfigurationMethod" .) -}} -{{- $messages := append $messages (include "postgresql.v1.validateValues.psp" .) -}} -{{- $messages := without $messages "" -}} -{{- $message := join "\n" $messages -}} - -{{- if $message -}} -{{- printf "\nVALUES VALIDATION:\n%s" $message | fail -}} -{{- end -}} -{{- end -}} - -{{/* -Validate values of Postgresql - If ldap.url is used then you don't need the other settings for ldap -*/}} -{{- define "postgresql.v1.validateValues.ldapConfigurationMethod" -}} -{{- if and .Values.ldap.enabled (and (not (empty .Values.ldap.url)) (not (empty .Values.ldap.server))) -}} -postgresql: ldap.url, ldap.server - You cannot set both `ldap.url` and `ldap.server` at the same time. - Please provide a unique way to configure LDAP. - More info at https://www.postgresql.org/docs/current/auth-ldap.html -{{- end -}} -{{- end -}} - -{{/* -Validate values of Postgresql - If PSP is enabled RBAC should be enabled too -*/}} -{{- define "postgresql.v1.validateValues.psp" -}} -{{- if and .Values.psp.create (not .Values.rbac.create) -}} -postgresql: psp.create, rbac.create - RBAC should be enabled if PSP is enabled in order for PSP to work. - More info at https://kubernetes.io/docs/concepts/policy/pod-security-policy/#authorizing-policies -{{- end -}} -{{- end -}} - -{{/* -Return the path to the cert file. -*/}} -{{- define "postgresql.v1.tlsCert" -}} -{{- if .Values.tls.autoGenerated -}} - {{- printf "/opt/bitnami/postgresql/certs/tls.crt" -}} -{{- else -}} - {{- required "Certificate filename is required when TLS in enabled" .Values.tls.certFilename | printf "/opt/bitnami/postgresql/certs/%s" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the path to the cert key file. -*/}} -{{- define "postgresql.v1.tlsCertKey" -}} -{{- if .Values.tls.autoGenerated -}} - {{- printf "/opt/bitnami/postgresql/certs/tls.key" -}} -{{- else -}} -{{- required "Certificate Key filename is required when TLS in enabled" .Values.tls.certKeyFilename | printf "/opt/bitnami/postgresql/certs/%s" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the path to the CA cert file. -*/}} -{{- define "postgresql.v1.tlsCACert" -}} -{{- if .Values.tls.autoGenerated -}} - {{- printf "/opt/bitnami/postgresql/certs/ca.crt" -}} -{{- else -}} - {{- printf "/opt/bitnami/postgresql/certs/%s" .Values.tls.certCAFilename -}} -{{- end -}} -{{- end -}} - -{{/* -Return the path to the CRL file. -*/}} -{{- define "postgresql.v1.tlsCRL" -}} -{{- if .Values.tls.crlFilename -}} -{{- printf "/opt/bitnami/postgresql/certs/%s" .Values.tls.crlFilename -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if a TLS credentials secret object should be created -*/}} -{{- define "postgresql.v1.createTlsSecret" -}} -{{- if and .Values.tls.autoGenerated (not .Values.tls.certificatesSecret) -}} - {{- true -}} -{{- end -}} -{{- end -}} - -{{/* -Return the path to the CA cert file. -*/}} -{{- define "postgresql.v1.tlsSecretName" -}} -{{- if .Values.tls.autoGenerated -}} - {{- printf "%s-crt" (include "common.names.fullname" .) -}} -{{- else -}} - {{ required "A secret containing TLS certificates is required when TLS is enabled" .Values.tls.certificatesSecret }} -{{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/backup/cronjob.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/backup/cronjob.yaml deleted file mode 100644 index cdf87f743..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/backup/cronjob.yaml +++ /dev/null @@ -1,114 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if .Values.backup.enabled }} -{{- $customUser := include "postgresql.v1.username" . }} -apiVersion: batch/v1 -kind: CronJob -metadata: - name: {{ include "postgresql.v1.primary.fullname" . }}-pgdumpall - namespace: {{ .Release.Namespace | quote }} - {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.backup.cronjob.labels .Values.commonLabels ) "context" . ) }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: pg_dumpall - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.backup.cronjob.annotations .Values.commonAnnotations ) "context" . ) }} - {{- if $annotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} -spec: - schedule: {{ quote .Values.backup.cronjob.schedule }} - {{- if .Values.backup.cronjob.timezone }} - timeZone: {{ .Values.backup.cronjob.timezone | quote }} - {{- end }} - concurrencyPolicy: {{ .Values.backup.cronjob.concurrencyPolicy }} - failedJobsHistoryLimit: {{ .Values.backup.cronjob.failedJobsHistoryLimit }} - successfulJobsHistoryLimit: {{ .Values.backup.cronjob.successfulJobsHistoryLimit }} - {{- if .Values.backup.cronjob.startingDeadlineSeconds }} - startingDeadlineSeconds: {{ .Values.backup.cronjob.startingDeadlineSeconds }} - {{- end }} - jobTemplate: - spec: - {{- if .Values.backup.cronjob.ttlSecondsAfterFinished }} - ttlSecondsAfterFinished: {{ .Values.backup.cronjob.ttlSecondsAfterFinished }} - {{- end }} - template: - metadata: - labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 12 }} - app.kubernetes.io/component: pg_dumpall - {{- if $annotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 12 }} - {{- end }} - spec: - {{- include "postgresql.v1.imagePullSecrets" . | nindent 10 }} - {{- if .Values.backup.cronjob.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.backup.cronjob.nodeSelector "context" $) | nindent 12 }} - {{- end }} - containers: - - name: {{ include "postgresql.v1.primary.fullname" . }}-pgdumpall - image: {{ include "postgresql.v1.image" . }} - imagePullPolicy: {{ .Values.image.pullPolicy | quote }} - env: - - name: PGUSER - {{- if .Values.auth.enablePostgresUser }} - value: postgres - {{- else }} - value: {{ $customUser | quote }} - {{- end }} - {{- if .Values.auth.usePasswordFiles }} - - name: PGPASSFILE - value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.adminPasswordKey" .) }} - {{- else }} - - name: PGPASSWORD - valueFrom: - secretKeyRef: - name: {{ include "postgresql.v1.secretName" . }} - key: {{ include "postgresql.v1.adminPasswordKey" . }} - {{- end }} - - name: PGHOST - value: {{ include "postgresql.v1.primary.fullname" . }} - - name: PGPORT - value: {{ include "postgresql.v1.service.port" . | quote }} - - name: PGDUMP_DIR - value: {{ .Values.backup.cronjob.storage.mountPath }} - {{- if .Values.tls.enabled }} - - name: PGSSLROOTCERT - {{- if .Values.tls.autoGenerated }} - value: /tmp/certs/ca.crt - {{- else }} - value: {{- printf "/tmp/certs/%s" .Values.tls.certCAFilename -}} - {{- end }} - {{- end }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.backup.cronjob.command "context" $) | nindent 14 }} - volumeMounts: - {{- if .Values.tls.enabled }} - - name: certs - mountPath: /certs - {{- end }} - - name: datadir - mountPath: {{ .Values.backup.cronjob.storage.mountPath }} - subPath: {{ .Values.backup.cronjob.storage.subPath }} - {{- if .Values.backup.cronjob.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.backup.cronjob.containerSecurityContext "enabled" | toYaml | nindent 14 }} - {{- end }} - restartPolicy: {{ .Values.backup.cronjob.restartPolicy }} - {{- if .Values.backup.cronjob.podSecurityContext.enabled }} - securityContext: - fsGroup: {{ .Values.backup.cronjob.podSecurityContext.fsGroup }} - {{- end }} - volumes: - {{- if .Values.tls.enabled }} - - name: raw-certificates - emptyDir: /tmp/certs - {{- end }} - {{- if .Values.backup.cronjob.storage.existingClaim }} - - name: datadir - persistentVolumeClaim: - claimName: {{ printf "%s" (tpl .Values.backup.cronjob.storage.existingClaim .) }} - {{- else }} - - name: datadir - persistentVolumeClaim: - claimName: {{ include "postgresql.v1.primary.fullname" . }}-pgdumpall - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/backup/pvc.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/backup/pvc.yaml deleted file mode 100644 index 6fe9cbf76..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/backup/pvc.yaml +++ /dev/null @@ -1,34 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.backup.enabled (not .Values.backup.cronjob.storage.existingClaim) -}} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ include "postgresql.v1.primary.fullname" . }}-pgdumpall - namespace: {{ .Release.Namespace | quote }} - {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.backup.cronjob.labels .Values.commonLabels ) "context" . ) }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: pg_dumpall - {{- if or .Values.backup.cronjob.annotations .Values.commonAnnotations .Values.backup.cronjob.storage.resourcePolicy }} - annotations: - {{- if or .Values.backup.cronjob.annotations .Values.commonAnnotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.backup.cronjob.annotations .Values.commonAnnotations ) "context" . ) }} - {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} - {{- if .Values.backup.cronjob.storage.resourcePolicy }} - helm.sh/resource-policy: {{ .Values.backup.cronjob.storage.resourcePolicy | quote }} - {{- end }} - {{- end }} -spec: - accessModes: - {{- range .Values.backup.cronjob.storage.accessModes }} - - {{ . | quote }} - {{- end }} - resources: - requests: - storage: {{ .Values.backup.cronjob.storage.size | quote }} - {{ include "common.storage.class" (dict "persistence" .Values.backup.cronjob.storage "global" .Values.global) }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/extra-list.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/extra-list.yaml deleted file mode 100644 index 2d35a580e..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/extra-list.yaml +++ /dev/null @@ -1,9 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- range .Values.extraDeploy }} ---- -{{ include "common.tplvalues.render" (dict "value" . "context" $) }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/networkpolicy-egress.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/networkpolicy-egress.yaml deleted file mode 100644 index b67817c05..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/networkpolicy-egress.yaml +++ /dev/null @@ -1,34 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.networkPolicy.enabled (or .Values.networkPolicy.egressRules.denyConnectionsToExternal .Values.networkPolicy.egressRules.customRules) }} -apiVersion: {{ include "common.capabilities.networkPolicy.apiVersion" . }} -kind: NetworkPolicy -metadata: - name: {{ printf "%s-egress" (include "common.names.fullname" .) }} - namespace: {{ .Release.Namespace }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - podSelector: - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 6 }} - policyTypes: - - Egress - egress: - {{- if .Values.networkPolicy.egressRules.denyConnectionsToExternal }} - - ports: - - port: 53 - protocol: UDP - - port: 53 - protocol: TCP - - to: - - namespaceSelector: {} - {{- end }} - {{- if .Values.networkPolicy.egressRules.customRules }} - {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.egressRules.customRules "context" $) | nindent 4 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/configmap.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/configmap.yaml deleted file mode 100644 index 7a69891c9..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/configmap.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if (include "postgresql.v1.primary.createConfigmap" .) }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ printf "%s-configuration" (include "postgresql.v1.primary.fullname" .) }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: primary - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -data: - {{- if .Values.primary.configuration }} - postgresql.conf: | - {{- include "common.tplvalues.render" ( dict "value" .Values.primary.configuration "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.primary.pgHbaConfiguration }} - pg_hba.conf: | - {{- include "common.tplvalues.render" ( dict "value" .Values.primary.pgHbaConfiguration "context" $ ) | nindent 4 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/extended-configmap.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/extended-configmap.yaml deleted file mode 100644 index 456f8ee55..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/extended-configmap.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if (include "postgresql.v1.primary.createExtendedConfigmap" .) }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ printf "%s-extended-configuration" (include "postgresql.v1.primary.fullname" .) }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: primary - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -data: - override.conf: |- - {{- include "common.tplvalues.render" ( dict "value" .Values.primary.extendedConfiguration "context" $ ) | nindent 4 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/initialization-configmap.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/initialization-configmap.yaml deleted file mode 100644 index 80d804a0f..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/initialization-configmap.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.primary.initdb.scripts (not .Values.primary.initdb.scriptsConfigMap) }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ printf "%s-init-scripts" (include "postgresql.v1.primary.fullname" .) }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -data: {{- include "common.tplvalues.render" (dict "value" .Values.primary.initdb.scripts "context" .) | nindent 2 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/metrics-configmap.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/metrics-configmap.yaml deleted file mode 100644 index 7da2bcd26..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/metrics-configmap.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.metrics.enabled .Values.metrics.customMetrics }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ printf "%s-metrics" (include "postgresql.v1.primary.fullname" .) }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -data: - custom-metrics.yaml: {{ toYaml .Values.metrics.customMetrics | quote }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/metrics-svc.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/metrics-svc.yaml deleted file mode 100644 index 3d94510c7..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/metrics-svc.yaml +++ /dev/null @@ -1,31 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if .Values.metrics.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ printf "%s-metrics" (include "postgresql.v1.primary.fullname" .) }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: metrics - {{- if or .Values.commonAnnotations .Values.metrics.service.annotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.metrics.service.annotations .Values.commonAnnotations ) "context" . ) }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} -spec: - type: ClusterIP - sessionAffinity: {{ .Values.metrics.service.sessionAffinity }} - {{- if .Values.metrics.service.clusterIP }} - clusterIP: {{ .Values.metrics.service.clusterIP }} - {{- end }} - ports: - - name: http-metrics - port: {{ .Values.metrics.service.ports.metrics }} - targetPort: http-metrics - {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.primary.podLabels .Values.commonLabels ) "context" . ) }} - selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: primary -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/networkpolicy.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/networkpolicy.yaml deleted file mode 100644 index 9da3fb491..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/networkpolicy.yaml +++ /dev/null @@ -1,61 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.networkPolicy.enabled (or .Values.networkPolicy.metrics.enabled .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.enabled) }} -apiVersion: {{ include "common.capabilities.networkPolicy.apiVersion" . }} -kind: NetworkPolicy -metadata: - name: {{ printf "%s-ingress" (include "postgresql.v1.primary.fullname" .) }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: primary - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - {{- $primaryPodLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.primary.podLabels .Values.commonLabels ) "context" . ) }} - podSelector: - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $primaryPodLabels "context" $ ) | nindent 6 }} - app.kubernetes.io/component: primary - ingress: - {{- if and .Values.metrics.enabled .Values.networkPolicy.metrics.enabled (or .Values.networkPolicy.metrics.namespaceSelector .Values.networkPolicy.metrics.podSelector) }} - - from: - {{- if .Values.networkPolicy.metrics.namespaceSelector }} - - namespaceSelector: - matchLabels: {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.metrics.namespaceSelector "context" $) | nindent 14 }} - {{- end }} - {{- if .Values.networkPolicy.metrics.podSelector }} - - podSelector: - matchLabels: {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.metrics.podSelector "context" $) | nindent 14 }} - {{- end }} - ports: - - port: {{ .Values.metrics.containerPorts.metrics }} - {{- end }} - {{- if and .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.enabled (or .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.namespaceSelector .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.podSelector) }} - - from: - {{- if .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.namespaceSelector }} - - namespaceSelector: - matchLabels: {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.namespaceSelector "context" $) | nindent 14 }} - {{- end }} - {{- if .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.podSelector }} - - podSelector: - matchLabels: {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.podSelector "context" $) | nindent 14 }} - {{- end }} - ports: - - port: {{ .Values.containerPorts.postgresql }} - {{- end }} - {{- if and .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.enabled (eq .Values.architecture "replication") }} - - from: - {{- $readPodLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.podLabels .Values.commonLabels ) "context" . ) }} - - podSelector: - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $readPodLabels "context" $ ) | nindent 14 }} - app.kubernetes.io/component: read - ports: - - port: {{ .Values.containerPorts.postgresql }} - {{- end }} - {{- if .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.customRules }} - {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.ingressRules.primaryAccessOnlyFrom.customRules "context" $) | nindent 4 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/servicemonitor.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/servicemonitor.yaml deleted file mode 100644 index 05d54f3b3..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/servicemonitor.yaml +++ /dev/null @@ -1,46 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "postgresql.v1.primary.fullname" . }} - namespace: {{ default .Release.Namespace .Values.metrics.serviceMonitor.namespace | quote }} - {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.metrics.serviceMonitor.labels .Values.commonLabels ) "context" . ) }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: metrics - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - {{- if .Values.metrics.serviceMonitor.jobLabel }} - jobLabel: {{ .Values.metrics.serviceMonitor.jobLabel }} - {{- end }} - selector: - {{- $svcLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.metrics.serviceMonitor.selector .Values.commonLabels ) "context" . ) }} - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $svcLabels "context" $ ) | nindent 6 }} - app.kubernetes.io/component: metrics - endpoints: - - port: http-metrics - {{- if .Values.metrics.serviceMonitor.interval }} - interval: {{ .Values.metrics.serviceMonitor.interval }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.relabelings }} - relabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.relabelings "context" $) | nindent 6 }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.metricRelabelings }} - metricRelabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.metricRelabelings "context" $) | nindent 6 }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.honorLabels }} - honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }} - {{- end }} - namespaceSelector: - matchNames: - - {{ .Release.Namespace | quote }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/statefulset.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/statefulset.yaml deleted file mode 100644 index 1f0c96203..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/statefulset.yaml +++ /dev/null @@ -1,662 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- $customUser := include "postgresql.v1.username" . }} -apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }} -kind: StatefulSet -metadata: - name: {{ include "postgresql.v1.primary.fullname" . }} - namespace: {{ .Release.Namespace | quote }} - {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.primary.labels .Values.commonLabels ) "context" . ) }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: primary - {{- if or .Values.commonAnnotations .Values.primary.annotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.primary.annotations .Values.commonAnnotations ) "context" . ) }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} -spec: - replicas: 1 - serviceName: {{ include "postgresql.v1.primary.svc.headless" . }} - {{- if .Values.primary.updateStrategy }} - updateStrategy: {{- toYaml .Values.primary.updateStrategy | nindent 4 }} - {{- end }} - {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.primary.podLabels .Values.commonLabels ) "context" . ) }} - selector: - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }} - app.kubernetes.io/component: primary - template: - metadata: - name: {{ include "postgresql.v1.primary.fullname" . }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $podLabels "context" $ ) | nindent 8 }} - app.kubernetes.io/component: primary - {{- if or (include "postgresql.v1.primary.createConfigmap" .) (include "postgresql.v1.primary.createExtendedConfigmap" .) .Values.primary.podAnnotations }} - annotations: - {{- if (include "postgresql.v1.primary.createConfigmap" .) }} - checksum/configuration: {{ pick (include (print $.Template.BasePath "/primary/configmap.yaml") . | fromYaml) "data" | toYaml | sha256sum }} - {{- end }} - {{- if (include "postgresql.v1.primary.createExtendedConfigmap" .) }} - checksum/extended-configuration: {{ pick (include (print $.Template.BasePath "/primary/extended-configmap.yaml") . | fromYaml) "data" | toYaml | sha256sum }} - {{- end }} - {{- if .Values.primary.podAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.primary.podAnnotations "context" $ ) | nindent 8 }} - {{- end }} - {{- end }} - spec: - {{- if .Values.primary.extraPodSpec }} - {{- include "common.tplvalues.render" (dict "value" .Values.primary.extraPodSpec "context" $) | nindent 6 }} - {{- end }} - serviceAccountName: {{ include "postgresql.v1.serviceAccountName" . }} - {{- include "postgresql.v1.imagePullSecrets" . | nindent 6 }} - automountServiceAccountToken: {{ .Values.primary.automountServiceAccountToken }} - {{- if .Values.primary.hostAliases }} - hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.primary.hostAliases "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.primary.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.primary.affinity "context" $) | nindent 8 }} - {{- else }} - affinity: - podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.primary.podAffinityPreset "component" "primary" "customLabels" $podLabels "context" $) | nindent 10 }} - podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.primary.podAntiAffinityPreset "component" "primary" "customLabels" $podLabels "context" $) | nindent 10 }} - nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.primary.nodeAffinityPreset.type "key" .Values.primary.nodeAffinityPreset.key "values" .Values.primary.nodeAffinityPreset.values) | nindent 10 }} - {{- end }} - {{- if .Values.primary.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.primary.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.primary.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.primary.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.primary.topologySpreadConstraints }} - topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.primary.topologySpreadConstraints "context" .) | nindent 8 }} - {{- end }} - {{- if .Values.primary.priorityClassName }} - priorityClassName: {{ .Values.primary.priorityClassName }} - {{- end }} - {{- if .Values.primary.schedulerName }} - schedulerName: {{ .Values.primary.schedulerName | quote }} - {{- end }} - {{- if .Values.primary.terminationGracePeriodSeconds }} - terminationGracePeriodSeconds: {{ .Values.primary.terminationGracePeriodSeconds }} - {{- end }} - {{- if .Values.primary.podSecurityContext.enabled }} - securityContext: {{- omit .Values.primary.podSecurityContext "enabled" | toYaml | nindent 8 }} - {{- end }} - hostNetwork: {{ .Values.primary.hostNetwork }} - hostIPC: {{ .Values.primary.hostIPC }} - {{- if or (and .Values.tls.enabled (not .Values.volumePermissions.enabled)) (and .Values.volumePermissions.enabled (or .Values.primary.persistence.enabled .Values.shmVolume.enabled)) .Values.primary.initContainers }} - initContainers: - {{- if and .Values.tls.enabled (not .Values.volumePermissions.enabled) }} - - name: copy-certs - image: {{ include "postgresql.v1.volumePermissions.image" . }} - imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }} - {{- if .Values.primary.resources }} - resources: {{- toYaml .Values.primary.resources | nindent 12 }} - {{- end }} - # We don't require a privileged container in this case - {{- if .Values.primary.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.primary.containerSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - command: - - /bin/sh - - -ec - - | - cp /tmp/certs/* /opt/bitnami/postgresql/certs/ - chmod 600 {{ include "postgresql.v1.tlsCertKey" . }} - volumeMounts: - - name: raw-certificates - mountPath: /tmp/certs - - name: postgresql-certificates - mountPath: /opt/bitnami/postgresql/certs - {{- else if and .Values.volumePermissions.enabled (or .Values.primary.persistence.enabled .Values.shmVolume.enabled) }} - - name: init-chmod-data - image: {{ include "postgresql.v1.volumePermissions.image" . }} - imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }} - {{- if .Values.volumePermissions.resources }} - resources: {{- toYaml .Values.volumePermissions.resources | nindent 12 }} - {{- end }} - command: - - /bin/sh - - -ec - - | - {{- if .Values.primary.persistence.enabled }} - {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} - chown `id -u`:`id -G | cut -d " " -f2` {{ .Values.primary.persistence.mountPath }} - {{- else }} - chown {{ .Values.primary.containerSecurityContext.runAsUser }}:{{ .Values.primary.podSecurityContext.fsGroup }} {{ .Values.primary.persistence.mountPath }} - {{- end }} - mkdir -p {{ .Values.primary.persistence.mountPath }}/data {{- if (include "postgresql.v1.mountConfigurationCM" .) }} {{ .Values.primary.persistence.mountPath }}/conf {{- end }} - chmod 700 {{ .Values.primary.persistence.mountPath }}/data {{- if (include "postgresql.v1.mountConfigurationCM" .) }} {{ .Values.primary.persistence.mountPath }}/conf {{- end }} - find {{ .Values.primary.persistence.mountPath }} -mindepth 1 -maxdepth 1 {{- if not (include "postgresql.v1.mountConfigurationCM" .) }} -not -name "conf" {{- end }} -not -name ".snapshot" -not -name "lost+found" | \ - {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} - xargs -r chown -R `id -u`:`id -G | cut -d " " -f2` - {{- else }} - xargs -r chown -R {{ .Values.primary.containerSecurityContext.runAsUser }}:{{ .Values.primary.podSecurityContext.fsGroup }} - {{- end }} - {{- end }} - {{- if .Values.shmVolume.enabled }} - chmod -R 777 /dev/shm - {{- end }} - {{- if .Values.tls.enabled }} - cp /tmp/certs/* /opt/bitnami/postgresql/certs/ - {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} - chown -R `id -u`:`id -G | cut -d " " -f2` /opt/bitnami/postgresql/certs/ - {{- else }} - chown -R {{ .Values.primary.containerSecurityContext.runAsUser }}:{{ .Values.primary.podSecurityContext.fsGroup }} /opt/bitnami/postgresql/certs/ - {{- end }} - chmod 600 {{ include "postgresql.v1.tlsCertKey" . }} - {{- end }} - {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} - securityContext: {{- omit .Values.volumePermissions.containerSecurityContext "runAsUser" | toYaml | nindent 12 }} - {{- else }} - securityContext: {{- .Values.volumePermissions.containerSecurityContext | toYaml | nindent 12 }} - {{- end }} - volumeMounts: - {{- if .Values.primary.persistence.enabled }} - - name: data - mountPath: {{ .Values.primary.persistence.mountPath }} - {{- if .Values.primary.persistence.subPath }} - subPath: {{ .Values.primary.persistence.subPath }} - {{- end }} - {{- end }} - {{- if .Values.shmVolume.enabled }} - - name: dshm - mountPath: /dev/shm - {{- end }} - {{- if .Values.tls.enabled }} - - name: raw-certificates - mountPath: /tmp/certs - - name: postgresql-certificates - mountPath: /opt/bitnami/postgresql/certs - {{- end }} - {{- end }} - {{- if .Values.primary.initContainers }} - {{- include "common.tplvalues.render" ( dict "value" .Values.primary.initContainers "context" $ ) | nindent 8 }} - {{- end }} - {{- end }} - containers: - - name: postgresql - image: {{ include "postgresql.v1.image" . }} - imagePullPolicy: {{ .Values.image.pullPolicy | quote }} - {{- if .Values.primary.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.primary.containerSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} - {{- else if .Values.primary.command }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.primary.command "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} - {{- else if .Values.primary.args }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.primary.args "context" $) | nindent 12 }} - {{- end }} - env: - - name: BITNAMI_DEBUG - value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }} - - name: POSTGRESQL_PORT_NUMBER - value: {{ .Values.containerPorts.postgresql | quote }} - - name: POSTGRESQL_VOLUME_DIR - value: {{ .Values.primary.persistence.mountPath | quote }} - {{- if .Values.primary.persistence.mountPath }} - - name: PGDATA - value: {{ .Values.postgresqlDataDir | quote }} - {{- end }} - # Authentication - {{- if or (eq $customUser "postgres") (empty $customUser) }} - {{- if .Values.auth.enablePostgresUser }} - {{- if .Values.auth.usePasswordFiles }} - - name: POSTGRES_PASSWORD_FILE - value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.adminPasswordKey" .) }} - {{- else }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "postgresql.v1.secretName" . }} - key: {{ include "postgresql.v1.adminPasswordKey" . }} - {{- end }} - {{- else }} - - name: ALLOW_EMPTY_PASSWORD - value: "true" - {{- end }} - {{- else }} - - name: POSTGRES_USER - value: {{ $customUser | quote }} - {{- if .Values.auth.usePasswordFiles }} - - name: POSTGRES_PASSWORD_FILE - value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.userPasswordKey" .) }} - {{- else }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "postgresql.v1.secretName" . }} - key: {{ include "postgresql.v1.userPasswordKey" . }} - {{- end }} - {{- if .Values.auth.enablePostgresUser }} - {{- if .Values.auth.usePasswordFiles }} - - name: POSTGRES_POSTGRES_PASSWORD_FILE - value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.adminPasswordKey" .) }} - {{- else }} - - name: POSTGRES_POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "postgresql.v1.secretName" . }} - key: {{ include "postgresql.v1.adminPasswordKey" . }} - {{- end }} - {{- end }} - {{- end }} - {{- if (include "postgresql.v1.database" .) }} - - name: POSTGRES_DATABASE - value: {{ (include "postgresql.v1.database" .) | quote }} - {{- end }} - # Replication - {{- if or (eq .Values.architecture "replication") .Values.primary.standby.enabled }} - - name: POSTGRES_REPLICATION_MODE - value: {{ ternary "slave" "master" .Values.primary.standby.enabled | quote }} - - name: POSTGRES_REPLICATION_USER - value: {{ .Values.auth.replicationUsername | quote }} - {{- if .Values.auth.usePasswordFiles }} - - name: POSTGRES_REPLICATION_PASSWORD_FILE - value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.replicationPasswordKey" .) }} - {{- else }} - - name: POSTGRES_REPLICATION_PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "postgresql.v1.secretName" . }} - key: {{ include "postgresql.v1.replicationPasswordKey" . }} - {{- end }} - {{- if ne .Values.replication.synchronousCommit "off" }} - - name: POSTGRES_SYNCHRONOUS_COMMIT_MODE - value: {{ .Values.replication.synchronousCommit | quote }} - - name: POSTGRES_NUM_SYNCHRONOUS_REPLICAS - value: {{ .Values.replication.numSynchronousReplicas | quote }} - {{- end }} - - name: POSTGRES_CLUSTER_APP_NAME - value: {{ .Values.replication.applicationName }} - {{- end }} - # Initdb - {{- if .Values.primary.initdb.args }} - - name: POSTGRES_INITDB_ARGS - value: {{ .Values.primary.initdb.args | quote }} - {{- end }} - {{- if .Values.primary.initdb.postgresqlWalDir }} - - name: POSTGRES_INITDB_WALDIR - value: {{ .Values.primary.initdb.postgresqlWalDir | quote }} - {{- end }} - {{- if .Values.primary.initdb.user }} - - name: POSTGRES_INITSCRIPTS_USERNAME - value: {{ .Values.primary.initdb.user }} - {{- end }} - {{- if .Values.primary.initdb.password }} - - name: POSTGRES_INITSCRIPTS_PASSWORD - value: {{ .Values.primary.initdb.password | quote }} - {{- end }} - # Standby - {{- if .Values.primary.standby.enabled }} - - name: POSTGRES_MASTER_HOST - value: {{ .Values.primary.standby.primaryHost }} - - name: POSTGRES_MASTER_PORT_NUMBER - value: {{ .Values.primary.standby.primaryPort | quote }} - {{- end }} - # LDAP - - name: POSTGRESQL_ENABLE_LDAP - value: {{ ternary "yes" "no" .Values.ldap.enabled | quote }} - {{- if .Values.ldap.enabled }} - {{- if or .Values.ldap.url .Values.ldap.uri }} - - name: POSTGRESQL_LDAP_URL - value: {{ coalesce .Values.ldap.url .Values.ldap.uri }} - {{- else }} - - name: POSTGRESQL_LDAP_SERVER - value: {{ .Values.ldap.server }} - - name: POSTGRESQL_LDAP_PORT - value: {{ .Values.ldap.port | quote }} - - name: POSTGRESQL_LDAP_SCHEME - value: {{ .Values.ldap.scheme }} - {{- if (include "postgresql.v1.ldap.tls.enabled" .) }} - - name: POSTGRESQL_LDAP_TLS - value: "1" - {{- end }} - - name: POSTGRESQL_LDAP_PREFIX - value: {{ .Values.ldap.prefix | quote }} - - name: POSTGRESQL_LDAP_SUFFIX - value: {{ .Values.ldap.suffix | quote }} - - name: POSTGRESQL_LDAP_BASE_DN - value: {{ coalesce .Values.ldap.baseDN .Values.ldap.basedn }} - - name: POSTGRESQL_LDAP_BIND_DN - value: {{ coalesce .Values.ldap.bindDN .Values.ldap.binddn}} - {{- if or (not (empty .Values.ldap.bind_password)) (not (empty .Values.ldap.bindpw)) }} - - name: POSTGRESQL_LDAP_BIND_PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "postgresql.v1.secretName" . }} - key: ldap-password - {{- end }} - - name: POSTGRESQL_LDAP_SEARCH_ATTR - value: {{ coalesce .Values.ldap.search_attr .Values.ldap.searchAttribute }} - - name: POSTGRESQL_LDAP_SEARCH_FILTER - value: {{ coalesce .Values.ldap.search_filter .Values.ldap.searchFilter }} - {{- end }} - {{- end }} - # TLS - - name: POSTGRESQL_ENABLE_TLS - value: {{ ternary "yes" "no" .Values.tls.enabled | quote }} - {{- if .Values.tls.enabled }} - - name: POSTGRESQL_TLS_PREFER_SERVER_CIPHERS - value: {{ ternary "yes" "no" .Values.tls.preferServerCiphers | quote }} - - name: POSTGRESQL_TLS_CERT_FILE - value: {{ include "postgresql.v1.tlsCert" . }} - - name: POSTGRESQL_TLS_KEY_FILE - value: {{ include "postgresql.v1.tlsCertKey" . }} - {{- if .Values.tls.certCAFilename }} - - name: POSTGRESQL_TLS_CA_FILE - value: {{ include "postgresql.v1.tlsCACert" . }} - {{- end }} - {{- if .Values.tls.crlFilename }} - - name: POSTGRESQL_TLS_CRL_FILE - value: {{ include "postgresql.v1.tlsCRL" . }} - {{- end }} - {{- end }} - # Audit - - name: POSTGRESQL_LOG_HOSTNAME - value: {{ .Values.audit.logHostname | quote }} - - name: POSTGRESQL_LOG_CONNECTIONS - value: {{ .Values.audit.logConnections | quote }} - - name: POSTGRESQL_LOG_DISCONNECTIONS - value: {{ .Values.audit.logDisconnections | quote }} - {{- if .Values.audit.logLinePrefix }} - - name: POSTGRESQL_LOG_LINE_PREFIX - value: {{ .Values.audit.logLinePrefix | quote }} - {{- end }} - {{- if .Values.audit.logTimezone }} - - name: POSTGRESQL_LOG_TIMEZONE - value: {{ .Values.audit.logTimezone | quote }} - {{- end }} - {{- if .Values.audit.pgAuditLog }} - - name: POSTGRESQL_PGAUDIT_LOG - value: {{ .Values.audit.pgAuditLog | quote }} - {{- end }} - - name: POSTGRESQL_PGAUDIT_LOG_CATALOG - value: {{ .Values.audit.pgAuditLogCatalog | quote }} - # Others - - name: POSTGRESQL_CLIENT_MIN_MESSAGES - value: {{ .Values.audit.clientMinMessages | quote }} - - name: POSTGRESQL_SHARED_PRELOAD_LIBRARIES - value: {{ .Values.postgresqlSharedPreloadLibraries | quote }} - {{- if .Values.primary.extraEnvVars }} - {{- include "common.tplvalues.render" (dict "value" .Values.primary.extraEnvVars "context" $) | nindent 12 }} - {{- end }} - {{- if or .Values.primary.extraEnvVarsCM .Values.primary.extraEnvVarsSecret }} - envFrom: - {{- if .Values.primary.extraEnvVarsCM }} - - configMapRef: - name: {{ .Values.primary.extraEnvVarsCM }} - {{- end }} - {{- if .Values.primary.extraEnvVarsSecret }} - - secretRef: - name: {{ .Values.primary.extraEnvVarsSecret }} - {{- end }} - {{- end }} - ports: - - name: tcp-postgresql - containerPort: {{ .Values.containerPorts.postgresql }} - {{- if not .Values.diagnosticMode.enabled }} - {{- if .Values.primary.customStartupProbe }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.primary.customStartupProbe "context" $) | nindent 12 }} - {{- else if .Values.primary.startupProbe.enabled }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.primary.startupProbe "enabled") "context" $) | nindent 12 }} - exec: - command: - - /bin/sh - - -c - {{- if (include "postgresql.v1.database" .) }} - - exec pg_isready -U {{ default "postgres" $customUser | quote }} -d "dbname={{ include "postgresql.v1.database" . }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}{{- end }}" -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} - {{- else }} - - exec pg_isready -U {{ default "postgres" $customUser | quote }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} -d "sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}"{{- end }} -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} - {{- end }} - {{- end }} - {{- if .Values.primary.customLivenessProbe }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.primary.customLivenessProbe "context" $) | nindent 12 }} - {{- else if .Values.primary.livenessProbe.enabled }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.primary.livenessProbe "enabled") "context" $) | nindent 12 }} - exec: - command: - - /bin/sh - - -c - {{- if (include "postgresql.v1.database" .) }} - - exec pg_isready -U {{ default "postgres" $customUser | quote }} -d "dbname={{ include "postgresql.v1.database" . }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}{{- end }}" -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} - {{- else }} - - exec pg_isready -U {{ default "postgres" $customUser | quote }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} -d "sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}"{{- end }} -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} - {{- end }} - {{- end }} - {{- if .Values.primary.customReadinessProbe }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.primary.customReadinessProbe "context" $) | nindent 12 }} - {{- else if .Values.primary.readinessProbe.enabled }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.primary.readinessProbe "enabled") "context" $) | nindent 12 }} - exec: - command: - - /bin/sh - - -c - - -e - {{- include "postgresql.v1.readinessProbeCommand" . | nindent 16 }} - {{- end }} - {{- end }} - {{- if .Values.primary.resources }} - resources: {{- toYaml .Values.primary.resources | nindent 12 }} - {{- end }} - {{- if .Values.primary.lifecycleHooks }} - lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.primary.lifecycleHooks "context" $) | nindent 12 }} - {{- end }} - volumeMounts: - {{- if or .Values.primary.initdb.scriptsConfigMap .Values.primary.initdb.scripts }} - - name: custom-init-scripts - mountPath: /docker-entrypoint-initdb.d/ - {{- end }} - {{- if .Values.primary.initdb.scriptsSecret }} - - name: custom-init-scripts-secret - mountPath: /docker-entrypoint-initdb.d/secret - {{- end }} - {{- if or .Values.primary.extendedConfiguration .Values.primary.existingExtendedConfigmap }} - - name: postgresql-extended-config - mountPath: {{ .Values.primary.persistence.mountPath }}/conf/conf.d/ - {{- end }} - {{- if .Values.auth.usePasswordFiles }} - - name: postgresql-password - mountPath: /opt/bitnami/postgresql/secrets/ - {{- end }} - {{- if .Values.tls.enabled }} - - name: postgresql-certificates - mountPath: /opt/bitnami/postgresql/certs - readOnly: true - {{- end }} - {{- if .Values.shmVolume.enabled }} - - name: dshm - mountPath: /dev/shm - {{- end }} - {{- if .Values.primary.persistence.enabled }} - - name: data - mountPath: {{ .Values.primary.persistence.mountPath }} - {{- if .Values.primary.persistence.subPath }} - subPath: {{ .Values.primary.persistence.subPath }} - {{- end }} - {{- end }} - {{- if or .Values.primary.configuration .Values.primary.pgHbaConfiguration .Values.primary.existingConfigmap }} - - name: postgresql-config - mountPath: {{ .Values.primary.persistence.mountPath }}/conf - {{- end }} - {{- if .Values.primary.extraVolumeMounts }} - {{- include "common.tplvalues.render" (dict "value" .Values.primary.extraVolumeMounts "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.metrics.enabled }} - - name: metrics - image: {{ include "postgresql.v1.metrics.image" . }} - imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }} - {{- if .Values.metrics.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.metrics.containerSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} - {{- else if or .Values.metrics.customMetrics .Values.metrics.collectors }} - args: - {{- if .Values.metrics.customMetrics }} - - --extend.query-path - - /conf/custom-metrics.yaml - {{- end }} - {{- range $name, $enabled := .Values.metrics.collectors }} - - --{{ if not $enabled }}no-{{ end }}collector.{{ $name }} - {{- end }} - {{- end }} - env: - {{- $database := required "In order to enable metrics you need to specify a database (.Values.auth.database or .Values.global.postgresql.auth.database)" (include "postgresql.v1.database" .) }} - - name: DATA_SOURCE_URI - value: {{ printf "127.0.0.1:%d/%s?sslmode=disable" (int (include "postgresql.v1.service.port" .)) $database }} - {{- $pwdKey := ternary (include "postgresql.v1.adminPasswordKey" .) (include "postgresql.v1.userPasswordKey" .) (or (eq $customUser "postgres") (empty $customUser)) }} - {{- if .Values.auth.usePasswordFiles }} - - name: DATA_SOURCE_PASS_FILE - value: {{ printf "/opt/bitnami/postgresql/secrets/%s" $pwdKey }} - {{- else }} - - name: DATA_SOURCE_PASS - valueFrom: - secretKeyRef: - name: {{ include "postgresql.v1.secretName" . }} - key: {{ $pwdKey }} - {{- end }} - - name: DATA_SOURCE_USER - value: {{ default "postgres" $customUser | quote }} - {{- if .Values.metrics.extraEnvVars }} - {{- include "common.tplvalues.render" (dict "value" .Values.metrics.extraEnvVars "context" $) | nindent 12 }} - {{- end }} - ports: - - name: http-metrics - containerPort: {{ .Values.metrics.containerPorts.metrics }} - {{- if not .Values.diagnosticMode.enabled }} - {{- if .Values.metrics.customStartupProbe }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customStartupProbe "context" $) | nindent 12 }} - {{- else if .Values.metrics.startupProbe.enabled }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.startupProbe "enabled") "context" $) | nindent 12 }} - tcpSocket: - port: http-metrics - {{- end }} - {{- if .Values.metrics.customLivenessProbe }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customLivenessProbe "context" $) | nindent 12 }} - {{- else if .Values.metrics.livenessProbe.enabled }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.livenessProbe "enabled") "context" $) | nindent 12 }} - httpGet: - path: / - port: http-metrics - {{- end }} - {{- if .Values.metrics.customReadinessProbe }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customReadinessProbe "context" $) | nindent 12 }} - {{- else if .Values.metrics.readinessProbe.enabled }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.readinessProbe "enabled") "context" $) | nindent 12 }} - httpGet: - path: / - port: http-metrics - {{- end }} - {{- end }} - volumeMounts: - {{- if .Values.auth.usePasswordFiles }} - - name: postgresql-password - mountPath: /opt/bitnami/postgresql/secrets/ - {{- end }} - {{- if .Values.metrics.customMetrics }} - - name: custom-metrics - mountPath: /conf - readOnly: true - {{- end }} - {{- if .Values.metrics.resources }} - resources: {{- toYaml .Values.metrics.resources | nindent 12 }} - {{- end }} - {{- end }} - {{- if .Values.primary.sidecars }} - {{- include "common.tplvalues.render" ( dict "value" .Values.primary.sidecars "context" $ ) | nindent 8 }} - {{- end }} - volumes: - {{- if or .Values.primary.configuration .Values.primary.pgHbaConfiguration .Values.primary.existingConfigmap }} - - name: postgresql-config - configMap: - name: {{ include "postgresql.v1.primary.configmapName" . }} - {{- end }} - {{- if or .Values.primary.extendedConfiguration .Values.primary.existingExtendedConfigmap }} - - name: postgresql-extended-config - configMap: - name: {{ include "postgresql.v1.primary.extendedConfigmapName" . }} - {{- end }} - {{- if .Values.auth.usePasswordFiles }} - - name: postgresql-password - secret: - secretName: {{ include "postgresql.v1.secretName" . }} - {{- end }} - {{- if or .Values.primary.initdb.scriptsConfigMap .Values.primary.initdb.scripts }} - - name: custom-init-scripts - configMap: - name: {{ include "postgresql.v1.initdb.scriptsCM" . }} - {{- end }} - {{- if .Values.primary.initdb.scriptsSecret }} - - name: custom-init-scripts-secret - secret: - secretName: {{ tpl .Values.primary.initdb.scriptsSecret $ }} - {{- end }} - {{- if .Values.tls.enabled }} - - name: raw-certificates - secret: - secretName: {{ include "postgresql.v1.tlsSecretName" . }} - - name: postgresql-certificates - emptyDir: {} - {{- end }} - {{- if .Values.primary.extraVolumes }} - {{- include "common.tplvalues.render" ( dict "value" .Values.primary.extraVolumes "context" $ ) | nindent 8 }} - {{- end }} - {{- if and .Values.metrics.enabled .Values.metrics.customMetrics }} - - name: custom-metrics - configMap: - name: {{ printf "%s-metrics" (include "postgresql.v1.primary.fullname" .) }} - {{- end }} - {{- if .Values.shmVolume.enabled }} - - name: dshm - emptyDir: - medium: Memory - {{- if .Values.shmVolume.sizeLimit }} - sizeLimit: {{ .Values.shmVolume.sizeLimit }} - {{- end }} - {{- end }} - {{- if and .Values.primary.persistence.enabled .Values.primary.persistence.existingClaim }} - - name: data - persistentVolumeClaim: - claimName: {{ tpl .Values.primary.persistence.existingClaim $ }} - {{- else if not .Values.primary.persistence.enabled }} - - name: data - emptyDir: {} - {{- else }} - {{- if .Values.primary.persistentVolumeClaimRetentionPolicy.enabled }} - persistentVolumeClaimRetentionPolicy: - whenDeleted: {{ .Values.primary.persistentVolumeClaimRetentionPolicy.whenDeleted }} - whenScaled: {{ .Values.primary.persistentVolumeClaimRetentionPolicy.whenScaled }} - {{- end }} - volumeClaimTemplates: - - apiVersion: v1 - kind: PersistentVolumeClaim - metadata: - name: data - {{- if .Values.primary.persistence.annotations }} - annotations: {{- include "common.tplvalues.render" (dict "value" .Values.primary.persistence.annotations "context" $) | nindent 10 }} - {{- end }} - {{- if .Values.primary.persistence.labels }} - labels: {{- include "common.tplvalues.render" (dict "value" .Values.primary.persistence.labels "context" $) | nindent 10 }} - {{- end }} - spec: - accessModes: - {{- range .Values.primary.persistence.accessModes }} - - {{ . | quote }} - {{- end }} - {{- if .Values.primary.persistence.dataSource }} - dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.primary.persistence.dataSource "context" $) | nindent 10 }} - {{- end }} - resources: - requests: - storage: {{ .Values.primary.persistence.size | quote }} - {{- if .Values.primary.persistence.selector }} - selector: {{- include "common.tplvalues.render" (dict "value" .Values.primary.persistence.selector "context" $) | nindent 10 }} - {{- end }} - {{- include "common.storage.class" (dict "persistence" .Values.primary.persistence "global" .Values.global) | nindent 8 }} - {{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/svc-headless.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/svc-headless.yaml deleted file mode 100644 index b18565aea..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/svc-headless.yaml +++ /dev/null @@ -1,36 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -apiVersion: v1 -kind: Service -metadata: - name: {{ include "postgresql.v1.primary.svc.headless" . }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: primary - annotations: - {{- if or .Values.primary.service.headless.annotations .Values.commonAnnotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.primary.service.headless.annotations .Values.commonAnnotations ) "context" . ) }} - {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} - # Use this annotation in addition to the actual publishNotReadyAddresses - # field below because the annotation will stop being respected soon but the - # field is broken in some versions of Kubernetes: - # https://github.com/kubernetes/kubernetes/issues/58662 - service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" -spec: - type: ClusterIP - clusterIP: None - # We want all pods in the StatefulSet to have their addresses published for - # the sake of the other Postgresql pods even before they're ready, since they - # have to be able to talk to each other in order to become ready. - publishNotReadyAddresses: true - ports: - - name: tcp-postgresql - port: {{ template "postgresql.v1.service.port" . }} - targetPort: tcp-postgresql - {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.primary.podLabels .Values.commonLabels ) "context" . ) }} - selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: primary diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/svc.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/svc.yaml deleted file mode 100644 index 90f7e4690..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/primary/svc.yaml +++ /dev/null @@ -1,51 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -apiVersion: v1 -kind: Service -metadata: - name: {{ include "postgresql.v1.primary.fullname" . }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: primary - {{- if or .Values.commonAnnotations .Values.primary.service.annotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.primary.service.annotations .Values.commonAnnotations ) "context" . ) }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} -spec: - type: {{ .Values.primary.service.type }} - {{- if or (eq .Values.primary.service.type "LoadBalancer") (eq .Values.primary.service.type "NodePort") }} - externalTrafficPolicy: {{ .Values.primary.service.externalTrafficPolicy | quote }} - {{- end }} - {{- if and (eq .Values.primary.service.type "LoadBalancer") (not (empty .Values.primary.service.loadBalancerSourceRanges)) }} - loadBalancerSourceRanges: {{ .Values.primary.service.loadBalancerSourceRanges | toJson}} - {{- end }} - {{- if and (eq .Values.primary.service.type "LoadBalancer") (not (empty .Values.primary.service.loadBalancerIP)) }} - loadBalancerIP: {{ .Values.primary.service.loadBalancerIP }} - {{- end }} - {{- if and .Values.primary.service.clusterIP (eq .Values.primary.service.type "ClusterIP") }} - clusterIP: {{ .Values.primary.service.clusterIP }} - {{- end }} - {{- if .Values.primary.service.sessionAffinity }} - sessionAffinity: {{ .Values.primary.service.sessionAffinity }} - {{- end }} - {{- if .Values.primary.service.sessionAffinityConfig }} - sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.primary.service.sessionAffinityConfig "context" $) | nindent 4 }} - {{- end }} - ports: - - name: tcp-postgresql - port: {{ template "postgresql.v1.service.port" . }} - targetPort: tcp-postgresql - {{- if and (or (eq .Values.primary.service.type "NodePort") (eq .Values.primary.service.type "LoadBalancer")) (not (empty .Values.primary.service.nodePorts.postgresql)) }} - nodePort: {{ .Values.primary.service.nodePorts.postgresql }} - {{- else if eq .Values.primary.service.type "ClusterIP" }} - nodePort: null - {{- end }} - {{- if .Values.primary.service.extraPorts }} - {{- include "common.tplvalues.render" (dict "value" .Values.primary.service.extraPorts "context" $) | nindent 4 }} - {{- end }} - {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.primary.podLabels .Values.commonLabels ) "context" . ) }} - selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: primary diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/prometheusrule.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/prometheusrule.yaml deleted file mode 100644 index 6cdb08732..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/prometheusrule.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.metrics.enabled .Values.metrics.prometheusRule.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ default .Release.Namespace .Values.metrics.prometheusRule.namespace | quote }} - {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.metrics.prometheusRule.labels .Values.commonLabels ) "context" . ) }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: metrics - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - groups: - - name: {{ include "common.names.fullname" . }} - rules: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.prometheusRule.rules "context" $ ) | nindent 8 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/psp.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/psp.yaml deleted file mode 100644 index 2cc1bbf47..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/psp.yaml +++ /dev/null @@ -1,42 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and (include "common.capabilities.psp.supported" .) .Values.psp.create }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - privileged: false - volumes: - - 'configMap' - - 'secret' - - 'persistentVolumeClaim' - - 'emptyDir' - - 'projected' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/extended-configmap.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/extended-configmap.yaml deleted file mode 100644 index efa87bb13..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/extended-configmap.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if (include "postgresql.v1.readReplicas.createExtendedConfigmap" .) }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ printf "%s-extended-configuration" (include "postgresql.v1.readReplica.fullname" .) }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: read - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -data: - override.conf: |- - {{- include "common.tplvalues.render" ( dict "value" .Values.readReplicas.extendedConfiguration "context" $ ) | nindent 4 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/metrics-configmap.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/metrics-configmap.yaml deleted file mode 100644 index a1e06bfc6..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/metrics-configmap.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.metrics.enabled .Values.metrics.customMetrics (eq .Values.architecture "replication") }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ printf "%s-metrics" (include "postgresql.v1.readReplica.fullname" .) }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -data: - custom-metrics.yaml: {{ toYaml .Values.metrics.customMetrics | quote }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/metrics-svc.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/metrics-svc.yaml deleted file mode 100644 index e9f13e067..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/metrics-svc.yaml +++ /dev/null @@ -1,31 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.metrics.enabled (eq .Values.architecture "replication") }} -apiVersion: v1 -kind: Service -metadata: - name: {{ printf "%s-metrics" (include "postgresql.v1.readReplica.fullname" .) }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: metrics-read - {{- if or .Values.commonAnnotations .Values.metrics.service.annotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.metrics.service.annotations .Values.commonAnnotations ) "context" . ) }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} -spec: - type: ClusterIP - sessionAffinity: {{ .Values.metrics.service.sessionAffinity }} - {{- if .Values.metrics.service.clusterIP }} - clusterIP: {{ .Values.metrics.service.clusterIP }} - {{- end }} - ports: - - name: http-metrics - port: {{ .Values.metrics.service.ports.metrics }} - targetPort: http-metrics - {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.podLabels .Values.commonLabels ) "context" . ) }} - selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: read -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/networkpolicy.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/networkpolicy.yaml deleted file mode 100644 index 79d3a5aa8..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/networkpolicy.yaml +++ /dev/null @@ -1,39 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.networkPolicy.enabled (eq .Values.architecture "replication") .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.enabled }} -apiVersion: {{ include "common.capabilities.networkPolicy.apiVersion" . }} -kind: NetworkPolicy -metadata: - name: {{ printf "%s-ingress" (include "postgresql.v1.readReplica.fullname" .) }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: read - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.podLabels .Values.commonLabels ) "context" . ) }} - podSelector: - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }} - app.kubernetes.io/component: read - ingress: - {{- if and .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.enabled (or .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.namespaceSelector .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.podSelector) }} - - from: - {{- if .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.namespaceSelector }} - - namespaceSelector: - matchLabels: {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.namespaceSelector "context" $) | nindent 14 }} - {{- end }} - {{- if .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.podSelector }} - - podSelector: - matchLabels: {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.podSelector "context" $) | nindent 14 }} - {{- end }} - ports: - - port: {{ .Values.containerPorts.postgresql }} - {{- end }} - {{- if .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.customRules }} - {{- include "common.tplvalues.render" (dict "value" .Values.networkPolicy.ingressRules.readReplicasAccessOnlyFrom.customRules "context" $) | nindent 4 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/servicemonitor.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/servicemonitor.yaml deleted file mode 100644 index 845734b1f..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/servicemonitor.yaml +++ /dev/null @@ -1,46 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled (eq .Values.architecture "replication") }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "postgresql.v1.readReplica.fullname" . }} - namespace: {{ default .Release.Namespace .Values.metrics.serviceMonitor.namespace | quote }} - {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.metrics.serviceMonitor.labels .Values.commonLabels ) "context" . ) }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: metrics-read - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - {{- if .Values.metrics.serviceMonitor.jobLabel }} - jobLabel: {{ .Values.metrics.serviceMonitor.jobLabel }} - {{- end }} - selector: - {{- $svcLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.metrics.serviceMonitor.selector .Values.commonLabels ) "context" . ) }} - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $svcLabels "context" $ ) | nindent 6 }} - app.kubernetes.io/component: metrics-read - endpoints: - - port: http-metrics - {{- if .Values.metrics.serviceMonitor.interval }} - interval: {{ .Values.metrics.serviceMonitor.interval }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.relabelings }} - relabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.relabelings "context" $) | nindent 6 }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.metricRelabelings }} - metricRelabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.metricRelabelings "context" $) | nindent 6 }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.honorLabels }} - honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }} - {{- end }} - namespaceSelector: - matchNames: - - {{ .Release.Namespace | quote }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/statefulset.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/statefulset.yaml deleted file mode 100644 index f11ae0a89..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/statefulset.yaml +++ /dev/null @@ -1,553 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if eq .Values.architecture "replication" }} -{{- $customUser := include "postgresql.v1.username" . }} -apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }} -kind: StatefulSet -metadata: - name: {{ include "postgresql.v1.readReplica.fullname" . }} - namespace: {{ .Release.Namespace | quote }} - {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.labels .Values.commonLabels ) "context" . ) }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: read - {{- if or .Values.commonAnnotations .Values.readReplicas.annotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.annotations .Values.commonAnnotations ) "context" . ) }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.readReplicas.replicaCount }} - serviceName: {{ include "postgresql.v1.readReplica.svc.headless" . }} - {{- if .Values.readReplicas.updateStrategy }} - updateStrategy: {{- toYaml .Values.readReplicas.updateStrategy | nindent 4 }} - {{- end }} - {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.podLabels .Values.commonLabels ) "context" . ) }} - selector: - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }} - app.kubernetes.io/component: read - template: - metadata: - name: {{ include "postgresql.v1.readReplica.fullname" . }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $podLabels "context" $ ) | nindent 8 }} - app.kubernetes.io/component: read - {{- if or (include "postgresql.v1.readReplicas.createExtendedConfigmap" .) .Values.readReplicas.podAnnotations }} - annotations: - {{- if (include "postgresql.v1.readReplicas.createExtendedConfigmap" .) }} - checksum/extended-configuration: {{ pick (include (print $.Template.BasePath "/primary/extended-configmap.yaml") . | fromYaml) "data" | toYaml | sha256sum }} - {{- end }} - {{- if .Values.readReplicas.podAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.readReplicas.podAnnotations "context" $ ) | nindent 8 }} - {{- end }} - {{- end }} - spec: - {{- if .Values.readReplicas.extraPodSpec }} - {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.extraPodSpec "context" $) | nindent 6 }} - {{- end }} - serviceAccountName: {{ include "postgresql.v1.serviceAccountName" . }} - {{- include "postgresql.v1.imagePullSecrets" . | nindent 6 }} - automountServiceAccountToken: {{ .Values.readReplicas.automountServiceAccountToken }} - {{- if .Values.readReplicas.hostAliases }} - hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.hostAliases "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.readReplicas.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.affinity "context" $) | nindent 8 }} - {{- else }} - affinity: - podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.readReplicas.podAffinityPreset "component" "read" "customLabels" $podLabels "context" $) | nindent 10 }} - podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.readReplicas.podAntiAffinityPreset "component" "read" "customLabels" $podLabels "context" $) | nindent 10 }} - nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.readReplicas.nodeAffinityPreset.type "key" .Values.readReplicas.nodeAffinityPreset.key "values" .Values.readReplicas.nodeAffinityPreset.values) | nindent 10 }} - {{- end }} - {{- if .Values.readReplicas.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.readReplicas.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.readReplicas.topologySpreadConstraints }} - topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.topologySpreadConstraints "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.readReplicas.priorityClassName }} - priorityClassName: {{ .Values.readReplicas.priorityClassName }} - {{- end }} - {{- if .Values.readReplicas.schedulerName }} - schedulerName: {{ .Values.readReplicas.schedulerName | quote }} - {{- end }} - {{- if .Values.readReplicas.terminationGracePeriodSeconds }} - terminationGracePeriodSeconds: {{ .Values.readReplicas.terminationGracePeriodSeconds }} - {{- end }} - {{- if .Values.readReplicas.podSecurityContext.enabled }} - securityContext: {{- omit .Values.readReplicas.podSecurityContext "enabled" | toYaml | nindent 8 }} - {{- end }} - hostNetwork: {{ .Values.readReplicas.hostNetwork }} - hostIPC: {{ .Values.readReplicas.hostIPC }} - {{- if or (and .Values.tls.enabled (not .Values.volumePermissions.enabled)) (and .Values.volumePermissions.enabled (or .Values.readReplicas.persistence.enabled .Values.shmVolume.enabled)) .Values.readReplicas.initContainers }} - initContainers: - {{- if and .Values.tls.enabled (not .Values.volumePermissions.enabled) }} - - name: copy-certs - image: {{ include "postgresql.v1.volumePermissions.image" . }} - imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }} - {{- if .Values.readReplicas.resources }} - resources: {{- toYaml .Values.readReplicas.resources | nindent 12 }} - {{- end }} - # We don't require a privileged container in this case - {{- if .Values.readReplicas.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.readReplicas.containerSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - command: - - /bin/sh - - -ec - - | - cp /tmp/certs/* /opt/bitnami/postgresql/certs/ - chmod 600 {{ include "postgresql.v1.tlsCertKey" . }} - volumeMounts: - - name: raw-certificates - mountPath: /tmp/certs - - name: postgresql-certificates - mountPath: /opt/bitnami/postgresql/certs - {{- else if and .Values.volumePermissions.enabled (or .Values.readReplicas.persistence.enabled .Values.shmVolume.enabled) }} - - name: init-chmod-data - image: {{ include "postgresql.v1.volumePermissions.image" . }} - imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }} - {{- if .Values.readReplicas.resources }} - resources: {{- toYaml .Values.readReplicas.resources | nindent 12 }} - {{- end }} - command: - - /bin/sh - - -ec - - | - {{- if .Values.readReplicas.persistence.enabled }} - {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} - chown `id -u`:`id -G | cut -d " " -f2` {{ .Values.readReplicas.persistence.mountPath }} - {{- else }} - chown {{ .Values.readReplicas.containerSecurityContext.runAsUser }}:{{ .Values.readReplicas.podSecurityContext.fsGroup }} {{ .Values.readReplicas.persistence.mountPath }} - {{- end }} - mkdir -p {{ .Values.readReplicas.persistence.mountPath }}/data {{- if (include "postgresql.v1.mountConfigurationCM" .) }} {{ .Values.readReplicas.persistence.mountPath }}/conf {{- end }} - chmod 700 {{ .Values.readReplicas.persistence.mountPath }}/data {{- if (include "postgresql.v1.mountConfigurationCM" .) }} {{ .Values.readReplicas.persistence.mountPath }}/conf {{- end }} - find {{ .Values.readReplicas.persistence.mountPath }} -mindepth 1 -maxdepth 1 {{- if not (include "postgresql.v1.mountConfigurationCM" .) }} -not -name "conf" {{- end }} -not -name ".snapshot" -not -name "lost+found" | \ - {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} - xargs -r chown -R `id -u`:`id -G | cut -d " " -f2` - {{- else }} - xargs -r chown -R {{ .Values.readReplicas.containerSecurityContext.runAsUser }}:{{ .Values.readReplicas.podSecurityContext.fsGroup }} - {{- end }} - {{- end }} - {{- if .Values.shmVolume.enabled }} - chmod -R 777 /dev/shm - {{- end }} - {{- if .Values.tls.enabled }} - cp /tmp/certs/* /opt/bitnami/postgresql/certs/ - {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} - chown -R `id -u`:`id -G | cut -d " " -f2` /opt/bitnami/postgresql/certs/ - {{- else }} - chown -R {{ .Values.readReplicas.containerSecurityContext.runAsUser }}:{{ .Values.readReplicas.podSecurityContext.fsGroup }} /opt/bitnami/postgresql/certs/ - {{- end }} - chmod 600 {{ include "postgresql.v1.tlsCertKey" . }} - {{- end }} - {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} - securityContext: {{- omit .Values.volumePermissions.containerSecurityContext "runAsUser" | toYaml | nindent 12 }} - {{- else }} - securityContext: {{- .Values.volumePermissions.containerSecurityContext | toYaml | nindent 12 }} - {{- end }} - volumeMounts: - {{ if .Values.readReplicas.persistence.enabled }} - - name: data - mountPath: {{ .Values.readReplicas.persistence.mountPath }} - {{- if .Values.readReplicas.persistence.subPath }} - subPath: {{ .Values.readReplicas.persistence.subPath }} - {{- end }} - {{- end }} - {{- if .Values.shmVolume.enabled }} - - name: dshm - mountPath: /dev/shm - {{- end }} - {{- if .Values.tls.enabled }} - - name: raw-certificates - mountPath: /tmp/certs - - name: postgresql-certificates - mountPath: /opt/bitnami/postgresql/certs - {{- end }} - {{- end }} - {{- if .Values.readReplicas.initContainers }} - {{- include "common.tplvalues.render" ( dict "value" .Values.readReplicas.initContainers "context" $ ) | nindent 8 }} - {{- end }} - {{- end }} - containers: - - name: postgresql - image: {{ include "postgresql.v1.image" . }} - imagePullPolicy: {{ .Values.image.pullPolicy | quote }} - {{- if .Values.readReplicas.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.readReplicas.containerSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} - {{- else if .Values.readReplicas.command }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.command "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} - {{- else if .Values.readReplicas.args }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.args "context" $) | nindent 12 }} - {{- end }} - env: - - name: BITNAMI_DEBUG - value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }} - - name: POSTGRESQL_PORT_NUMBER - value: {{ .Values.containerPorts.postgresql | quote }} - - name: POSTGRESQL_VOLUME_DIR - value: {{ .Values.readReplicas.persistence.mountPath | quote }} - {{- if .Values.readReplicas.persistence.mountPath }} - - name: PGDATA - value: {{ .Values.postgresqlDataDir | quote }} - {{- end }} - # Authentication - {{- if or (eq $customUser "postgres") (empty $customUser) }} - {{- if .Values.auth.enablePostgresUser }} - {{- if .Values.auth.usePasswordFiles }} - - name: POSTGRES_PASSWORD_FILE - value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.adminPasswordKey" .) }} - {{- else }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "postgresql.v1.secretName" . }} - key: {{ include "postgresql.v1.adminPasswordKey" . }} - {{- end }} - {{- else }} - - name: ALLOW_EMPTY_PASSWORD - value: "true" - {{- end }} - {{- else }} - - name: POSTGRES_USER - value: {{ $customUser | quote }} - {{- if .Values.auth.usePasswordFiles }} - - name: POSTGRES_PASSWORD_FILE - value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.userPasswordKey" .) }} - {{- else }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "postgresql.v1.secretName" . }} - key: {{ include "postgresql.v1.userPasswordKey" . }} - {{- end }} - {{- if .Values.auth.enablePostgresUser }} - {{- if .Values.auth.usePasswordFiles }} - - name: POSTGRES_POSTGRES_PASSWORD_FILE - value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.adminPasswordKey" .) }} - {{- else }} - - name: POSTGRES_POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "postgresql.v1.secretName" . }} - key: {{ include "postgresql.v1.adminPasswordKey" . }} - {{- end }} - {{- end }} - {{- end }} - # Replication - - name: POSTGRES_REPLICATION_MODE - value: "slave" - - name: POSTGRES_REPLICATION_USER - value: {{ .Values.auth.replicationUsername | quote }} - {{- if .Values.auth.usePasswordFiles }} - - name: POSTGRES_REPLICATION_PASSWORD_FILE - value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.replicationPasswordKey" .) }} - {{- else }} - - name: POSTGRES_REPLICATION_PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "postgresql.v1.secretName" . }} - key: {{ include "postgresql.v1.replicationPasswordKey" . }} - {{- end }} - - name: POSTGRES_CLUSTER_APP_NAME - value: {{ .Values.replication.applicationName }} - - name: POSTGRES_MASTER_HOST - value: {{ include "postgresql.v1.primary.fullname" . }} - - name: POSTGRES_MASTER_PORT_NUMBER - value: {{ include "postgresql.v1.service.port" . | quote }} - # TLS - - name: POSTGRESQL_ENABLE_TLS - value: {{ ternary "yes" "no" .Values.tls.enabled | quote }} - {{- if .Values.tls.enabled }} - - name: POSTGRESQL_TLS_PREFER_SERVER_CIPHERS - value: {{ ternary "yes" "no" .Values.tls.preferServerCiphers | quote }} - - name: POSTGRESQL_TLS_CERT_FILE - value: {{ include "postgresql.v1.tlsCert" . }} - - name: POSTGRESQL_TLS_KEY_FILE - value: {{ include "postgresql.v1.tlsCertKey" . }} - {{- if .Values.tls.certCAFilename }} - - name: POSTGRESQL_TLS_CA_FILE - value: {{ include "postgresql.v1.tlsCACert" . }} - {{- end }} - {{- if .Values.tls.crlFilename }} - - name: POSTGRESQL_TLS_CRL_FILE - value: {{ include "postgresql.v1.tlsCRL" . }} - {{- end }} - {{- end }} - # Audit - - name: POSTGRESQL_LOG_HOSTNAME - value: {{ .Values.audit.logHostname | quote }} - - name: POSTGRESQL_LOG_CONNECTIONS - value: {{ .Values.audit.logConnections | quote }} - - name: POSTGRESQL_LOG_DISCONNECTIONS - value: {{ .Values.audit.logDisconnections | quote }} - {{- if .Values.audit.logLinePrefix }} - - name: POSTGRESQL_LOG_LINE_PREFIX - value: {{ .Values.audit.logLinePrefix | quote }} - {{- end }} - {{- if .Values.audit.logTimezone }} - - name: POSTGRESQL_LOG_TIMEZONE - value: {{ .Values.audit.logTimezone | quote }} - {{- end }} - {{- if .Values.audit.pgAuditLog }} - - name: POSTGRESQL_PGAUDIT_LOG - value: {{ .Values.audit.pgAuditLog | quote }} - {{- end }} - - name: POSTGRESQL_PGAUDIT_LOG_CATALOG - value: {{ .Values.audit.pgAuditLogCatalog | quote }} - # Others - - name: POSTGRESQL_CLIENT_MIN_MESSAGES - value: {{ .Values.audit.clientMinMessages | quote }} - - name: POSTGRESQL_SHARED_PRELOAD_LIBRARIES - value: {{ .Values.postgresqlSharedPreloadLibraries | quote }} - {{- if .Values.readReplicas.extraEnvVars }} - {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.extraEnvVars "context" $) | nindent 12 }} - {{- end }} - {{- if or .Values.readReplicas.extraEnvVarsCM .Values.readReplicas.extraEnvVarsSecret }} - envFrom: - {{- if .Values.readReplicas.extraEnvVarsCM }} - - configMapRef: - name: {{ .Values.readReplicas.extraEnvVarsCM }} - {{- end }} - {{- if .Values.readReplicas.extraEnvVarsSecret }} - - secretRef: - name: {{ .Values.readReplicas.extraEnvVarsSecret }} - {{- end }} - {{- end }} - ports: - - name: tcp-postgresql - containerPort: {{ .Values.containerPorts.postgresql }} - {{- if not .Values.diagnosticMode.enabled }} - {{- if .Values.readReplicas.customStartupProbe }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.customStartupProbe "context" $) | nindent 12 }} - {{- else if .Values.readReplicas.startupProbe.enabled }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.readReplicas.startupProbe "enabled") "context" $) | nindent 12 }} - exec: - command: - - /bin/sh - - -c - {{- if (include "postgresql.v1.database" .) }} - - exec pg_isready -U {{ default "postgres" $customUser| quote }} -d "dbname={{ include "postgresql.v1.database" . }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}{{- end }}" -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} - {{- else }} - - exec pg_isready -U {{ default "postgres" $customUser | quote }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} -d "sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}"{{- end }} -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} - {{- end }} - {{- end }} - {{- if .Values.readReplicas.customLivenessProbe }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.customLivenessProbe "context" $) | nindent 12 }} - {{- else if .Values.readReplicas.livenessProbe.enabled }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.readReplicas.livenessProbe "enabled") "context" $) | nindent 12 }} - exec: - command: - - /bin/sh - - -c - {{- if (include "postgresql.v1.database" .) }} - - exec pg_isready -U {{ default "postgres" $customUser | quote }} -d "dbname={{ include "postgresql.v1.database" . }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}{{- end }}" -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} - {{- else }} - - exec pg_isready -U {{default "postgres" $customUser | quote }} {{- if and .Values.tls.enabled .Values.tls.certCAFilename }} -d "sslcert={{ include "postgresql.v1.tlsCert" . }} sslkey={{ include "postgresql.v1.tlsCertKey" . }}"{{- end }} -h 127.0.0.1 -p {{ .Values.containerPorts.postgresql }} - {{- end }} - {{- end }} - {{- if .Values.readReplicas.customReadinessProbe }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.customReadinessProbe "context" $) | nindent 12 }} - {{- else if .Values.readReplicas.readinessProbe.enabled }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.readReplicas.readinessProbe "enabled") "context" $) | nindent 12 }} - exec: - command: - - /bin/sh - - -c - - -e - {{- include "postgresql.v1.readinessProbeCommand" . | nindent 16 }} - {{- end }} - {{- end }} - {{- if .Values.readReplicas.resources }} - resources: {{- toYaml .Values.readReplicas.resources | nindent 12 }} - {{- end }} - {{- if .Values.readReplicas.lifecycleHooks }} - lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.lifecycleHooks "context" $) | nindent 12 }} - {{- end }} - volumeMounts: - {{- if .Values.auth.usePasswordFiles }} - - name: postgresql-password - mountPath: /opt/bitnami/postgresql/secrets/ - {{- end }} - {{- if .Values.readReplicas.extendedConfiguration }} - - name: postgresql-extended-config - mountPath: {{ .Values.readReplicas.persistence.mountPath }}/conf/conf.d/ - {{- end }} - {{- if .Values.tls.enabled }} - - name: postgresql-certificates - mountPath: /opt/bitnami/postgresql/certs - readOnly: true - {{- end }} - {{- if .Values.shmVolume.enabled }} - - name: dshm - mountPath: /dev/shm - {{- end }} - {{- if .Values.readReplicas.persistence.enabled }} - - name: data - mountPath: {{ .Values.readReplicas.persistence.mountPath }} - {{- if .Values.readReplicas.persistence.subPath }} - subPath: {{ .Values.readReplicas.persistence.subPath }} - {{- end }} - {{- end }} - {{- if .Values.readReplicas.extraVolumeMounts }} - {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.extraVolumeMounts "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.metrics.enabled }} - - name: metrics - image: {{ include "postgresql.v1.metrics.image" . }} - imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }} - {{- if .Values.metrics.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.metrics.containerSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} - {{- else if .Values.metrics.customMetrics }} - args: [ "--extend.query-path", "/conf/custom-metrics.yaml" ] - {{- end }} - env: - {{- $database := required "In order to enable metrics you need to specify a database (.Values.auth.database or .Values.global.postgresql.auth.database)" (include "postgresql.v1.database" .) }} - - name: DATA_SOURCE_URI - value: {{ printf "127.0.0.1:%d/%s?sslmode=disable" (int (include "postgresql.v1.service.port" .)) $database }} - {{- if .Values.auth.usePasswordFiles }} - - name: DATA_SOURCE_PASS_FILE - value: {{ printf "/opt/bitnami/postgresql/secrets/%s" (include "postgresql.v1.userPasswordKey" .) }} - {{- else }} - - name: DATA_SOURCE_PASS - valueFrom: - secretKeyRef: - name: {{ include "postgresql.v1.secretName" . }} - key: {{ include "postgresql.v1.userPasswordKey" . }} - {{- end }} - - name: DATA_SOURCE_USER - value: {{ default "postgres" $customUser | quote }} - {{- if .Values.metrics.extraEnvVars }} - {{- include "common.tplvalues.render" (dict "value" .Values.metrics.extraEnvVars "context" $) | nindent 12 }} - {{- end }} - ports: - - name: http-metrics - containerPort: {{ .Values.metrics.containerPorts.metrics }} - {{- if not .Values.diagnosticMode.enabled }} - {{- if .Values.metrics.customStartupProbe }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customStartupProbe "context" $) | nindent 12 }} - {{- else if .Values.metrics.startupProbe.enabled }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.startupProbe "enabled") "context" $) | nindent 12 }} - tcpSocket: - port: http-metrics - {{- end }} - {{- if .Values.metrics.customLivenessProbe }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customLivenessProbe "context" $) | nindent 12 }} - {{- else if .Values.metrics.livenessProbe.enabled }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.livenessProbe "enabled") "context" $) | nindent 12 }} - httpGet: - path: / - port: http-metrics - {{- end }} - {{- if .Values.metrics.customReadinessProbe }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customReadinessProbe "context" $) | nindent 12 }} - {{- else if .Values.metrics.readinessProbe.enabled }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.readinessProbe "enabled") "context" $) | nindent 12 }} - httpGet: - path: / - port: http-metrics - {{- end }} - {{- end }} - volumeMounts: - {{- if .Values.auth.usePasswordFiles }} - - name: postgresql-password - mountPath: /opt/bitnami/postgresql/secrets/ - {{- end }} - {{- if .Values.metrics.customMetrics }} - - name: custom-metrics - mountPath: /conf - readOnly: true - {{- end }} - {{- if .Values.metrics.resources }} - resources: {{- toYaml .Values.metrics.resources | nindent 12 }} - {{- end }} - {{- end }} - {{- if .Values.readReplicas.sidecars }} - {{- include "common.tplvalues.render" ( dict "value" .Values.readReplicas.sidecars "context" $ ) | nindent 8 }} - {{- end }} - volumes: - {{- if .Values.readReplicas.extendedConfiguration }} - - name: postgresql-extended-config - configMap: - name: {{ include "postgresql.v1.readReplicas.extendedConfigmapName" . }} - {{- end }} - {{- if .Values.auth.usePasswordFiles }} - - name: postgresql-password - secret: - secretName: {{ include "postgresql.v1.secretName" . }} - {{- end }} - {{- if .Values.tls.enabled }} - - name: raw-certificates - secret: - secretName: {{ include "postgresql.v1.tlsSecretName" . }} - - name: postgresql-certificates - emptyDir: {} - {{- end }} - {{- if and .Values.metrics.enabled .Values.metrics.customMetrics }} - - name: custom-metrics - configMap: - name: {{ printf "%s-metrics" (include "postgresql.v1.readReplica.fullname" .) }} - {{- end }} - {{- if .Values.shmVolume.enabled }} - - name: dshm - emptyDir: - medium: Memory - {{- if .Values.shmVolume.sizeLimit }} - sizeLimit: {{ .Values.shmVolume.sizeLimit }} - {{- end }} - {{- end }} - {{- if .Values.readReplicas.extraVolumes }} - {{- include "common.tplvalues.render" ( dict "value" .Values.readReplicas.extraVolumes "context" $ ) | nindent 8 }} - {{- end }} - {{- if and .Values.readReplicas.persistence.enabled .Values.readReplicas.persistence.existingClaim }} - - name: data - persistentVolumeClaim: - claimName: {{ tpl .Values.readReplicas.persistence.existingClaim $ }} - {{- else if not .Values.readReplicas.persistence.enabled }} - - name: data - emptyDir: {} - {{- else }} - {{- if .Values.readReplicas.persistentVolumeClaimRetentionPolicy.enabled }} - persistentVolumeClaimRetentionPolicy: - whenDeleted: {{ .Values.readReplicas.persistentVolumeClaimRetentionPolicy.whenDeleted }} - whenScaled: {{ .Values.readReplicas.persistentVolumeClaimRetentionPolicy.whenScaled }} - {{- end }} - volumeClaimTemplates: - - metadata: - name: data - {{- if .Values.readReplicas.persistence.annotations }} - annotations: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.persistence.annotations "context" $) | nindent 10 }} - {{- end }} - {{- if .Values.readReplicas.persistence.labels }} - labels: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.persistence.labels "context" $) | nindent 10 }} - {{- end }} - spec: - accessModes: - {{- range .Values.readReplicas.persistence.accessModes }} - - {{ . | quote }} - {{- end }} - {{- if .Values.readReplicas.persistence.dataSource }} - dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.persistence.dataSource "context" $) | nindent 10 }} - {{- end }} - resources: - requests: - storage: {{ .Values.readReplicas.persistence.size | quote }} - {{- if .Values.readReplicas.persistence.selector }} - selector: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.persistence.selector "context" $) | nindent 10 }} - {{- end -}} - {{- include "common.storage.class" (dict "persistence" .Values.readReplicas.persistence "global" .Values.global) | nindent 8 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/svc-headless.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/svc-headless.yaml deleted file mode 100644 index 249af5f4a..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/svc-headless.yaml +++ /dev/null @@ -1,38 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if eq .Values.architecture "replication" }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "postgresql.v1.readReplica.svc.headless" . }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: read - annotations: - {{- if or .Values.readReplicas.service.headless.annotations .Values.commonAnnotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.service.headless.annotations .Values.commonAnnotations ) "context" . ) }} - {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} - # Use this annotation in addition to the actual publishNotReadyAddresses - # field below because the annotation will stop being respected soon but the - # field is broken in some versions of Kubernetes: - # https://github.com/kubernetes/kubernetes/issues/58662 - service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" -spec: - type: ClusterIP - clusterIP: None - # We want all pods in the StatefulSet to have their addresses published for - # the sake of the other Postgresql pods even before they're ready, since they - # have to be able to talk to each other in order to become ready. - publishNotReadyAddresses: true - ports: - - name: tcp-postgresql - port: {{ include "postgresql.v1.readReplica.service.port" . }} - targetPort: tcp-postgresql - {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.podLabels .Values.commonLabels ) "context" . ) }} - selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: read -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/svc.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/read/svc.yaml deleted file mode 100644 index d92c52340..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/read/svc.yaml +++ /dev/null @@ -1,53 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if eq .Values.architecture "replication" }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "postgresql.v1.readReplica.fullname" . }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: read - {{- if or .Values.commonAnnotations .Values.readReplicas.service.annotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.service.annotations .Values.commonAnnotations ) "context" . ) }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} -spec: - type: {{ .Values.readReplicas.service.type }} - {{- if or (eq .Values.readReplicas.service.type "LoadBalancer") (eq .Values.readReplicas.service.type "NodePort") }} - externalTrafficPolicy: {{ .Values.readReplicas.service.externalTrafficPolicy | quote }} - {{- end }} - {{- if and (eq .Values.readReplicas.service.type "LoadBalancer") (not (empty .Values.readReplicas.service.loadBalancerSourceRanges)) }} - loadBalancerSourceRanges: {{ .Values.readReplicas.service.loadBalancerSourceRanges }} - {{- end }} - {{- if and (eq .Values.readReplicas.service.type "LoadBalancer") (not (empty .Values.readReplicas.service.loadBalancerIP)) }} - loadBalancerIP: {{ .Values.readReplicas.service.loadBalancerIP }} - {{- end }} - {{- if and .Values.readReplicas.service.clusterIP (eq .Values.readReplicas.service.type "ClusterIP") }} - clusterIP: {{ .Values.readReplicas.service.clusterIP }} - {{- end }} - {{- if .Values.readReplicas.service.sessionAffinity }} - sessionAffinity: {{ .Values.readReplicas.service.sessionAffinity }} - {{- end }} - {{- if .Values.readReplicas.service.sessionAffinityConfig }} - sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.service.sessionAffinityConfig "context" $) | nindent 4 }} - {{- end }} - ports: - - name: tcp-postgresql - port: {{ include "postgresql.v1.readReplica.service.port" . }} - targetPort: tcp-postgresql - {{- if and (or (eq .Values.readReplicas.service.type "NodePort") (eq .Values.readReplicas.service.type "LoadBalancer")) (not (empty .Values.readReplicas.service.nodePorts.postgresql)) }} - nodePort: {{ .Values.readReplicas.service.nodePorts.postgresql }} - {{- else if eq .Values.readReplicas.service.type "ClusterIP" }} - nodePort: null - {{- end }} - {{- if .Values.readReplicas.service.extraPorts }} - {{- include "common.tplvalues.render" (dict "value" .Values.readReplicas.service.extraPorts "context" $) | nindent 4 }} - {{- end }} - {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.readReplicas.podLabels .Values.commonLabels ) "context" . ) }} - selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: read -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/role.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/role.yaml deleted file mode 100644 index 0ae728a7e..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/role.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if .Values.rbac.create }} -kind: Role -apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }} -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -# yamllint disable rule:indentation -rules: - {{- if and (include "common.capabilities.psp.supported" .) .Values.psp.create }} - - apiGroups: - - 'policy' - resources: - - 'podsecuritypolicies' - verbs: - - 'use' - resourceNames: - - {{ include "common.names.fullname" . }} - {{- end }} - {{- if .Values.rbac.rules }} - {{- include "common.tplvalues.render" ( dict "value" .Values.rbac.rules "context" $ ) | nindent 2 }} - {{- end }} -# yamllint enable rule:indentation -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/rolebinding.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/rolebinding.yaml deleted file mode 100644 index 04323a0c4..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/rolebinding.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if .Values.rbac.create }} -kind: RoleBinding -apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }} -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -roleRef: - kind: Role - name: {{ include "common.names.fullname" . }} - apiGroup: rbac.authorization.k8s.io -subjects: - - kind: ServiceAccount - name: {{ include "postgresql.v1.serviceAccountName" . }} - namespace: {{ .Release.Namespace | quote }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/secrets.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/secrets.yaml deleted file mode 100644 index b4267ab64..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/secrets.yaml +++ /dev/null @@ -1,99 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- $host := include "postgresql.v1.primary.fullname" . }} -{{- $port := include "postgresql.v1.service.port" . }} -{{- $customUser := include "postgresql.v1.username" . }} -{{- $postgresPassword := include "common.secrets.lookup" (dict "secret" (include "postgresql.v1.secretName" .) "key" (coalesce .Values.global.postgresql.auth.secretKeys.adminPasswordKey .Values.auth.secretKeys.adminPasswordKey) "defaultValue" (ternary (coalesce .Values.global.postgresql.auth.password .Values.auth.password .Values.global.postgresql.auth.postgresPassword .Values.auth.postgresPassword) (coalesce .Values.global.postgresql.auth.postgresPassword .Values.auth.postgresPassword) (or (empty $customUser) (eq $customUser "postgres"))) "context" $) | trimAll "\"" | b64dec }} -{{- if and (not $postgresPassword) .Values.auth.enablePostgresUser }} -{{- $postgresPassword = randAlphaNum 10 }} -{{- end }} -{{- $replicationPassword := "" }} -{{- if eq .Values.architecture "replication" }} -{{- $replicationPassword = include "common.secrets.passwords.manage" (dict "secret" (include "postgresql.v1.secretName" .) "key" (coalesce .Values.global.postgresql.auth.secretKeys.replicationPasswordKey .Values.auth.secretKeys.replicationPasswordKey) "providedValues" (list "auth.replicationPassword") "context" $) | trimAll "\"" | b64dec }} -{{- end }} -{{- $ldapPassword := "" }} -{{- if and .Values.ldap.enabled (or .Values.ldap.bind_password .Values.ldap.bindpw) }} -{{- $ldapPassword = coalesce .Values.ldap.bind_password .Values.ldap.bindpw }} -{{- end }} -{{- $password := "" }} -{{- if and (not (empty $customUser)) (ne $customUser "postgres") }} -{{- $password = include "common.secrets.passwords.manage" (dict "secret" (include "postgresql.v1.secretName" .) "key" (coalesce .Values.global.postgresql.auth.secretKeys.userPasswordKey .Values.auth.secretKeys.userPasswordKey) "providedValues" (list "global.postgresql.auth.password" "auth.password") "context" $) | trimAll "\"" | b64dec }} -{{- end }} -{{- $database := include "postgresql.v1.database" . }} -{{- if (include "postgresql.v1.createSecret" .) }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -type: Opaque -data: - {{- if $postgresPassword }} - postgres-password: {{ $postgresPassword | b64enc | quote }} - {{- end }} - {{- if $password }} - password: {{ $password | b64enc | quote }} - {{- end }} - {{- if $replicationPassword }} - replication-password: {{ $replicationPassword | b64enc | quote }} - {{- end }} - # We don't auto-generate LDAP password when it's not provided as we do for other passwords - {{- if and .Values.ldap.enabled (or .Values.ldap.bind_password .Values.ldap.bindpw) }} - ldap-password: {{ $ldapPassword | b64enc | quote }} - {{- end }} -{{- end }} -{{- if .Values.serviceBindings.enabled }} -{{- if $postgresPassword }} ---- -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "common.names.fullname" . }}-svcbind-postgres - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -type: servicebinding.io/postgresql -data: - provider: {{ print "bitnami" | b64enc | quote }} - type: {{ print "postgresql" | b64enc | quote }} - host: {{ $host | b64enc | quote }} - port: {{ $port | b64enc | quote }} - username: {{ print "postgres" | b64enc | quote }} - database: {{ print "postgres" | b64enc | quote }} - password: {{ $postgresPassword | b64enc | quote }} - uri: {{ printf "postgresql://postgres:%s@%s:%s/postgres" $postgresPassword $host $port | b64enc | quote }} -{{- end }} -{{- if $password }} ---- -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "common.names.fullname" . }}-svcbind-custom-user - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -type: servicebinding.io/postgresql -data: - provider: {{ print "bitnami" | b64enc | quote }} - type: {{ print "postgresql" | b64enc | quote }} - host: {{ $host | b64enc | quote }} - port: {{ $port | b64enc | quote }} - username: {{ $customUser | b64enc | quote }} - password: {{ $password | b64enc | quote }} - {{- if $database }} - database: {{ $database | b64enc | quote }} - {{- end }} - uri: {{ printf "postgresql://%s:%s@%s:%s/%s" $customUser $password $host $port $database | b64enc | quote }} -{{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/serviceaccount.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/serviceaccount.yaml deleted file mode 100644 index 8886bffc0..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/serviceaccount.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if .Values.serviceAccount.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "postgresql.v1.serviceAccountName" . }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if or .Values.serviceAccount.annotations .Values.commonAnnotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.serviceAccount.annotations .Values.commonAnnotations ) "context" . ) }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} -automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/templates/tls-secrets.yaml b/thunder_deployment/infra/beta9/charts/postgresql/templates/tls-secrets.yaml deleted file mode 100644 index 7e44a437c..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/templates/tls-secrets.yaml +++ /dev/null @@ -1,30 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if (include "postgresql.v1.createTlsSecret" . ) }} -{{- $secretName := printf "%s-crt" (include "common.names.fullname" .) }} -{{- $ca := genCA "postgresql-ca" 365 }} -{{- $fullname := include "common.names.fullname" . }} -{{- $releaseNamespace := .Release.Namespace }} -{{- $clusterDomain := .Values.clusterDomain }} -{{- $primaryHeadlessServiceName := include "postgresql.v1.primary.svc.headless" . }} -{{- $readHeadlessServiceName := include "postgresql.v1.readReplica.svc.headless" . }} -{{- $altNames := list (printf "*.%s.%s.svc.%s" $fullname $releaseNamespace $clusterDomain) (printf "%s.%s.svc.%s" $fullname $releaseNamespace $clusterDomain) (printf "*.%s.%s.svc.%s" $primaryHeadlessServiceName $releaseNamespace $clusterDomain) (printf "%s.%s.svc.%s" $primaryHeadlessServiceName $releaseNamespace $clusterDomain) (printf "*.%s.%s.svc.%s" $readHeadlessServiceName $releaseNamespace $clusterDomain) (printf "%s.%s.svc.%s" $readHeadlessServiceName $releaseNamespace $clusterDomain) $fullname }} -{{- $cert := genSignedCert $fullname nil $altNames 365 $ca }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ $secretName }} - namespace: {{ .Release.Namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -type: kubernetes.io/tls -data: - tls.crt: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "tls.crt" "defaultValue" $cert.Cert "context" $) }} - tls.key: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "tls.key" "defaultValue" $cert.Key "context" $) }} - ca.crt: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "ca.crt" "defaultValue" $ca.Cert "context" $) }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/values.schema.json b/thunder_deployment/infra/beta9/charts/postgresql/values.schema.json deleted file mode 100644 index fc41483cd..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/values.schema.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema#", - "type": "object", - "properties": { - "architecture": { - "type": "string", - "title": "PostgreSQL architecture", - "form": true, - "description": "Allowed values: `standalone` or `replication`" - }, - "auth": { - "type": "object", - "title": "Authentication configuration", - "form": true, - "properties": { - "enablePostgresUser": { - "type": "boolean", - "title": "Enable \"postgres\" admin user", - "description": "Assign a password to the \"postgres\" admin user. Otherwise, remote access will be blocked for this user", - "form": true - }, - "postgresPassword": { - "type": "string", - "title": "Password for the \"postgres\" admin user", - "description": "Defaults to a random 10-character alphanumeric string if not set", - "form": true - }, - "database": { - "type": "string", - "title": "PostgreSQL custom database", - "description": "Name of the custom database to be created during the 1st initialization of PostgreSQL", - "form": true - }, - "username": { - "type": "string", - "title": "PostgreSQL custom user", - "description": "Name of the custom user to be created during the 1st initialization of PostgreSQL. This user only has permissions on the PostgreSQL custom database", - "form": true - }, - "password": { - "type": "string", - "title": "Password for the custom user to create", - "description": "Defaults to a random 10-character alphanumeric string if not set", - "form": true - }, - "replicationUsername": { - "type": "string", - "title": "PostgreSQL replication user", - "description": "Name of user used to manage replication.", - "form": true, - "hidden": { - "value": "standalone", - "path": "architecture" - } - }, - "replicationPassword": { - "type": "string", - "title": "Password for PostgreSQL replication user", - "description": "Defaults to a random 10-character alphanumeric string if not set", - "form": true, - "hidden": { - "value": "standalone", - "path": "architecture" - } - } - } - }, - "persistence": { - "type": "object", - "properties": { - "size": { - "type": "string", - "title": "Persistent Volume Size", - "form": true, - "render": "slider", - "sliderMin": 1, - "sliderMax": 100, - "sliderUnit": "Gi" - } - } - }, - "resources": { - "type": "object", - "title": "Required Resources", - "description": "Configure resource requests", - "form": true, - "properties": { - "requests": { - "type": "object", - "properties": { - "memory": { - "type": "string", - "form": true, - "render": "slider", - "title": "Memory Request", - "sliderMin": 10, - "sliderMax": 2048, - "sliderUnit": "Mi" - }, - "cpu": { - "type": "string", - "form": true, - "render": "slider", - "title": "CPU Request", - "sliderMin": 10, - "sliderMax": 2000, - "sliderUnit": "m" - } - } - } - } - }, - "replication": { - "type": "object", - "form": true, - "title": "Replication Details", - "properties": { - "enabled": { - "type": "boolean", - "title": "Enable Replication", - "form": true - }, - "readReplicas": { - "type": "integer", - "title": "read Replicas", - "form": true, - "hidden": { - "value": "standalone", - "path": "architecture" - } - } - } - }, - "volumePermissions": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "form": true, - "title": "Enable Init Containers", - "description": "Change the owner of the persist volume mountpoint to RunAsUser:fsGroup" - } - } - }, - "metrics": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "title": "Configure metrics exporter", - "form": true - } - } - } - } -} diff --git a/thunder_deployment/infra/beta9/charts/postgresql/values.yaml b/thunder_deployment/infra/beta9/charts/postgresql/values.yaml deleted file mode 100644 index afedc769b..000000000 --- a/thunder_deployment/infra/beta9/charts/postgresql/values.yaml +++ /dev/null @@ -1,1647 +0,0 @@ -# Copyright VMware, Inc. -# SPDX-License-Identifier: APACHE-2.0 - -## @section Global parameters -## Please, note that this will override the parameters, including dependencies, configured to use the global value -## -global: - ## @param global.imageRegistry Global Docker image registry - ## - imageRegistry: "" - ## @param global.imagePullSecrets Global Docker registry secret names as an array - ## e.g. - ## imagePullSecrets: - ## - myRegistryKeySecretName - ## - imagePullSecrets: [] - ## @param global.storageClass Global StorageClass for Persistent Volume(s) - ## - storageClass: "" - postgresql: - ## @param global.postgresql.auth.postgresPassword Password for the "postgres" admin user (overrides `auth.postgresPassword`) - ## @param global.postgresql.auth.username Name for a custom user to create (overrides `auth.username`) - ## @param global.postgresql.auth.password Password for the custom user to create (overrides `auth.password`) - ## @param global.postgresql.auth.database Name for a custom database to create (overrides `auth.database`) - ## @param global.postgresql.auth.existingSecret Name of existing secret to use for PostgreSQL credentials (overrides `auth.existingSecret`). - ## @param global.postgresql.auth.secretKeys.adminPasswordKey Name of key in existing secret to use for PostgreSQL credentials (overrides `auth.secretKeys.adminPasswordKey`). Only used when `global.postgresql.auth.existingSecret` is set. - ## @param global.postgresql.auth.secretKeys.userPasswordKey Name of key in existing secret to use for PostgreSQL credentials (overrides `auth.secretKeys.userPasswordKey`). Only used when `global.postgresql.auth.existingSecret` is set. - ## @param global.postgresql.auth.secretKeys.replicationPasswordKey Name of key in existing secret to use for PostgreSQL credentials (overrides `auth.secretKeys.replicationPasswordKey`). Only used when `global.postgresql.auth.existingSecret` is set. - ## - auth: - postgresPassword: "" - username: "" - password: "" - database: "" - existingSecret: "" - secretKeys: - adminPasswordKey: "" - userPasswordKey: "" - replicationPasswordKey: "" - ## @param global.postgresql.service.ports.postgresql PostgreSQL service port (overrides `service.ports.postgresql`) - ## - service: - ports: - postgresql: "" - -## @section Common parameters -## - -## @param kubeVersion Override Kubernetes version -## -kubeVersion: "" -## @param nameOverride String to partially override common.names.fullname template (will maintain the release name) -## -nameOverride: "" -## @param fullnameOverride String to fully override common.names.fullname template -## -fullnameOverride: "" -## @param clusterDomain Kubernetes Cluster Domain -## -clusterDomain: cluster.local -## @param extraDeploy Array of extra objects to deploy with the release (evaluated as a template) -## -extraDeploy: [] -## @param commonLabels Add labels to all the deployed resources -## -commonLabels: {} -## @param commonAnnotations Add annotations to all the deployed resources -## -commonAnnotations: {} -## Enable diagnostic mode in the statefulset -## -diagnosticMode: - ## @param diagnosticMode.enabled Enable diagnostic mode (all probes will be disabled and the command will be overridden) - ## - enabled: false - ## @param diagnosticMode.command Command to override all containers in the statefulset - ## - command: - - sleep - ## @param diagnosticMode.args Args to override all containers in the statefulset - ## - args: - - infinity - -## @section PostgreSQL common parameters -## - -## Bitnami PostgreSQL image version -## ref: https://hub.docker.com/r/bitnami/postgresql/tags/ -## @param image.registry [default: REGISTRY_NAME] PostgreSQL image registry -## @param image.repository [default: REPOSITORY_NAME/postgresql] PostgreSQL image repository -## @skip image.tag PostgreSQL image tag (immutable tags are recommended) -## @param image.digest PostgreSQL image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag -## @param image.pullPolicy PostgreSQL image pull policy -## @param image.pullSecrets Specify image pull secrets -## @param image.debug Specify if debug values should be set -## -image: - registry: docker.io - repository: bitnami/postgresql - tag: 16.1.0-debian-11-r24 - digest: "" - ## Specify a imagePullPolicy - ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' - ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images - ## - pullPolicy: IfNotPresent - ## Optionally specify an array of imagePullSecrets. - ## Secrets must be manually created in the namespace. - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - ## Example: - ## pullSecrets: - ## - myRegistryKeySecretName - ## - pullSecrets: [] - ## Set to true if you would like to see extra information on logs - ## - debug: false -## Authentication parameters -## ref: https://github.com/bitnami/containers/tree/main/bitnami/postgresql#setting-the-root-password-on-first-run -## ref: https://github.com/bitnami/containers/tree/main/bitnami/postgresql#creating-a-database-on-first-run -## ref: https://github.com/bitnami/containers/tree/main/bitnami/postgresql#creating-a-database-user-on-first-run -## -auth: - ## @param auth.enablePostgresUser Assign a password to the "postgres" admin user. Otherwise, remote access will be blocked for this user - ## - enablePostgresUser: true - ## @param auth.postgresPassword Password for the "postgres" admin user. Ignored if `auth.existingSecret` is provided - ## - postgresPassword: "" - ## @param auth.username Name for a custom user to create - ## - username: "" - ## @param auth.password Password for the custom user to create. Ignored if `auth.existingSecret` is provided - ## - password: "" - ## @param auth.database Name for a custom database to create - ## - database: "" - ## @param auth.replicationUsername Name of the replication user - ## - replicationUsername: repl_user - ## @param auth.replicationPassword Password for the replication user. Ignored if `auth.existingSecret` is provided - ## - replicationPassword: "" - ## @param auth.existingSecret Name of existing secret to use for PostgreSQL credentials. `auth.postgresPassword`, `auth.password`, and `auth.replicationPassword` will be ignored and picked up from this secret. The secret might also contains the key `ldap-password` if LDAP is enabled. `ldap.bind_password` will be ignored and picked from this secret in this case. - ## - existingSecret: "" - ## @param auth.secretKeys.adminPasswordKey Name of key in existing secret to use for PostgreSQL credentials. Only used when `auth.existingSecret` is set. - ## @param auth.secretKeys.userPasswordKey Name of key in existing secret to use for PostgreSQL credentials. Only used when `auth.existingSecret` is set. - ## @param auth.secretKeys.replicationPasswordKey Name of key in existing secret to use for PostgreSQL credentials. Only used when `auth.existingSecret` is set. - ## - secretKeys: - adminPasswordKey: postgres-password - userPasswordKey: password - replicationPasswordKey: replication-password - ## @param auth.usePasswordFiles Mount credentials as a files instead of using an environment variable - ## - usePasswordFiles: false -## @param architecture PostgreSQL architecture (`standalone` or `replication`) -## -architecture: standalone -## Replication configuration -## Ignored if `architecture` is `standalone` -## -replication: - ## @param replication.synchronousCommit Set synchronous commit mode. Allowed values: `on`, `remote_apply`, `remote_write`, `local` and `off` - ## @param replication.numSynchronousReplicas Number of replicas that will have synchronous replication. Note: Cannot be greater than `readReplicas.replicaCount`. - ## ref: https://www.postgresql.org/docs/current/runtime-config-wal.html#GUC-SYNCHRONOUS-COMMIT - ## - synchronousCommit: "off" - numSynchronousReplicas: 0 - ## @param replication.applicationName Cluster application name. Useful for advanced replication settings - ## - applicationName: my_application -## @param containerPorts.postgresql PostgreSQL container port -## -containerPorts: - postgresql: 5432 -## Audit settings -## https://github.com/bitnami/containers/tree/main/bitnami/postgresql#auditing -## @param audit.logHostname Log client hostnames -## @param audit.logConnections Add client log-in operations to the log file -## @param audit.logDisconnections Add client log-outs operations to the log file -## @param audit.pgAuditLog Add operations to log using the pgAudit extension -## @param audit.pgAuditLogCatalog Log catalog using pgAudit -## @param audit.clientMinMessages Message log level to share with the user -## @param audit.logLinePrefix Template for log line prefix (default if not set) -## @param audit.logTimezone Timezone for the log timestamps -## -audit: - logHostname: false - logConnections: false - logDisconnections: false - pgAuditLog: "" - pgAuditLogCatalog: "off" - clientMinMessages: error - logLinePrefix: "" - logTimezone: "" -## LDAP configuration -## @param ldap.enabled Enable LDAP support -## DEPRECATED ldap.url It will removed in a future, please use 'ldap.uri' instead -## @param ldap.server IP address or name of the LDAP server. -## @param ldap.port Port number on the LDAP server to connect to -## @param ldap.prefix String to prepend to the user name when forming the DN to bind -## @param ldap.suffix String to append to the user name when forming the DN to bind -## DEPRECATED ldap.baseDN It will removed in a future, please use 'ldap.basedn' instead -## DEPRECATED ldap.bindDN It will removed in a future, please use 'ldap.binddn' instead -## DEPRECATED ldap.bind_password It will removed in a future, please use 'ldap.bindpw' instead -## @param ldap.basedn Root DN to begin the search for the user in -## @param ldap.binddn DN of user to bind to LDAP -## @param ldap.bindpw Password for the user to bind to LDAP -## DEPRECATED ldap.search_attr It will removed in a future, please use 'ldap.searchAttribute' instead -## DEPRECATED ldap.search_filter It will removed in a future, please use 'ldap.searchFilter' instead -## @param ldap.searchAttribute Attribute to match against the user name in the search -## @param ldap.searchFilter The search filter to use when doing search+bind authentication -## @param ldap.scheme Set to `ldaps` to use LDAPS -## DEPRECATED ldap.tls as string is deprecated,please use 'ldap.tls.enabled' instead -## @param ldap.tls.enabled Se to true to enable TLS encryption -## -ldap: - enabled: false - server: "" - port: "" - prefix: "" - suffix: "" - basedn: "" - binddn: "" - bindpw: "" - searchAttribute: "" - searchFilter: "" - scheme: "" - tls: - enabled: false - ## @param ldap.uri LDAP URL beginning in the form `ldap[s]://host[:port]/basedn`. If provided, all the other LDAP parameters will be ignored. - ## Ref: https://www.postgresql.org/docs/current/auth-ldap.html - ## - uri: "" -## @param postgresqlDataDir PostgreSQL data dir folder -## -postgresqlDataDir: /bitnami/postgresql/data -## @param postgresqlSharedPreloadLibraries Shared preload libraries (comma-separated list) -## -postgresqlSharedPreloadLibraries: "pgaudit" -## Start PostgreSQL pod(s) without limitations on shm memory. -## By default docker and containerd (and possibly other container runtimes) limit `/dev/shm` to `64M` -## ref: https://github.com/docker-library/postgres/issues/416 -## ref: https://github.com/containerd/containerd/issues/3654 -## -shmVolume: - ## @param shmVolume.enabled Enable emptyDir volume for /dev/shm for PostgreSQL pod(s) - ## - enabled: true - ## @param shmVolume.sizeLimit Set this to enable a size limit on the shm tmpfs - ## Note: the size of the tmpfs counts against container's memory limit - ## e.g: - ## sizeLimit: 1Gi - ## - sizeLimit: "" -## TLS configuration -## -tls: - ## @param tls.enabled Enable TLS traffic support - ## - enabled: false - ## @param tls.autoGenerated Generate automatically self-signed TLS certificates - ## - autoGenerated: false - ## @param tls.preferServerCiphers Whether to use the server's TLS cipher preferences rather than the client's - ## - preferServerCiphers: true - ## @param tls.certificatesSecret Name of an existing secret that contains the certificates - ## - certificatesSecret: "" - ## @param tls.certFilename Certificate filename - ## - certFilename: "" - ## @param tls.certKeyFilename Certificate key filename - ## - certKeyFilename: "" - ## @param tls.certCAFilename CA Certificate filename - ## If provided, PostgreSQL will authenticate TLS/SSL clients by requesting them a certificate - ## ref: https://www.postgresql.org/docs/9.6/auth-methods.html - ## - certCAFilename: "" - ## @param tls.crlFilename File containing a Certificate Revocation List - ## - crlFilename: "" - -## @section PostgreSQL Primary parameters -## -primary: - ## @param primary.name Name of the primary database (eg primary, master, leader, ...) - ## - name: primary - ## @param primary.configuration PostgreSQL Primary main configuration to be injected as ConfigMap - ## ref: https://www.postgresql.org/docs/current/static/runtime-config.html - ## - configuration: "" - ## @param primary.pgHbaConfiguration PostgreSQL Primary client authentication configuration - ## ref: https://www.postgresql.org/docs/current/static/auth-pg-hba-conf.html - ## e.g:# - ## pgHbaConfiguration: |- - ## local all all trust - ## host all all localhost trust - ## host mydatabase mysuser 192.168.0.0/24 md5 - ## - pgHbaConfiguration: "" - ## @param primary.existingConfigmap Name of an existing ConfigMap with PostgreSQL Primary configuration - ## NOTE: `primary.configuration` and `primary.pgHbaConfiguration` will be ignored - ## - existingConfigmap: "" - ## @param primary.extendedConfiguration Extended PostgreSQL Primary configuration (appended to main or default configuration) - ## ref: https://github.com/bitnami/containers/tree/main/bitnami/postgresql#allow-settings-to-be-loaded-from-files-other-than-the-default-postgresqlconf - ## - extendedConfiguration: "" - ## @param primary.existingExtendedConfigmap Name of an existing ConfigMap with PostgreSQL Primary extended configuration - ## NOTE: `primary.extendedConfiguration` will be ignored - ## - existingExtendedConfigmap: "" - ## Initdb configuration - ## ref: https://github.com/bitnami/containers/tree/main/bitnami/postgresql#specifying-initdb-arguments - ## - initdb: - ## @param primary.initdb.args PostgreSQL initdb extra arguments - ## - args: "" - ## @param primary.initdb.postgresqlWalDir Specify a custom location for the PostgreSQL transaction log - ## - postgresqlWalDir: "" - ## @param primary.initdb.scripts Dictionary of initdb scripts - ## Specify dictionary of scripts to be run at first boot - ## e.g: - ## scripts: - ## my_init_script.sh: | - ## #!/bin/sh - ## echo "Do something." - ## - scripts: {} - ## @param primary.initdb.scriptsConfigMap ConfigMap with scripts to be run at first boot - ## NOTE: This will override `primary.initdb.scripts` - ## - scriptsConfigMap: "" - ## @param primary.initdb.scriptsSecret Secret with scripts to be run at first boot (in case it contains sensitive information) - ## NOTE: This can work along `primary.initdb.scripts` or `primary.initdb.scriptsConfigMap` - ## - scriptsSecret: "" - ## @param primary.initdb.user Specify the PostgreSQL username to execute the initdb scripts - ## - user: "" - ## @param primary.initdb.password Specify the PostgreSQL password to execute the initdb scripts - ## - password: "" - ## Configure current cluster's primary server to be the standby server in other cluster. - ## This will allow cross cluster replication and provide cross cluster high availability. - ## You will need to configure pgHbaConfiguration if you want to enable this feature with local cluster replication enabled. - ## @param primary.standby.enabled Whether to enable current cluster's primary as standby server of another cluster or not - ## @param primary.standby.primaryHost The Host of replication primary in the other cluster - ## @param primary.standby.primaryPort The Port of replication primary in the other cluster - ## - standby: - enabled: false - primaryHost: "" - primaryPort: "" - ## @param primary.extraEnvVars Array with extra environment variables to add to PostgreSQL Primary nodes - ## e.g: - ## extraEnvVars: - ## - name: FOO - ## value: "bar" - ## - extraEnvVars: [] - ## @param primary.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for PostgreSQL Primary nodes - ## - extraEnvVarsCM: "" - ## @param primary.extraEnvVarsSecret Name of existing Secret containing extra env vars for PostgreSQL Primary nodes - ## - extraEnvVarsSecret: "" - ## @param primary.command Override default container command (useful when using custom images) - ## - command: [] - ## @param primary.args Override default container args (useful when using custom images) - ## - args: [] - ## Configure extra options for PostgreSQL Primary containers' liveness, readiness and startup probes - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes - ## @param primary.livenessProbe.enabled Enable livenessProbe on PostgreSQL Primary containers - ## @param primary.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe - ## @param primary.livenessProbe.periodSeconds Period seconds for livenessProbe - ## @param primary.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe - ## @param primary.livenessProbe.failureThreshold Failure threshold for livenessProbe - ## @param primary.livenessProbe.successThreshold Success threshold for livenessProbe - ## - livenessProbe: - enabled: true - initialDelaySeconds: 30 - periodSeconds: 10 - timeoutSeconds: 5 - failureThreshold: 6 - successThreshold: 1 - ## @param primary.readinessProbe.enabled Enable readinessProbe on PostgreSQL Primary containers - ## @param primary.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe - ## @param primary.readinessProbe.periodSeconds Period seconds for readinessProbe - ## @param primary.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe - ## @param primary.readinessProbe.failureThreshold Failure threshold for readinessProbe - ## @param primary.readinessProbe.successThreshold Success threshold for readinessProbe - ## - readinessProbe: - enabled: true - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 5 - failureThreshold: 6 - successThreshold: 1 - ## @param primary.startupProbe.enabled Enable startupProbe on PostgreSQL Primary containers - ## @param primary.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe - ## @param primary.startupProbe.periodSeconds Period seconds for startupProbe - ## @param primary.startupProbe.timeoutSeconds Timeout seconds for startupProbe - ## @param primary.startupProbe.failureThreshold Failure threshold for startupProbe - ## @param primary.startupProbe.successThreshold Success threshold for startupProbe - ## - startupProbe: - enabled: false - initialDelaySeconds: 30 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 15 - successThreshold: 1 - ## @param primary.customLivenessProbe Custom livenessProbe that overrides the default one - ## - customLivenessProbe: {} - ## @param primary.customReadinessProbe Custom readinessProbe that overrides the default one - ## - customReadinessProbe: {} - ## @param primary.customStartupProbe Custom startupProbe that overrides the default one - ## - customStartupProbe: {} - ## @param primary.lifecycleHooks for the PostgreSQL Primary container to automate configuration before or after startup - ## - lifecycleHooks: {} - ## PostgreSQL Primary resource requests and limits - ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ - ## @param primary.resources.limits The resources limits for the PostgreSQL Primary containers - ## @param primary.resources.requests.memory The requested memory for the PostgreSQL Primary containers - ## @param primary.resources.requests.cpu The requested cpu for the PostgreSQL Primary containers - ## - resources: - limits: {} - requests: - memory: 256Mi - cpu: 250m - ## Pod Security Context - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ - ## @param primary.podSecurityContext.enabled Enable security context - ## @param primary.podSecurityContext.fsGroupChangePolicy Set filesystem group change policy - ## @param primary.podSecurityContext.sysctls Set kernel settings using the sysctl interface - ## @param primary.podSecurityContext.supplementalGroups Set filesystem extra groups - ## @param primary.podSecurityContext.fsGroup Group ID for the pod - ## - podSecurityContext: - enabled: true - fsGroupChangePolicy: Always - sysctls: [] - supplementalGroups: [] - fsGroup: 1001 - ## Container Security Context - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ - ## @param primary.containerSecurityContext.enabled Enabled containers' Security Context - ## @param primary.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container - ## @param primary.containerSecurityContext.runAsUser Set containers' Security Context runAsUser - ## @param primary.containerSecurityContext.runAsNonRoot Set container's Security Context runAsNonRoot - ## @param primary.containerSecurityContext.privileged Set container's Security Context privileged - ## @param primary.containerSecurityContext.readOnlyRootFilesystem Set container's Security Context readOnlyRootFilesystem - ## @param primary.containerSecurityContext.allowPrivilegeEscalation Set container's Security Context allowPrivilegeEscalation - ## @param primary.containerSecurityContext.capabilities.drop List of capabilities to be dropped - ## @param primary.containerSecurityContext.seccompProfile.type Set container's Security Context seccomp profile - ## - containerSecurityContext: - enabled: true - seLinuxOptions: null - runAsUser: 1001 - runAsNonRoot: true - privileged: false - readOnlyRootFilesystem: false - allowPrivilegeEscalation: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: "RuntimeDefault" - ## @param primary.automountServiceAccountToken Mount Service Account token in pod - ## - automountServiceAccountToken: false - ## @param primary.hostAliases PostgreSQL primary pods host aliases - ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ - ## - hostAliases: [] - ## @param primary.hostNetwork Specify if host network should be enabled for PostgreSQL pod (postgresql primary) - ## - hostNetwork: false - ## @param primary.hostIPC Specify if host IPC should be enabled for PostgreSQL pod (postgresql primary) - ## - hostIPC: false - ## @param primary.labels Map of labels to add to the statefulset (postgresql primary) - ## - labels: {} - ## @param primary.annotations Annotations for PostgreSQL primary pods - ## - annotations: {} - ## @param primary.podLabels Map of labels to add to the pods (postgresql primary) - ## - podLabels: {} - ## @param primary.podAnnotations Map of annotations to add to the pods (postgresql primary) - ## - podAnnotations: {} - ## @param primary.podAffinityPreset PostgreSQL primary pod affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` - ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity - ## - podAffinityPreset: "" - ## @param primary.podAntiAffinityPreset PostgreSQL primary pod anti-affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` - ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity - ## - podAntiAffinityPreset: soft - ## PostgreSQL Primary node affinity preset - ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity - ## - nodeAffinityPreset: - ## @param primary.nodeAffinityPreset.type PostgreSQL primary node affinity preset type. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` - ## - type: "" - ## @param primary.nodeAffinityPreset.key PostgreSQL primary node label key to match Ignored if `primary.affinity` is set. - ## E.g. - ## key: "kubernetes.io/e2e-az-name" - ## - key: "" - ## @param primary.nodeAffinityPreset.values PostgreSQL primary node label values to match. Ignored if `primary.affinity` is set. - ## E.g. - ## values: - ## - e2e-az1 - ## - e2e-az2 - ## - values: [] - ## @param primary.affinity Affinity for PostgreSQL primary pods assignment - ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity - ## Note: primary.podAffinityPreset, primary.podAntiAffinityPreset, and primary.nodeAffinityPreset will be ignored when it's set - ## - affinity: {} - ## @param primary.nodeSelector Node labels for PostgreSQL primary pods assignment - ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ - ## - nodeSelector: {} - ## @param primary.tolerations Tolerations for PostgreSQL primary pods assignment - ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - ## - tolerations: [] - ## @param primary.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template - ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods - ## - topologySpreadConstraints: [] - ## @param primary.priorityClassName Priority Class to use for each pod (postgresql primary) - ## - priorityClassName: "" - ## @param primary.schedulerName Use an alternate scheduler, e.g. "stork". - ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ - ## - schedulerName: "" - ## @param primary.terminationGracePeriodSeconds Seconds PostgreSQL primary pod needs to terminate gracefully - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods - ## - terminationGracePeriodSeconds: "" - ## @param primary.updateStrategy.type PostgreSQL Primary statefulset strategy type - ## @param primary.updateStrategy.rollingUpdate PostgreSQL Primary statefulset rolling update configuration parameters - ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies - ## - updateStrategy: - type: RollingUpdate - rollingUpdate: {} - ## @param primary.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the PostgreSQL Primary container(s) - ## - extraVolumeMounts: [] - ## @param primary.extraVolumes Optionally specify extra list of additional volumes for the PostgreSQL Primary pod(s) - ## - extraVolumes: [] - ## @param primary.sidecars Add additional sidecar containers to the PostgreSQL Primary pod(s) - ## For example: - ## sidecars: - ## - name: your-image-name - ## image: your-image - ## imagePullPolicy: Always - ## ports: - ## - name: portname - ## containerPort: 1234 - ## - sidecars: [] - ## @param primary.initContainers Add additional init containers to the PostgreSQL Primary pod(s) - ## Example - ## - ## initContainers: - ## - name: do-something - ## image: busybox - ## command: ['do', 'something'] - ## - initContainers: [] - ## @param primary.extraPodSpec Optionally specify extra PodSpec for the PostgreSQL Primary pod(s) - ## - extraPodSpec: {} - ## PostgreSQL Primary service configuration - ## - service: - ## @param primary.service.type Kubernetes Service type - ## - type: ClusterIP - ## @param primary.service.ports.postgresql PostgreSQL service port - ## - ports: - postgresql: 5432 - ## Node ports to expose - ## NOTE: choose port between <30000-32767> - ## @param primary.service.nodePorts.postgresql Node port for PostgreSQL - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport - ## - nodePorts: - postgresql: "" - ## @param primary.service.clusterIP Static clusterIP or None for headless services - ## e.g: - ## clusterIP: None - ## - clusterIP: "" - ## @param primary.service.annotations Annotations for PostgreSQL primary service - ## - annotations: {} - ## @param primary.service.loadBalancerIP Load balancer IP if service type is `LoadBalancer` - ## Set the LoadBalancer service type to internal only - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer - ## - loadBalancerIP: "" - ## @param primary.service.externalTrafficPolicy Enable client source IP preservation - ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip - ## - externalTrafficPolicy: Cluster - ## @param primary.service.loadBalancerSourceRanges Addresses that are allowed when service is LoadBalancer - ## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service - ## - ## loadBalancerSourceRanges: - ## - 10.10.10.0/24 - ## - loadBalancerSourceRanges: [] - ## @param primary.service.extraPorts Extra ports to expose in the PostgreSQL primary service - ## - extraPorts: [] - ## @param primary.service.sessionAffinity Session Affinity for Kubernetes service, can be "None" or "ClientIP" - ## If "ClientIP", consecutive client requests will be directed to the same Pod - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies - ## - sessionAffinity: None - ## @param primary.service.sessionAffinityConfig Additional settings for the sessionAffinity - ## sessionAffinityConfig: - ## clientIP: - ## timeoutSeconds: 300 - ## - sessionAffinityConfig: {} - ## Headless service properties - ## - headless: - ## @param primary.service.headless.annotations Additional custom annotations for headless PostgreSQL primary service - ## - annotations: {} - ## PostgreSQL Primary persistence configuration - ## - persistence: - ## @param primary.persistence.enabled Enable PostgreSQL Primary data persistence using PVC - ## - enabled: true - ## @param primary.persistence.existingClaim Name of an existing PVC to use - ## - existingClaim: "" - ## @param primary.persistence.mountPath The path the volume will be mounted at - ## Note: useful when using custom PostgreSQL images - ## - mountPath: /bitnami/postgresql - ## @param primary.persistence.subPath The subdirectory of the volume to mount to - ## Useful in dev environments and one PV for multiple services - ## - subPath: "" - ## @param primary.persistence.storageClass PVC Storage Class for PostgreSQL Primary data volume - ## If defined, storageClassName: - ## If set to "-", storageClassName: "", which disables dynamic provisioning - ## If undefined (the default) or set to null, no storageClassName spec is - ## set, choosing the default provisioner. (gp2 on AWS, standard on - ## GKE, AWS & OpenStack) - ## - storageClass: "" - ## @param primary.persistence.accessModes PVC Access Mode for PostgreSQL volume - ## - accessModes: - - ReadWriteOnce - ## @param primary.persistence.size PVC Storage Request for PostgreSQL volume - ## - size: 8Gi - ## @param primary.persistence.annotations Annotations for the PVC - ## - annotations: {} - ## @param primary.persistence.labels Labels for the PVC - ## - labels: {} - ## @param primary.persistence.selector Selector to match an existing Persistent Volume (this value is evaluated as a template) - ## selector: - ## matchLabels: - ## app: my-app - ## - selector: {} - ## @param primary.persistence.dataSource Custom PVC data source - ## - dataSource: {} - ## PostgreSQL Primary Persistent Volume Claim Retention Policy - ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention - ## - persistentVolumeClaimRetentionPolicy: - ## @param primary.persistentVolumeClaimRetentionPolicy.enabled Enable Persistent volume retention policy for Primary Statefulset - ## - enabled: false - ## @param primary.persistentVolumeClaimRetentionPolicy.whenScaled Volume retention behavior when the replica count of the StatefulSet is reduced - ## - whenScaled: Retain - ## @param primary.persistentVolumeClaimRetentionPolicy.whenDeleted Volume retention behavior that applies when the StatefulSet is deleted - ## - whenDeleted: Retain - -## @section PostgreSQL read only replica parameters (only used when `architecture` is set to `replication`) -## -readReplicas: - ## @param readReplicas.name Name of the read replicas database (eg secondary, slave, ...) - ## - name: read - ## @param readReplicas.replicaCount Number of PostgreSQL read only replicas - ## - replicaCount: 1 - ## @param readReplicas.extendedConfiguration Extended PostgreSQL read only replicas configuration (appended to main or default configuration) - ## ref: https://github.com/bitnami/containers/tree/main/bitnami/postgresql#allow-settings-to-be-loaded-from-files-other-than-the-default-postgresqlconf - ## - extendedConfiguration: "" - ## @param readReplicas.extraEnvVars Array with extra environment variables to add to PostgreSQL read only nodes - ## e.g: - ## extraEnvVars: - ## - name: FOO - ## value: "bar" - ## - extraEnvVars: [] - ## @param readReplicas.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for PostgreSQL read only nodes - ## - extraEnvVarsCM: "" - ## @param readReplicas.extraEnvVarsSecret Name of existing Secret containing extra env vars for PostgreSQL read only nodes - ## - extraEnvVarsSecret: "" - ## @param readReplicas.command Override default container command (useful when using custom images) - ## - command: [] - ## @param readReplicas.args Override default container args (useful when using custom images) - ## - args: [] - ## Configure extra options for PostgreSQL read only containers' liveness, readiness and startup probes - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes - ## @param readReplicas.livenessProbe.enabled Enable livenessProbe on PostgreSQL read only containers - ## @param readReplicas.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe - ## @param readReplicas.livenessProbe.periodSeconds Period seconds for livenessProbe - ## @param readReplicas.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe - ## @param readReplicas.livenessProbe.failureThreshold Failure threshold for livenessProbe - ## @param readReplicas.livenessProbe.successThreshold Success threshold for livenessProbe - ## - livenessProbe: - enabled: true - initialDelaySeconds: 30 - periodSeconds: 10 - timeoutSeconds: 5 - failureThreshold: 6 - successThreshold: 1 - ## @param readReplicas.readinessProbe.enabled Enable readinessProbe on PostgreSQL read only containers - ## @param readReplicas.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe - ## @param readReplicas.readinessProbe.periodSeconds Period seconds for readinessProbe - ## @param readReplicas.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe - ## @param readReplicas.readinessProbe.failureThreshold Failure threshold for readinessProbe - ## @param readReplicas.readinessProbe.successThreshold Success threshold for readinessProbe - ## - readinessProbe: - enabled: true - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 5 - failureThreshold: 6 - successThreshold: 1 - ## @param readReplicas.startupProbe.enabled Enable startupProbe on PostgreSQL read only containers - ## @param readReplicas.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe - ## @param readReplicas.startupProbe.periodSeconds Period seconds for startupProbe - ## @param readReplicas.startupProbe.timeoutSeconds Timeout seconds for startupProbe - ## @param readReplicas.startupProbe.failureThreshold Failure threshold for startupProbe - ## @param readReplicas.startupProbe.successThreshold Success threshold for startupProbe - ## - startupProbe: - enabled: false - initialDelaySeconds: 30 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 15 - successThreshold: 1 - ## @param readReplicas.customLivenessProbe Custom livenessProbe that overrides the default one - ## - customLivenessProbe: {} - ## @param readReplicas.customReadinessProbe Custom readinessProbe that overrides the default one - ## - customReadinessProbe: {} - ## @param readReplicas.customStartupProbe Custom startupProbe that overrides the default one - ## - customStartupProbe: {} - ## @param readReplicas.lifecycleHooks for the PostgreSQL read only container to automate configuration before or after startup - ## - lifecycleHooks: {} - ## PostgreSQL read only resource requests and limits - ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ - ## @param readReplicas.resources.limits The resources limits for the PostgreSQL read only containers - ## @param readReplicas.resources.requests.memory The requested memory for the PostgreSQL read only containers - ## @param readReplicas.resources.requests.cpu The requested cpu for the PostgreSQL read only containers - ## - resources: - limits: {} - requests: - memory: 256Mi - cpu: 250m - ## Pod Security Context - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ - ## @param readReplicas.podSecurityContext.enabled Enable security context - ## @param readReplicas.podSecurityContext.fsGroupChangePolicy Set filesystem group change policy - ## @param readReplicas.podSecurityContext.sysctls Set kernel settings using the sysctl interface - ## @param readReplicas.podSecurityContext.supplementalGroups Set filesystem extra groups - ## @param readReplicas.podSecurityContext.fsGroup Group ID for the pod - ## - podSecurityContext: - enabled: true - fsGroupChangePolicy: Always - sysctls: [] - supplementalGroups: [] - fsGroup: 1001 - ## Container Security Context - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ - ## @param readReplicas.containerSecurityContext.enabled Enabled containers' Security Context - ## @param readReplicas.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container - ## @param readReplicas.containerSecurityContext.runAsUser Set containers' Security Context runAsUser - ## @param readReplicas.containerSecurityContext.runAsNonRoot Set container's Security Context runAsNonRoot - ## @param readReplicas.containerSecurityContext.privileged Set container's Security Context privileged - ## @param readReplicas.containerSecurityContext.readOnlyRootFilesystem Set container's Security Context readOnlyRootFilesystem - ## @param readReplicas.containerSecurityContext.allowPrivilegeEscalation Set container's Security Context allowPrivilegeEscalation - ## @param readReplicas.containerSecurityContext.capabilities.drop List of capabilities to be dropped - ## @param readReplicas.containerSecurityContext.seccompProfile.type Set container's Security Context seccomp profile - ## - containerSecurityContext: - enabled: true - seLinuxOptions: null - runAsUser: 1001 - runAsNonRoot: true - privileged: false - readOnlyRootFilesystem: false - allowPrivilegeEscalation: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: "RuntimeDefault" - ## @param readReplicas.automountServiceAccountToken Mount Service Account token in pod - ## - automountServiceAccountToken: false - ## @param readReplicas.hostAliases PostgreSQL read only pods host aliases - ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ - ## - hostAliases: [] - ## @param readReplicas.hostNetwork Specify if host network should be enabled for PostgreSQL pod (PostgreSQL read only) - ## - hostNetwork: false - ## @param readReplicas.hostIPC Specify if host IPC should be enabled for PostgreSQL pod (postgresql primary) - ## - hostIPC: false - ## @param readReplicas.labels Map of labels to add to the statefulset (PostgreSQL read only) - ## - labels: {} - ## @param readReplicas.annotations Annotations for PostgreSQL read only pods - ## - annotations: {} - ## @param readReplicas.podLabels Map of labels to add to the pods (PostgreSQL read only) - ## - podLabels: {} - ## @param readReplicas.podAnnotations Map of annotations to add to the pods (PostgreSQL read only) - ## - podAnnotations: {} - ## @param readReplicas.podAffinityPreset PostgreSQL read only pod affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` - ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity - ## - podAffinityPreset: "" - ## @param readReplicas.podAntiAffinityPreset PostgreSQL read only pod anti-affinity preset. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` - ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity - ## - podAntiAffinityPreset: soft - ## PostgreSQL read only node affinity preset - ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity - ## - nodeAffinityPreset: - ## @param readReplicas.nodeAffinityPreset.type PostgreSQL read only node affinity preset type. Ignored if `primary.affinity` is set. Allowed values: `soft` or `hard` - ## - type: "" - ## @param readReplicas.nodeAffinityPreset.key PostgreSQL read only node label key to match Ignored if `primary.affinity` is set. - ## E.g. - ## key: "kubernetes.io/e2e-az-name" - ## - key: "" - ## @param readReplicas.nodeAffinityPreset.values PostgreSQL read only node label values to match. Ignored if `primary.affinity` is set. - ## E.g. - ## values: - ## - e2e-az1 - ## - e2e-az2 - ## - values: [] - ## @param readReplicas.affinity Affinity for PostgreSQL read only pods assignment - ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity - ## Note: primary.podAffinityPreset, primary.podAntiAffinityPreset, and primary.nodeAffinityPreset will be ignored when it's set - ## - affinity: {} - ## @param readReplicas.nodeSelector Node labels for PostgreSQL read only pods assignment - ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ - ## - nodeSelector: {} - ## @param readReplicas.tolerations Tolerations for PostgreSQL read only pods assignment - ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - ## - tolerations: [] - ## @param readReplicas.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template - ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods - ## - topologySpreadConstraints: [] - ## @param readReplicas.priorityClassName Priority Class to use for each pod (PostgreSQL read only) - ## - priorityClassName: "" - ## @param readReplicas.schedulerName Use an alternate scheduler, e.g. "stork". - ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ - ## - schedulerName: "" - ## @param readReplicas.terminationGracePeriodSeconds Seconds PostgreSQL read only pod needs to terminate gracefully - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods - ## - terminationGracePeriodSeconds: "" - ## @param readReplicas.updateStrategy.type PostgreSQL read only statefulset strategy type - ## @param readReplicas.updateStrategy.rollingUpdate PostgreSQL read only statefulset rolling update configuration parameters - ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies - ## - updateStrategy: - type: RollingUpdate - rollingUpdate: {} - ## @param readReplicas.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the PostgreSQL read only container(s) - ## - extraVolumeMounts: [] - ## @param readReplicas.extraVolumes Optionally specify extra list of additional volumes for the PostgreSQL read only pod(s) - ## - extraVolumes: [] - ## @param readReplicas.sidecars Add additional sidecar containers to the PostgreSQL read only pod(s) - ## For example: - ## sidecars: - ## - name: your-image-name - ## image: your-image - ## imagePullPolicy: Always - ## ports: - ## - name: portname - ## containerPort: 1234 - ## - sidecars: [] - ## @param readReplicas.initContainers Add additional init containers to the PostgreSQL read only pod(s) - ## Example - ## - ## initContainers: - ## - name: do-something - ## image: busybox - ## command: ['do', 'something'] - ## - initContainers: [] - ## @param readReplicas.extraPodSpec Optionally specify extra PodSpec for the PostgreSQL read only pod(s) - ## - extraPodSpec: {} - ## PostgreSQL read only service configuration - ## - service: - ## @param readReplicas.service.type Kubernetes Service type - ## - type: ClusterIP - ## @param readReplicas.service.ports.postgresql PostgreSQL service port - ## - ports: - postgresql: 5432 - ## Node ports to expose - ## NOTE: choose port between <30000-32767> - ## @param readReplicas.service.nodePorts.postgresql Node port for PostgreSQL - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport - ## - nodePorts: - postgresql: "" - ## @param readReplicas.service.clusterIP Static clusterIP or None for headless services - ## e.g: - ## clusterIP: None - ## - clusterIP: "" - ## @param readReplicas.service.annotations Annotations for PostgreSQL read only service - ## - annotations: {} - ## @param readReplicas.service.loadBalancerIP Load balancer IP if service type is `LoadBalancer` - ## Set the LoadBalancer service type to internal only - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer - ## - loadBalancerIP: "" - ## @param readReplicas.service.externalTrafficPolicy Enable client source IP preservation - ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip - ## - externalTrafficPolicy: Cluster - ## @param readReplicas.service.loadBalancerSourceRanges Addresses that are allowed when service is LoadBalancer - ## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service - ## - ## loadBalancerSourceRanges: - ## - 10.10.10.0/24 - ## - loadBalancerSourceRanges: [] - ## @param readReplicas.service.extraPorts Extra ports to expose in the PostgreSQL read only service - ## - extraPorts: [] - ## @param readReplicas.service.sessionAffinity Session Affinity for Kubernetes service, can be "None" or "ClientIP" - ## If "ClientIP", consecutive client requests will be directed to the same Pod - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies - ## - sessionAffinity: None - ## @param readReplicas.service.sessionAffinityConfig Additional settings for the sessionAffinity - ## sessionAffinityConfig: - ## clientIP: - ## timeoutSeconds: 300 - ## - sessionAffinityConfig: {} - ## Headless service properties - ## - headless: - ## @param readReplicas.service.headless.annotations Additional custom annotations for headless PostgreSQL read only service - ## - annotations: {} - ## PostgreSQL read only persistence configuration - ## - persistence: - ## @param readReplicas.persistence.enabled Enable PostgreSQL read only data persistence using PVC - ## - enabled: true - ## @param readReplicas.persistence.existingClaim Name of an existing PVC to use - ## - existingClaim: "" - ## @param readReplicas.persistence.mountPath The path the volume will be mounted at - ## Note: useful when using custom PostgreSQL images - ## - mountPath: /bitnami/postgresql - ## @param readReplicas.persistence.subPath The subdirectory of the volume to mount to - ## Useful in dev environments and one PV for multiple services - ## - subPath: "" - ## @param readReplicas.persistence.storageClass PVC Storage Class for PostgreSQL read only data volume - ## If defined, storageClassName: - ## If set to "-", storageClassName: "", which disables dynamic provisioning - ## If undefined (the default) or set to null, no storageClassName spec is - ## set, choosing the default provisioner. (gp2 on AWS, standard on - ## GKE, AWS & OpenStack) - ## - storageClass: "" - ## @param readReplicas.persistence.accessModes PVC Access Mode for PostgreSQL volume - ## - accessModes: - - ReadWriteOnce - ## @param readReplicas.persistence.size PVC Storage Request for PostgreSQL volume - ## - size: 8Gi - ## @param readReplicas.persistence.annotations Annotations for the PVC - ## - annotations: {} - ## @param readReplicas.persistence.labels Labels for the PVC - ## - labels: {} - ## @param readReplicas.persistence.selector Selector to match an existing Persistent Volume (this value is evaluated as a template) - ## selector: - ## matchLabels: - ## app: my-app - ## - selector: {} - ## @param readReplicas.persistence.dataSource Custom PVC data source - ## - dataSource: {} - ## PostgreSQL Read only Persistent Volume Claim Retention Policy - ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention - ## - persistentVolumeClaimRetentionPolicy: - ## @param readReplicas.persistentVolumeClaimRetentionPolicy.enabled Enable Persistent volume retention policy for read only Statefulset - ## - enabled: false - ## @param readReplicas.persistentVolumeClaimRetentionPolicy.whenScaled Volume retention behavior when the replica count of the StatefulSet is reduced - ## - whenScaled: Retain - ## @param readReplicas.persistentVolumeClaimRetentionPolicy.whenDeleted Volume retention behavior that applies when the StatefulSet is deleted - ## - whenDeleted: Retain - - -## @section Backup parameters -## This section implements a trivial logical dump cronjob of the database. -## This only comes with the consistency guarantees of the dump program. -## This is not a snapshot based roll forward/backward recovery backup. -## ref: https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/ -backup: - ## @param backup.enabled Enable the logical dump of the database "regularly" - enabled: false - cronjob: - ## @param backup.cronjob.schedule Set the cronjob parameter schedule - schedule: "@daily" - ## @param backup.cronjob.timeZone Set the cronjob parameter timeZone - timeZone: "" - ## @param backup.cronjob.concurrencyPolicy Set the cronjob parameter concurrencyPolicy - concurrencyPolicy: Allow - ## @param backup.cronjob.failedJobsHistoryLimit Set the cronjob parameter failedJobsHistoryLimit - failedJobsHistoryLimit: 1 - ## @param backup.cronjob.successfulJobsHistoryLimit Set the cronjob parameter successfulJobsHistoryLimit - successfulJobsHistoryLimit: 3 - ## @param backup.cronjob.startingDeadlineSeconds Set the cronjob parameter startingDeadlineSeconds - startingDeadlineSeconds: "" - ## @param backup.cronjob.ttlSecondsAfterFinished Set the cronjob parameter ttlSecondsAfterFinished - ttlSecondsAfterFinished: "" - ## @param backup.cronjob.restartPolicy Set the cronjob parameter restartPolicy - restartPolicy: OnFailure - ## @param backup.cronjob.podSecurityContext.enabled Enable PodSecurityContext for CronJob/Backup - ## @param backup.cronjob.podSecurityContext.fsGroupChangePolicy Set filesystem group change policy - ## @param backup.cronjob.podSecurityContext.sysctls Set kernel settings using the sysctl interface - ## @param backup.cronjob.podSecurityContext.supplementalGroups Set filesystem extra groups - ## @param backup.cronjob.podSecurityContext.fsGroup Group ID for the CronJob - podSecurityContext: - enabled: true - fsGroupChangePolicy: Always - sysctls: [] - supplementalGroups: [] - fsGroup: 1001 - ## backup container's Security Context - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container - ## @param backup.cronjob.containerSecurityContext.enabled Enabled containers' Security Context - ## @param backup.cronjob.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container - ## @param backup.cronjob.containerSecurityContext.runAsUser Set containers' Security Context runAsUser - ## @param backup.cronjob.containerSecurityContext.runAsNonRoot Set container's Security Context runAsNonRoot - ## @param backup.cronjob.containerSecurityContext.privileged Set container's Security Context privileged - ## @param backup.cronjob.containerSecurityContext.readOnlyRootFilesystem Set container's Security Context readOnlyRootFilesystem - ## @param backup.cronjob.containerSecurityContext.allowPrivilegeEscalation Set container's Security Context allowPrivilegeEscalation - ## @param backup.cronjob.containerSecurityContext.capabilities.drop List of capabilities to be dropped - ## @param backup.cronjob.containerSecurityContext.seccompProfile.type Set container's Security Context seccomp profile - containerSecurityContext: - enabled: true - seLinuxOptions: null - runAsUser: 1001 - runAsNonRoot: true - privileged: false - readOnlyRootFilesystem: false - allowPrivilegeEscalation: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: "RuntimeDefault" - ## @param backup.cronjob.command Set backup container's command to run - command: - - /bin/sh - - -c - - "pg_dumpall --clean --if-exists --load-via-partition-root --quote-all-identifiers --no-password --file=${PGDUMP_DIR}/pg_dumpall-$(date '+%Y-%m-%d-%H-%M').pgdump" - - ## @param backup.cronjob.labels Set the cronjob labels - labels: {} - ## @param backup.cronjob.annotations Set the cronjob annotations - annotations: {} - ## @param backup.cronjob.nodeSelector Node labels for PostgreSQL backup CronJob pod assignment - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes/ - ## - nodeSelector: {} - storage: - ## @param backup.cronjob.storage.existingClaim Provide an existing `PersistentVolumeClaim` (only when `architecture=standalone`) - ## If defined, PVC must be created manually before volume will be bound - ## - existingClaim: "" - ## @param backup.cronjob.storage.resourcePolicy Setting it to "keep" to avoid removing PVCs during a helm delete operation. Leaving it empty will delete PVCs after the chart deleted - ## - resourcePolicy: "" - ## @param backup.cronjob.storage.storageClass PVC Storage Class for the backup data volume - ## If defined, storageClassName: - ## If set to "-", storageClassName: "", which disables dynamic provisioning - ## If undefined (the default) or set to null, no storageClassName spec is - ## set, choosing the default provisioner. - ## - storageClass: "" - ## @param backup.cronjob.storage.accessModes PV Access Mode - ## - accessModes: - - ReadWriteOnce - ## @param backup.cronjob.storage.size PVC Storage Request for the backup data volume - ## - size: 8Gi - ## @param backup.cronjob.storage.annotations PVC annotations - ## - annotations: {} - ## @param backup.cronjob.storage.mountPath Path to mount the volume at - ## - mountPath: /backup/pgdump - ## @param backup.cronjob.storage.subPath Subdirectory of the volume to mount at - ## and one PV for multiple services. - ## - subPath: "" - ## Fine tuning for volumeClaimTemplates - ## - volumeClaimTemplates: - ## @param backup.cronjob.storage.volumeClaimTemplates.selector A label query over volumes to consider for binding (e.g. when using local volumes) - ## A label query over volumes to consider for binding (e.g. when using local volumes) - ## See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#labelselector-v1-meta for more details - ## - selector: {} - -## @section NetworkPolicy parameters -## - -## Add networkpolicies -## -networkPolicy: - ## @param networkPolicy.enabled Enable network policies - ## - enabled: false - ## @param networkPolicy.metrics.enabled Enable network policies for metrics (prometheus) - ## @param networkPolicy.metrics.namespaceSelector [object] Monitoring namespace selector labels. These labels will be used to identify the prometheus' namespace. - ## @param networkPolicy.metrics.podSelector [object] Monitoring pod selector labels. These labels will be used to identify the Prometheus pods. - ## - metrics: - enabled: false - ## e.g: - ## namespaceSelector: - ## label: monitoring - ## - namespaceSelector: {} - ## e.g: - ## podSelector: - ## label: monitoring - ## - podSelector: {} - ## Ingress Rules - ## - ingressRules: - ## @param networkPolicy.ingressRules.primaryAccessOnlyFrom.enabled Enable ingress rule that makes PostgreSQL primary node only accessible from a particular origin. - ## @param networkPolicy.ingressRules.primaryAccessOnlyFrom.namespaceSelector [object] Namespace selector label that is allowed to access the PostgreSQL primary node. This label will be used to identified the allowed namespace(s). - ## @param networkPolicy.ingressRules.primaryAccessOnlyFrom.podSelector [object] Pods selector label that is allowed to access the PostgreSQL primary node. This label will be used to identified the allowed pod(s). - ## @param networkPolicy.ingressRules.primaryAccessOnlyFrom.customRules Custom network policy for the PostgreSQL primary node. - ## - primaryAccessOnlyFrom: - enabled: false - ## e.g: - ## namespaceSelector: - ## label: ingress - ## - namespaceSelector: {} - ## e.g: - ## podSelector: - ## label: access - ## - podSelector: {} - ## custom ingress rules - ## e.g: - ## customRules: - ## - from: - ## - namespaceSelector: - ## matchLabels: - ## label: example - ## - customRules: [] - ## @param networkPolicy.ingressRules.readReplicasAccessOnlyFrom.enabled Enable ingress rule that makes PostgreSQL read-only nodes only accessible from a particular origin. - ## @param networkPolicy.ingressRules.readReplicasAccessOnlyFrom.namespaceSelector [object] Namespace selector label that is allowed to access the PostgreSQL read-only nodes. This label will be used to identified the allowed namespace(s). - ## @param networkPolicy.ingressRules.readReplicasAccessOnlyFrom.podSelector [object] Pods selector label that is allowed to access the PostgreSQL read-only nodes. This label will be used to identified the allowed pod(s). - ## @param networkPolicy.ingressRules.readReplicasAccessOnlyFrom.customRules Custom network policy for the PostgreSQL read-only nodes. - ## - readReplicasAccessOnlyFrom: - enabled: false - ## e.g: - ## namespaceSelector: - ## label: ingress - ## - namespaceSelector: {} - ## e.g: - ## podSelector: - ## label: access - ## - podSelector: {} - ## custom ingress rules - ## e.g: - ## CustomRules: - ## - from: - ## - namespaceSelector: - ## matchLabels: - ## label: example - ## - customRules: [] - ## @param networkPolicy.egressRules.denyConnectionsToExternal Enable egress rule that denies outgoing traffic outside the cluster, except for DNS (port 53). - ## @param networkPolicy.egressRules.customRules Custom network policy rule - ## - egressRules: - # Deny connections to external. This is not compatible with an external database. - denyConnectionsToExternal: false - ## Additional custom egress rules - ## e.g: - ## customRules: - ## - to: - ## - namespaceSelector: - ## matchLabels: - ## label: example - ## - customRules: [] - -## @section Volume Permissions parameters -## - -## Init containers parameters: -## volumePermissions: Change the owner and group of the persistent volume(s) mountpoint(s) to 'runAsUser:fsGroup' on each node -## -volumePermissions: - ## @param volumePermissions.enabled Enable init container that changes the owner and group of the persistent volume - ## - enabled: false - ## @param volumePermissions.image.registry [default: REGISTRY_NAME] Init container volume-permissions image registry - ## @param volumePermissions.image.repository [default: REPOSITORY_NAME/os-shell] Init container volume-permissions image repository - ## @skip volumePermissions.image.tag Init container volume-permissions image tag (immutable tags are recommended) - ## @param volumePermissions.image.digest Init container volume-permissions image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag - ## @param volumePermissions.image.pullPolicy Init container volume-permissions image pull policy - ## @param volumePermissions.image.pullSecrets Init container volume-permissions image pull secrets - ## - image: - registry: docker.io - repository: bitnami/os-shell - tag: 11-debian-11-r95 - digest: "" - pullPolicy: IfNotPresent - ## Optionally specify an array of imagePullSecrets. - ## Secrets must be manually created in the namespace. - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - ## Example: - ## pullSecrets: - ## - myRegistryKeySecretName - ## - pullSecrets: [] - ## Init container resource requests and limits - ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ - ## @param volumePermissions.resources.limits Init container volume-permissions resource limits - ## @param volumePermissions.resources.requests Init container volume-permissions resource requests - ## - resources: - limits: {} - requests: {} - ## Init container' Security Context - ## Note: the chown of the data folder is done to containerSecurityContext.runAsUser - ## and not the below volumePermissions.containerSecurityContext.runAsUser - ## @param volumePermissions.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container - ## @param volumePermissions.containerSecurityContext.runAsUser User ID for the init container - ## @param volumePermissions.containerSecurityContext.runAsGroup Group ID for the init container - ## @param volumePermissions.containerSecurityContext.runAsNonRoot runAsNonRoot for the init container - ## @param volumePermissions.containerSecurityContext.seccompProfile.type seccompProfile.type for the init container - ## - containerSecurityContext: - seLinuxOptions: null - runAsUser: 0 - runAsGroup: 0 - runAsNonRoot: false - seccompProfile: - type: RuntimeDefault -## @section Other Parameters -## - -## @param serviceBindings.enabled Create secret for service binding (Experimental) -## Ref: https://servicebinding.io/service-provider/ -## -serviceBindings: - enabled: false - -## Service account for PostgreSQL to use. -## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/ -## -serviceAccount: - ## @param serviceAccount.create Enable creation of ServiceAccount for PostgreSQL pod - ## - create: true - ## @param serviceAccount.name The name of the ServiceAccount to use. - ## If not set and create is true, a name is generated using the common.names.fullname template - ## - name: "" - ## @param serviceAccount.automountServiceAccountToken Allows auto mount of ServiceAccountToken on the serviceAccount created - ## Can be set to false if pods using this serviceAccount do not need to use K8s API - ## - automountServiceAccountToken: false - ## @param serviceAccount.annotations Additional custom annotations for the ServiceAccount - ## - annotations: {} -## Creates role for ServiceAccount -## @param rbac.create Create Role and RoleBinding (required for PSP to work) -## -rbac: - create: false - ## @param rbac.rules Custom RBAC rules to set - ## e.g: - ## rules: - ## - apiGroups: - ## - "" - ## resources: - ## - pods - ## verbs: - ## - get - ## - list - ## - rules: [] -## Pod Security Policy -## ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/ -## @param psp.create Whether to create a PodSecurityPolicy. WARNING: PodSecurityPolicy is deprecated in Kubernetes v1.21 or later, unavailable in v1.25 or later -## -psp: - create: false - -## @section Metrics Parameters -## - -metrics: - ## @param metrics.enabled Start a prometheus exporter - ## - enabled: false - ## @param metrics.image.registry [default: REGISTRY_NAME] PostgreSQL Prometheus Exporter image registry - ## @param metrics.image.repository [default: REPOSITORY_NAME/postgres-exporter] PostgreSQL Prometheus Exporter image repository - ## @skip metrics.image.tag PostgreSQL Prometheus Exporter image tag (immutable tags are recommended) - ## @param metrics.image.digest PostgreSQL image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag - ## @param metrics.image.pullPolicy PostgreSQL Prometheus Exporter image pull policy - ## @param metrics.image.pullSecrets Specify image pull secrets - ## - image: - registry: docker.io - repository: bitnami/postgres-exporter - tag: 0.15.0-debian-11-r6 - digest: "" - pullPolicy: IfNotPresent - ## Optionally specify an array of imagePullSecrets. - ## Secrets must be manually created in the namespace. - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - ## Example: - ## pullSecrets: - ## - myRegistryKeySecretName - ## - pullSecrets: [] - ## @param metrics.collectors Control enabled collectors - ## ref: https://github.com/prometheus-community/postgres_exporter#flags - ## Example: - ## collectors: - ## wal: false - collectors: {} - ## @param metrics.customMetrics Define additional custom metrics - ## ref: https://github.com/prometheus-community/postgres_exporter#adding-new-metrics-via-a-config-file-deprecated - ## customMetrics: - ## pg_database: - ## query: "SELECT d.datname AS name, CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT') THEN pg_catalog.pg_database_size(d.datname) ELSE 0 END AS size_bytes FROM pg_catalog.pg_database d where datname not in ('template0', 'template1', 'postgres')" - ## metrics: - ## - name: - ## usage: "LABEL" - ## description: "Name of the database" - ## - size_bytes: - ## usage: "GAUGE" - ## description: "Size of the database in bytes" - ## - customMetrics: {} - ## @param metrics.extraEnvVars Extra environment variables to add to PostgreSQL Prometheus exporter - ## see: https://github.com/prometheus-community/postgres_exporter#environment-variables - ## For example: - ## extraEnvVars: - ## - name: PG_EXPORTER_DISABLE_DEFAULT_METRICS - ## value: "true" - ## - extraEnvVars: [] - ## PostgreSQL Prometheus exporter containers' Security Context - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container - ## @param metrics.containerSecurityContext.enabled Enabled containers' Security Context - ## @param metrics.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container - ## @param metrics.containerSecurityContext.runAsUser Set containers' Security Context runAsUser - ## @param metrics.containerSecurityContext.runAsNonRoot Set container's Security Context runAsNonRoot - ## @param metrics.containerSecurityContext.privileged Set container's Security Context privileged - ## @param metrics.containerSecurityContext.readOnlyRootFilesystem Set container's Security Context readOnlyRootFilesystem - ## @param metrics.containerSecurityContext.allowPrivilegeEscalation Set container's Security Context allowPrivilegeEscalation - ## @param metrics.containerSecurityContext.capabilities.drop List of capabilities to be dropped - ## @param metrics.containerSecurityContext.seccompProfile.type Set container's Security Context seccomp profile - ## - containerSecurityContext: - enabled: true - seLinuxOptions: null - runAsUser: 1001 - runAsNonRoot: true - privileged: false - readOnlyRootFilesystem: false - allowPrivilegeEscalation: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: "RuntimeDefault" - ## Configure extra options for PostgreSQL Prometheus exporter containers' liveness, readiness and startup probes - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes - ## @param metrics.livenessProbe.enabled Enable livenessProbe on PostgreSQL Prometheus exporter containers - ## @param metrics.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe - ## @param metrics.livenessProbe.periodSeconds Period seconds for livenessProbe - ## @param metrics.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe - ## @param metrics.livenessProbe.failureThreshold Failure threshold for livenessProbe - ## @param metrics.livenessProbe.successThreshold Success threshold for livenessProbe - ## - livenessProbe: - enabled: true - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 5 - failureThreshold: 6 - successThreshold: 1 - ## @param metrics.readinessProbe.enabled Enable readinessProbe on PostgreSQL Prometheus exporter containers - ## @param metrics.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe - ## @param metrics.readinessProbe.periodSeconds Period seconds for readinessProbe - ## @param metrics.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe - ## @param metrics.readinessProbe.failureThreshold Failure threshold for readinessProbe - ## @param metrics.readinessProbe.successThreshold Success threshold for readinessProbe - ## - readinessProbe: - enabled: true - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 5 - failureThreshold: 6 - successThreshold: 1 - ## @param metrics.startupProbe.enabled Enable startupProbe on PostgreSQL Prometheus exporter containers - ## @param metrics.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe - ## @param metrics.startupProbe.periodSeconds Period seconds for startupProbe - ## @param metrics.startupProbe.timeoutSeconds Timeout seconds for startupProbe - ## @param metrics.startupProbe.failureThreshold Failure threshold for startupProbe - ## @param metrics.startupProbe.successThreshold Success threshold for startupProbe - ## - startupProbe: - enabled: false - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 15 - successThreshold: 1 - ## @param metrics.customLivenessProbe Custom livenessProbe that overrides the default one - ## - customLivenessProbe: {} - ## @param metrics.customReadinessProbe Custom readinessProbe that overrides the default one - ## - customReadinessProbe: {} - ## @param metrics.customStartupProbe Custom startupProbe that overrides the default one - ## - customStartupProbe: {} - ## @param metrics.containerPorts.metrics PostgreSQL Prometheus exporter metrics container port - ## - containerPorts: - metrics: 9187 - ## PostgreSQL Prometheus exporter resource requests and limits - ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ - ## @param metrics.resources.limits The resources limits for the PostgreSQL Prometheus exporter container - ## @param metrics.resources.requests The requested resources for the PostgreSQL Prometheus exporter container - ## - resources: - limits: {} - requests: {} - ## Service configuration - ## - service: - ## @param metrics.service.ports.metrics PostgreSQL Prometheus Exporter service port - ## - ports: - metrics: 9187 - ## @param metrics.service.clusterIP Static clusterIP or None for headless services - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#choosing-your-own-ip-address - ## - clusterIP: "" - ## @param metrics.service.sessionAffinity Control where client requests go, to the same pod or round-robin - ## Values: ClientIP or None - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/ - ## - sessionAffinity: None - ## @param metrics.service.annotations [object] Annotations for Prometheus to auto-discover the metrics endpoint - ## - annotations: - prometheus.io/scrape: "true" - prometheus.io/port: "{{ .Values.metrics.service.ports.metrics }}" - ## Prometheus Operator ServiceMonitor configuration - ## - serviceMonitor: - ## @param metrics.serviceMonitor.enabled Create ServiceMonitor Resource for scraping metrics using Prometheus Operator - ## - enabled: false - ## @param metrics.serviceMonitor.namespace Namespace for the ServiceMonitor Resource (defaults to the Release Namespace) - ## - namespace: "" - ## @param metrics.serviceMonitor.interval Interval at which metrics should be scraped. - ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint - ## - interval: "" - ## @param metrics.serviceMonitor.scrapeTimeout Timeout after which the scrape is ended - ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint - ## - scrapeTimeout: "" - ## @param metrics.serviceMonitor.labels Additional labels that can be used so ServiceMonitor will be discovered by Prometheus - ## - labels: {} - ## @param metrics.serviceMonitor.selector Prometheus instance selector labels - ## ref: https://github.com/bitnami/charts/tree/main/bitnami/prometheus-operator#prometheus-configuration - ## - selector: {} - ## @param metrics.serviceMonitor.relabelings RelabelConfigs to apply to samples before scraping - ## - relabelings: [] - ## @param metrics.serviceMonitor.metricRelabelings MetricRelabelConfigs to apply to samples before ingestion - ## - metricRelabelings: [] - ## @param metrics.serviceMonitor.honorLabels Specify honorLabels parameter to add the scrape endpoint - ## - honorLabels: false - ## @param metrics.serviceMonitor.jobLabel The name of the label on the target service to use as the job name in prometheus. - ## - jobLabel: "" - ## Custom PrometheusRule to be defined - ## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart - ## ref: https://github.com/coreos/prometheus-operator#customresourcedefinitions - ## - prometheusRule: - ## @param metrics.prometheusRule.enabled Create a PrometheusRule for Prometheus Operator - ## - enabled: false - ## @param metrics.prometheusRule.namespace Namespace for the PrometheusRule Resource (defaults to the Release Namespace) - ## - namespace: "" - ## @param metrics.prometheusRule.labels Additional labels that can be used so PrometheusRule will be discovered by Prometheus - ## - labels: {} - ## @param metrics.prometheusRule.rules PrometheusRule definitions - ## Make sure to constraint the rules to the current postgresql service. - ## rules: - ## - alert: HugeReplicationLag - ## expr: pg_replication_lag{service="{{ printf "%s-metrics" (include "common.names.fullname" .) }}"} / 3600 > 1 - ## for: 1m - ## labels: - ## severity: critical - ## annotations: - ## description: replication for {{ include "common.names.fullname" . }} PostgreSQL is lagging by {{ "{{ $value }}" }} hour(s). - ## summary: PostgreSQL replication is lagging by {{ "{{ $value }}" }} hour(s). - ## - rules: [] diff --git a/thunder_deployment/infra/beta9/charts/redis/.helmignore b/thunder_deployment/infra/beta9/charts/redis/.helmignore deleted file mode 100644 index fb56657ab..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj -# img folder -img/ diff --git a/thunder_deployment/infra/beta9/charts/redis/Chart.lock b/thunder_deployment/infra/beta9/charts/redis/Chart.lock deleted file mode 100644 index 01190b829..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: oci://registry-1.docker.io/bitnamicharts - version: 2.14.1 -digest: sha256:5ccbe5f1fe4459864a8c9d7329c400b678666b6cfb1450818a830bda81995bc3 -generated: "2023-12-19T19:11:00.40217662Z" diff --git a/thunder_deployment/infra/beta9/charts/redis/Chart.yaml b/thunder_deployment/infra/beta9/charts/redis/Chart.yaml deleted file mode 100644 index f3d0d1d1c..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/Chart.yaml +++ /dev/null @@ -1,36 +0,0 @@ -annotations: - category: Database - images: | - - name: os-shell - image: docker.io/bitnami/os-shell:11-debian-11-r94 - - name: redis-exporter - image: docker.io/bitnami/redis-exporter:1.56.0-debian-11-r1 - - name: redis-sentinel - image: docker.io/bitnami/redis-sentinel:7.2.4-debian-11-r3 - - name: redis - image: docker.io/bitnami/redis:7.2.4-debian-11-r2 - licenses: Apache-2.0 -apiVersion: v2 -appVersion: 7.2.4 -dependencies: -- name: common - repository: oci://registry-1.docker.io/bitnamicharts - tags: - - bitnami-common - version: 2.x.x -description: Redis(R) is an open source, advanced key-value store. It is often referred - to as a data structure server since keys can contain strings, hashes, lists, sets - and sorted sets. -home: https://bitnami.com -icon: https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png -keywords: -- redis -- keyvalue -- database -maintainers: -- name: VMware, Inc. - url: https://github.com/bitnami/charts -name: redis -sources: -- https://github.com/bitnami/charts/tree/main/bitnami/redis -version: 18.9.1 diff --git a/thunder_deployment/infra/beta9/charts/redis/README.md b/thunder_deployment/infra/beta9/charts/redis/README.md deleted file mode 100644 index 829954184..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/README.md +++ /dev/null @@ -1,1223 +0,0 @@ - - -# Bitnami package for Redis(R) - -Redis(R) is an open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets. - -[Overview of Redis®](http://redis.io) - -Disclaimer: Redis is a registered trademark of Redis Ltd. Any rights therein are reserved to Redis Ltd. Any use by Bitnami is for referential purposes only and does not indicate any sponsorship, endorsement, or affiliation between Redis Ltd. - -## TL;DR - -```console -helm install my-release oci://registry-1.docker.io/bitnamicharts/redis -``` - -Looking to use Redisreg; in production? Try [VMware Tanzu Application Catalog](https://bitnami.com/enterprise), the enterprise edition of Bitnami Application Catalog. - -## Introduction - -This chart bootstraps a [Redis®](https://github.com/bitnami/containers/tree/main/bitnami/redis) deployment on a [Kubernetes](https://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. - -Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. - -### Choose between Redis® Helm Chart and Redis® Cluster Helm Chart - -You can choose any of the two Redis® Helm charts for deploying a Redis® cluster. - -1. [Redis® Helm Chart](https://github.com/bitnami/charts/tree/main/bitnami/redis) will deploy a master-replica cluster, with the [option](https://github.com/bitnami/charts/tree/main/bitnami/redis#redis-sentinel-configuration-parameters) of enabling using Redis® Sentinel. -2. [Redis® Cluster Helm Chart](https://github.com/bitnami/charts/tree/main/bitnami/redis-cluster) will deploy a Redis® Cluster topology with sharding. - -The main features of each chart are the following: - -| Redis® | Redis® Cluster | -|--------------------------------------------------------|------------------------------------------------------------------------| -| Supports multiple databases | Supports only one database. Better if you have a big dataset | -| Single write point (single master) | Multiple write points (multiple masters) | -| ![Redis® Topology](img/redis-topology.png) | ![Redis® Cluster Topology](img/redis-cluster-topology.png) | - -## Prerequisites - -- Kubernetes 1.23+ -- Helm 3.8.0+ -- PV provisioner support in the underlying infrastructure - -## Installing the Chart - -To install the chart with the release name `my-release`: - -```console -helm install my-release oci://REGISTRY_NAME/REPOSITORY_NAME/redis -``` - -> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. - -The command deploys Redis® on the Kubernetes cluster in the default configuration. The [Parameters](#parameters) section lists the parameters that can be configured during installation. - -> **Tip**: List all releases using `helm list` - -## Uninstalling the Chart - -To uninstall/delete the `my-release` deployment: - -```console -helm delete my-release -``` - -The command removes all the Kubernetes components associated with the chart and deletes the release. - -## Parameters - -### Global parameters - -| Name | Description | Value | -| ------------------------- | ------------------------------------------------------ | ----- | -| `global.imageRegistry` | Global Docker image registry | `""` | -| `global.imagePullSecrets` | Global Docker registry secret names as an array | `[]` | -| `global.storageClass` | Global StorageClass for Persistent Volume(s) | `""` | -| `global.redis.password` | Global Redis® password (overrides `auth.password`) | `""` | - -### Common parameters - -| Name | Description | Value | -| ------------------------- | -------------------------------------------------------------------------------------------------------------- | --------------- | -| `kubeVersion` | Override Kubernetes version | `""` | -| `nameOverride` | String to partially override common.names.fullname | `""` | -| `fullnameOverride` | String to fully override common.names.fullname | `""` | -| `namespaceOverride` | String to fully override common.names.namespace | `""` | -| `commonLabels` | Labels to add to all deployed objects | `{}` | -| `commonAnnotations` | Annotations to add to all deployed objects | `{}` | -| `secretAnnotations` | Annotations to add to secret | `{}` | -| `clusterDomain` | Kubernetes cluster domain name | `cluster.local` | -| `extraDeploy` | Array of extra objects to deploy with the release | `[]` | -| `useHostnames` | Use hostnames internally when announcing replication. If false, the hostname will be resolved to an IP address | `true` | -| `nameResolutionThreshold` | Failure threshold for internal hostnames resolution | `5` | -| `nameResolutionTimeout` | Timeout seconds between probes for internal hostnames resolution | `5` | -| `diagnosticMode.enabled` | Enable diagnostic mode (all probes will be disabled and the command will be overridden) | `false` | -| `diagnosticMode.command` | Command to override all containers in the deployment | `["sleep"]` | -| `diagnosticMode.args` | Args to override all containers in the deployment | `["infinity"]` | - -### Redis® Image parameters - -| Name | Description | Value | -| ------------------- | ---------------------------------------------------------------------------------------------------------- | ----------------------- | -| `image.registry` | Redis® image registry | `REGISTRY_NAME` | -| `image.repository` | Redis® image repository | `REPOSITORY_NAME/redis` | -| `image.digest` | Redis® image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | -| `image.pullPolicy` | Redis® image pull policy | `IfNotPresent` | -| `image.pullSecrets` | Redis® image pull secrets | `[]` | -| `image.debug` | Enable image debug mode | `false` | - -### Redis® common configuration parameters - -| Name | Description | Value | -| -------------------------------- | ------------------------------------------------------------------------------------- | ------------- | -| `architecture` | Redis® architecture. Allowed values: `standalone` or `replication` | `replication` | -| `auth.enabled` | Enable password authentication | `true` | -| `auth.sentinel` | Enable password authentication on sentinels too | `true` | -| `auth.password` | Redis® password | `""` | -| `auth.existingSecret` | The name of an existing secret with Redis® credentials | `""` | -| `auth.existingSecretPasswordKey` | Password key to be retrieved from existing secret | `""` | -| `auth.usePasswordFiles` | Mount credentials as files instead of using an environment variable | `false` | -| `commonConfiguration` | Common configuration to be added into the ConfigMap | `""` | -| `existingConfigmap` | The name of an existing ConfigMap with your custom configuration for Redis® nodes | `""` | - -### Redis® master configuration parameters - -| Name | Description | Value | -| ---------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------ | -| `master.count` | Number of Redis® master instances to deploy (experimental, requires additional configuration) | `1` | -| `master.configuration` | Configuration for Redis® master nodes | `""` | -| `master.disableCommands` | Array with Redis® commands to disable on master nodes | `["FLUSHDB","FLUSHALL"]` | -| `master.command` | Override default container command (useful when using custom images) | `[]` | -| `master.args` | Override default container args (useful when using custom images) | `[]` | -| `master.enableServiceLinks` | Whether information about services should be injected into pod's environment variable | `true` | -| `master.preExecCmds` | Additional commands to run prior to starting Redis® master | `[]` | -| `master.extraFlags` | Array with additional command line flags for Redis® master | `[]` | -| `master.extraEnvVars` | Array with extra environment variables to add to Redis® master nodes | `[]` | -| `master.extraEnvVarsCM` | Name of existing ConfigMap containing extra env vars for Redis® master nodes | `""` | -| `master.extraEnvVarsSecret` | Name of existing Secret containing extra env vars for Redis® master nodes | `""` | -| `master.containerPorts.redis` | Container port to open on Redis® master nodes | `6379` | -| `master.startupProbe.enabled` | Enable startupProbe on Redis® master nodes | `false` | -| `master.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `20` | -| `master.startupProbe.periodSeconds` | Period seconds for startupProbe | `5` | -| `master.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `5` | -| `master.startupProbe.failureThreshold` | Failure threshold for startupProbe | `5` | -| `master.startupProbe.successThreshold` | Success threshold for startupProbe | `1` | -| `master.livenessProbe.enabled` | Enable livenessProbe on Redis® master nodes | `true` | -| `master.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `20` | -| `master.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `5` | -| `master.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `5` | -| `master.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `5` | -| `master.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` | -| `master.readinessProbe.enabled` | Enable readinessProbe on Redis® master nodes | `true` | -| `master.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `20` | -| `master.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `5` | -| `master.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `1` | -| `master.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `5` | -| `master.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` | -| `master.customStartupProbe` | Custom startupProbe that overrides the default one | `{}` | -| `master.customLivenessProbe` | Custom livenessProbe that overrides the default one | `{}` | -| `master.customReadinessProbe` | Custom readinessProbe that overrides the default one | `{}` | -| `master.resources.limits` | The resources limits for the Redis® master containers | `{}` | -| `master.resources.requests` | The requested resources for the Redis® master containers | `{}` | -| `master.podSecurityContext.enabled` | Enabled Redis® master pods' Security Context | `true` | -| `master.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | -| `master.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | -| `master.podSecurityContext.supplementalGroups` | Set filesystem extra groups | `[]` | -| `master.podSecurityContext.fsGroup` | Set Redis® master pod's Security Context fsGroup | `1001` | -| `master.containerSecurityContext.enabled` | Enabled Redis® master containers' Security Context | `true` | -| `master.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | -| `master.containerSecurityContext.runAsUser` | Set Redis® master containers' Security Context runAsUser | `1001` | -| `master.containerSecurityContext.runAsGroup` | Set Redis® master containers' Security Context runAsGroup | `0` | -| `master.containerSecurityContext.runAsNonRoot` | Set Redis® master containers' Security Context runAsNonRoot | `true` | -| `master.containerSecurityContext.allowPrivilegeEscalation` | Is it possible to escalate Redis® pod(s) privileges | `false` | -| `master.containerSecurityContext.seccompProfile.type` | Set Redis® master containers' Security Context seccompProfile | `RuntimeDefault` | -| `master.containerSecurityContext.capabilities.drop` | Set Redis® master containers' Security Context capabilities to drop | `["ALL"]` | -| `master.kind` | Use either Deployment, StatefulSet (default) or DaemonSet | `StatefulSet` | -| `master.schedulerName` | Alternate scheduler for Redis® master pods | `""` | -| `master.updateStrategy.type` | Redis® master statefulset strategy type | `RollingUpdate` | -| `master.minReadySeconds` | How many seconds a pod needs to be ready before killing the next, during update | `0` | -| `master.priorityClassName` | Redis® master pods' priorityClassName | `""` | -| `master.automountServiceAccountToken` | Mount Service Account token in pod | `false` | -| `master.hostAliases` | Redis® master pods host aliases | `[]` | -| `master.podLabels` | Extra labels for Redis® master pods | `{}` | -| `master.podAnnotations` | Annotations for Redis® master pods | `{}` | -| `master.shareProcessNamespace` | Share a single process namespace between all of the containers in Redis® master pods | `false` | -| `master.podAffinityPreset` | Pod affinity preset. Ignored if `master.affinity` is set. Allowed values: `soft` or `hard` | `""` | -| `master.podAntiAffinityPreset` | Pod anti-affinity preset. Ignored if `master.affinity` is set. Allowed values: `soft` or `hard` | `soft` | -| `master.nodeAffinityPreset.type` | Node affinity preset type. Ignored if `master.affinity` is set. Allowed values: `soft` or `hard` | `""` | -| `master.nodeAffinityPreset.key` | Node label key to match. Ignored if `master.affinity` is set | `""` | -| `master.nodeAffinityPreset.values` | Node label values to match. Ignored if `master.affinity` is set | `[]` | -| `master.affinity` | Affinity for Redis® master pods assignment | `{}` | -| `master.nodeSelector` | Node labels for Redis® master pods assignment | `{}` | -| `master.tolerations` | Tolerations for Redis® master pods assignment | `[]` | -| `master.topologySpreadConstraints` | Spread Constraints for Redis® master pod assignment | `[]` | -| `master.dnsPolicy` | DNS Policy for Redis® master pod | `""` | -| `master.dnsConfig` | DNS Configuration for Redis® master pod | `{}` | -| `master.lifecycleHooks` | for the Redis® master container(s) to automate configuration before or after startup | `{}` | -| `master.extraVolumes` | Optionally specify extra list of additional volumes for the Redis® master pod(s) | `[]` | -| `master.extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for the Redis® master container(s) | `[]` | -| `master.sidecars` | Add additional sidecar containers to the Redis® master pod(s) | `[]` | -| `master.initContainers` | Add additional init containers to the Redis® master pod(s) | `[]` | -| `master.persistence.enabled` | Enable persistence on Redis® master nodes using Persistent Volume Claims | `true` | -| `master.persistence.medium` | Provide a medium for `emptyDir` volumes. | `""` | -| `master.persistence.sizeLimit` | Set this to enable a size limit for `emptyDir` volumes. | `""` | -| `master.persistence.path` | The path the volume will be mounted at on Redis® master containers | `/data` | -| `master.persistence.subPath` | The subdirectory of the volume to mount on Redis® master containers | `""` | -| `master.persistence.subPathExpr` | Used to construct the subPath subdirectory of the volume to mount on Redis® master containers | `""` | -| `master.persistence.storageClass` | Persistent Volume storage class | `""` | -| `master.persistence.accessModes` | Persistent Volume access modes | `["ReadWriteOnce"]` | -| `master.persistence.size` | Persistent Volume size | `8Gi` | -| `master.persistence.annotations` | Additional custom annotations for the PVC | `{}` | -| `master.persistence.labels` | Additional custom labels for the PVC | `{}` | -| `master.persistence.selector` | Additional labels to match for the PVC | `{}` | -| `master.persistence.dataSource` | Custom PVC data source | `{}` | -| `master.persistence.existingClaim` | Use a existing PVC which must be created manually before bound | `""` | -| `master.persistentVolumeClaimRetentionPolicy.enabled` | Controls if and how PVCs are deleted during the lifecycle of a StatefulSet | `false` | -| `master.persistentVolumeClaimRetentionPolicy.whenScaled` | Volume retention behavior when the replica count of the StatefulSet is reduced | `Retain` | -| `master.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted | `Retain` | -| `master.service.type` | Redis® master service type | `ClusterIP` | -| `master.service.ports.redis` | Redis® master service port | `6379` | -| `master.service.nodePorts.redis` | Node port for Redis® master | `""` | -| `master.service.externalTrafficPolicy` | Redis® master service external traffic policy | `Cluster` | -| `master.service.extraPorts` | Extra ports to expose (normally used with the `sidecar` value) | `[]` | -| `master.service.internalTrafficPolicy` | Redis® master service internal traffic policy (requires Kubernetes v1.22 or greater to be usable) | `Cluster` | -| `master.service.clusterIP` | Redis® master service Cluster IP | `""` | -| `master.service.loadBalancerIP` | Redis® master service Load Balancer IP | `""` | -| `master.service.loadBalancerClass` | master service Load Balancer class if service type is `LoadBalancer` (optional, cloud specific) | `""` | -| `master.service.loadBalancerSourceRanges` | Redis® master service Load Balancer sources | `[]` | -| `master.service.externalIPs` | Redis® master service External IPs | `[]` | -| `master.service.annotations` | Additional custom annotations for Redis® master service | `{}` | -| `master.service.sessionAffinity` | Session Affinity for Kubernetes service, can be "None" or "ClientIP" | `None` | -| `master.service.sessionAffinityConfig` | Additional settings for the sessionAffinity | `{}` | -| `master.terminationGracePeriodSeconds` | Integer setting the termination grace period for the redis-master pods | `30` | -| `master.serviceAccount.create` | Specifies whether a ServiceAccount should be created | `true` | -| `master.serviceAccount.name` | The name of the ServiceAccount to use. | `""` | -| `master.serviceAccount.automountServiceAccountToken` | Whether to auto mount the service account token | `false` | -| `master.serviceAccount.annotations` | Additional custom annotations for the ServiceAccount | `{}` | - -### Redis® replicas configuration parameters - -| Name | Description | Value | -| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------ | -| `replica.kind` | Use either DaemonSet or StatefulSet (default) | `StatefulSet` | -| `replica.replicaCount` | Number of Redis® replicas to deploy | `3` | -| `replica.configuration` | Configuration for Redis® replicas nodes | `""` | -| `replica.disableCommands` | Array with Redis® commands to disable on replicas nodes | `["FLUSHDB","FLUSHALL"]` | -| `replica.command` | Override default container command (useful when using custom images) | `[]` | -| `replica.args` | Override default container args (useful when using custom images) | `[]` | -| `replica.enableServiceLinks` | Whether information about services should be injected into pod's environment variable | `true` | -| `replica.preExecCmds` | Additional commands to run prior to starting Redis® replicas | `[]` | -| `replica.extraFlags` | Array with additional command line flags for Redis® replicas | `[]` | -| `replica.extraEnvVars` | Array with extra environment variables to add to Redis® replicas nodes | `[]` | -| `replica.extraEnvVarsCM` | Name of existing ConfigMap containing extra env vars for Redis® replicas nodes | `""` | -| `replica.extraEnvVarsSecret` | Name of existing Secret containing extra env vars for Redis® replicas nodes | `""` | -| `replica.externalMaster.enabled` | Use external master for bootstrapping | `false` | -| `replica.externalMaster.host` | External master host to bootstrap from | `""` | -| `replica.externalMaster.port` | Port for Redis service external master host | `6379` | -| `replica.containerPorts.redis` | Container port to open on Redis® replicas nodes | `6379` | -| `replica.startupProbe.enabled` | Enable startupProbe on Redis® replicas nodes | `true` | -| `replica.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `10` | -| `replica.startupProbe.periodSeconds` | Period seconds for startupProbe | `10` | -| `replica.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `5` | -| `replica.startupProbe.failureThreshold` | Failure threshold for startupProbe | `22` | -| `replica.startupProbe.successThreshold` | Success threshold for startupProbe | `1` | -| `replica.livenessProbe.enabled` | Enable livenessProbe on Redis® replicas nodes | `true` | -| `replica.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `20` | -| `replica.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `5` | -| `replica.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `5` | -| `replica.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `5` | -| `replica.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` | -| `replica.readinessProbe.enabled` | Enable readinessProbe on Redis® replicas nodes | `true` | -| `replica.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `20` | -| `replica.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `5` | -| `replica.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `1` | -| `replica.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `5` | -| `replica.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` | -| `replica.customStartupProbe` | Custom startupProbe that overrides the default one | `{}` | -| `replica.customLivenessProbe` | Custom livenessProbe that overrides the default one | `{}` | -| `replica.customReadinessProbe` | Custom readinessProbe that overrides the default one | `{}` | -| `replica.resources.limits` | The resources limits for the Redis® replicas containers | `{}` | -| `replica.resources.requests` | The requested resources for the Redis® replicas containers | `{}` | -| `replica.podSecurityContext.enabled` | Enabled Redis® replicas pods' Security Context | `true` | -| `replica.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | -| `replica.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | -| `replica.podSecurityContext.supplementalGroups` | Set filesystem extra groups | `[]` | -| `replica.podSecurityContext.fsGroup` | Set Redis® replicas pod's Security Context fsGroup | `1001` | -| `replica.containerSecurityContext.enabled` | Enabled Redis® replicas containers' Security Context | `true` | -| `replica.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | -| `replica.containerSecurityContext.runAsUser` | Set Redis® replicas containers' Security Context runAsUser | `1001` | -| `replica.containerSecurityContext.runAsGroup` | Set Redis® replicas containers' Security Context runAsGroup | `0` | -| `replica.containerSecurityContext.runAsNonRoot` | Set Redis® replicas containers' Security Context runAsNonRoot | `true` | -| `replica.containerSecurityContext.allowPrivilegeEscalation` | Set Redis® replicas pod's Security Context allowPrivilegeEscalation | `false` | -| `replica.containerSecurityContext.seccompProfile.type` | Set Redis® replicas containers' Security Context seccompProfile | `RuntimeDefault` | -| `replica.containerSecurityContext.capabilities.drop` | Set Redis® replicas containers' Security Context capabilities to drop | `["ALL"]` | -| `replica.schedulerName` | Alternate scheduler for Redis® replicas pods | `""` | -| `replica.updateStrategy.type` | Redis® replicas statefulset strategy type | `RollingUpdate` | -| `replica.minReadySeconds` | How many seconds a pod needs to be ready before killing the next, during update | `0` | -| `replica.priorityClassName` | Redis® replicas pods' priorityClassName | `""` | -| `replica.podManagementPolicy` | podManagementPolicy to manage scaling operation of %%MAIN_CONTAINER_NAME%% pods | `""` | -| `replica.automountServiceAccountToken` | Mount Service Account token in pod | `false` | -| `replica.hostAliases` | Redis® replicas pods host aliases | `[]` | -| `replica.podLabels` | Extra labels for Redis® replicas pods | `{}` | -| `replica.podAnnotations` | Annotations for Redis® replicas pods | `{}` | -| `replica.shareProcessNamespace` | Share a single process namespace between all of the containers in Redis® replicas pods | `false` | -| `replica.podAffinityPreset` | Pod affinity preset. Ignored if `replica.affinity` is set. Allowed values: `soft` or `hard` | `""` | -| `replica.podAntiAffinityPreset` | Pod anti-affinity preset. Ignored if `replica.affinity` is set. Allowed values: `soft` or `hard` | `soft` | -| `replica.nodeAffinityPreset.type` | Node affinity preset type. Ignored if `replica.affinity` is set. Allowed values: `soft` or `hard` | `""` | -| `replica.nodeAffinityPreset.key` | Node label key to match. Ignored if `replica.affinity` is set | `""` | -| `replica.nodeAffinityPreset.values` | Node label values to match. Ignored if `replica.affinity` is set | `[]` | -| `replica.affinity` | Affinity for Redis® replicas pods assignment | `{}` | -| `replica.nodeSelector` | Node labels for Redis® replicas pods assignment | `{}` | -| `replica.tolerations` | Tolerations for Redis® replicas pods assignment | `[]` | -| `replica.topologySpreadConstraints` | Spread Constraints for Redis® replicas pod assignment | `[]` | -| `replica.dnsPolicy` | DNS Policy for Redis® replica pods | `""` | -| `replica.dnsConfig` | DNS Configuration for Redis® replica pods | `{}` | -| `replica.lifecycleHooks` | for the Redis® replica container(s) to automate configuration before or after startup | `{}` | -| `replica.extraVolumes` | Optionally specify extra list of additional volumes for the Redis® replicas pod(s) | `[]` | -| `replica.extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for the Redis® replicas container(s) | `[]` | -| `replica.sidecars` | Add additional sidecar containers to the Redis® replicas pod(s) | `[]` | -| `replica.initContainers` | Add additional init containers to the Redis® replicas pod(s) | `[]` | -| `replica.persistence.enabled` | Enable persistence on Redis® replicas nodes using Persistent Volume Claims | `true` | -| `replica.persistence.medium` | Provide a medium for `emptyDir` volumes. | `""` | -| `replica.persistence.sizeLimit` | Set this to enable a size limit for `emptyDir` volumes. | `""` | -| `replica.persistence.path` | The path the volume will be mounted at on Redis® replicas containers | `/data` | -| `replica.persistence.subPath` | The subdirectory of the volume to mount on Redis® replicas containers | `""` | -| `replica.persistence.subPathExpr` | Used to construct the subPath subdirectory of the volume to mount on Redis® replicas containers | `""` | -| `replica.persistence.storageClass` | Persistent Volume storage class | `""` | -| `replica.persistence.accessModes` | Persistent Volume access modes | `["ReadWriteOnce"]` | -| `replica.persistence.size` | Persistent Volume size | `8Gi` | -| `replica.persistence.annotations` | Additional custom annotations for the PVC | `{}` | -| `replica.persistence.labels` | Additional custom labels for the PVC | `{}` | -| `replica.persistence.selector` | Additional labels to match for the PVC | `{}` | -| `replica.persistence.dataSource` | Custom PVC data source | `{}` | -| `replica.persistence.existingClaim` | Use a existing PVC which must be created manually before bound | `""` | -| `replica.persistentVolumeClaimRetentionPolicy.enabled` | Controls if and how PVCs are deleted during the lifecycle of a StatefulSet | `false` | -| `replica.persistentVolumeClaimRetentionPolicy.whenScaled` | Volume retention behavior when the replica count of the StatefulSet is reduced | `Retain` | -| `replica.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted | `Retain` | -| `replica.service.type` | Redis® replicas service type | `ClusterIP` | -| `replica.service.ports.redis` | Redis® replicas service port | `6379` | -| `replica.service.nodePorts.redis` | Node port for Redis® replicas | `""` | -| `replica.service.externalTrafficPolicy` | Redis® replicas service external traffic policy | `Cluster` | -| `replica.service.internalTrafficPolicy` | Redis® replicas service internal traffic policy (requires Kubernetes v1.22 or greater to be usable) | `Cluster` | -| `replica.service.extraPorts` | Extra ports to expose (normally used with the `sidecar` value) | `[]` | -| `replica.service.clusterIP` | Redis® replicas service Cluster IP | `""` | -| `replica.service.loadBalancerIP` | Redis® replicas service Load Balancer IP | `""` | -| `replica.service.loadBalancerClass` | replicas service Load Balancer class if service type is `LoadBalancer` (optional, cloud specific) | `""` | -| `replica.service.loadBalancerSourceRanges` | Redis® replicas service Load Balancer sources | `[]` | -| `replica.service.annotations` | Additional custom annotations for Redis® replicas service | `{}` | -| `replica.service.sessionAffinity` | Session Affinity for Kubernetes service, can be "None" or "ClientIP" | `None` | -| `replica.service.sessionAffinityConfig` | Additional settings for the sessionAffinity | `{}` | -| `replica.terminationGracePeriodSeconds` | Integer setting the termination grace period for the redis-replicas pods | `30` | -| `replica.autoscaling.enabled` | Enable replica autoscaling settings | `false` | -| `replica.autoscaling.minReplicas` | Minimum replicas for the pod autoscaling | `1` | -| `replica.autoscaling.maxReplicas` | Maximum replicas for the pod autoscaling | `11` | -| `replica.autoscaling.targetCPU` | Percentage of CPU to consider when autoscaling | `""` | -| `replica.autoscaling.targetMemory` | Percentage of Memory to consider when autoscaling | `""` | -| `replica.serviceAccount.create` | Specifies whether a ServiceAccount should be created | `true` | -| `replica.serviceAccount.name` | The name of the ServiceAccount to use. | `""` | -| `replica.serviceAccount.automountServiceAccountToken` | Whether to auto mount the service account token | `false` | -| `replica.serviceAccount.annotations` | Additional custom annotations for the ServiceAccount | `{}` | - -### Redis® Sentinel configuration parameters - -| Name | Description | Value | -| ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | -| `sentinel.enabled` | Use Redis® Sentinel on Redis® pods. | `false` | -| `sentinel.image.registry` | Redis® Sentinel image registry | `REGISTRY_NAME` | -| `sentinel.image.repository` | Redis® Sentinel image repository | `REPOSITORY_NAME/redis-sentinel` | -| `sentinel.image.digest` | Redis® Sentinel image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | -| `sentinel.image.pullPolicy` | Redis® Sentinel image pull policy | `IfNotPresent` | -| `sentinel.image.pullSecrets` | Redis® Sentinel image pull secrets | `[]` | -| `sentinel.image.debug` | Enable image debug mode | `false` | -| `sentinel.annotations` | Additional custom annotations for Redis® Sentinel resource | `{}` | -| `sentinel.masterSet` | Master set name | `mymaster` | -| `sentinel.quorum` | Sentinel Quorum | `2` | -| `sentinel.getMasterTimeout` | Amount of time to allow before get_sentinel_master_info() times out. | `90` | -| `sentinel.automateClusterRecovery` | Automate cluster recovery in cases where the last replica is not considered a good replica and Sentinel won't automatically failover to it. | `false` | -| `sentinel.redisShutdownWaitFailover` | Whether the Redis® master container waits for the failover at shutdown (in addition to the Redis® Sentinel container). | `true` | -| `sentinel.downAfterMilliseconds` | Timeout for detecting a Redis® node is down | `60000` | -| `sentinel.failoverTimeout` | Timeout for performing a election failover | `180000` | -| `sentinel.parallelSyncs` | Number of replicas that can be reconfigured in parallel to use the new master after a failover | `1` | -| `sentinel.configuration` | Configuration for Redis® Sentinel nodes | `""` | -| `sentinel.command` | Override default container command (useful when using custom images) | `[]` | -| `sentinel.args` | Override default container args (useful when using custom images) | `[]` | -| `sentinel.enableServiceLinks` | Whether information about services should be injected into pod's environment variable | `true` | -| `sentinel.preExecCmds` | Additional commands to run prior to starting Redis® Sentinel | `[]` | -| `sentinel.extraEnvVars` | Array with extra environment variables to add to Redis® Sentinel nodes | `[]` | -| `sentinel.extraEnvVarsCM` | Name of existing ConfigMap containing extra env vars for Redis® Sentinel nodes | `""` | -| `sentinel.extraEnvVarsSecret` | Name of existing Secret containing extra env vars for Redis® Sentinel nodes | `""` | -| `sentinel.externalMaster.enabled` | Use external master for bootstrapping | `false` | -| `sentinel.externalMaster.host` | External master host to bootstrap from | `""` | -| `sentinel.externalMaster.port` | Port for Redis service external master host | `6379` | -| `sentinel.containerPorts.sentinel` | Container port to open on Redis® Sentinel nodes | `26379` | -| `sentinel.startupProbe.enabled` | Enable startupProbe on Redis® Sentinel nodes | `true` | -| `sentinel.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `10` | -| `sentinel.startupProbe.periodSeconds` | Period seconds for startupProbe | `10` | -| `sentinel.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `5` | -| `sentinel.startupProbe.failureThreshold` | Failure threshold for startupProbe | `22` | -| `sentinel.startupProbe.successThreshold` | Success threshold for startupProbe | `1` | -| `sentinel.livenessProbe.enabled` | Enable livenessProbe on Redis® Sentinel nodes | `true` | -| `sentinel.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `20` | -| `sentinel.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `10` | -| `sentinel.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `5` | -| `sentinel.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `6` | -| `sentinel.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` | -| `sentinel.readinessProbe.enabled` | Enable readinessProbe on Redis® Sentinel nodes | `true` | -| `sentinel.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `20` | -| `sentinel.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `5` | -| `sentinel.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `1` | -| `sentinel.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `6` | -| `sentinel.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` | -| `sentinel.customStartupProbe` | Custom startupProbe that overrides the default one | `{}` | -| `sentinel.customLivenessProbe` | Custom livenessProbe that overrides the default one | `{}` | -| `sentinel.customReadinessProbe` | Custom readinessProbe that overrides the default one | `{}` | -| `sentinel.persistence.enabled` | Enable persistence on Redis® sentinel nodes using Persistent Volume Claims (Experimental) | `false` | -| `sentinel.persistence.storageClass` | Persistent Volume storage class | `""` | -| `sentinel.persistence.accessModes` | Persistent Volume access modes | `["ReadWriteOnce"]` | -| `sentinel.persistence.size` | Persistent Volume size | `100Mi` | -| `sentinel.persistence.annotations` | Additional custom annotations for the PVC | `{}` | -| `sentinel.persistence.labels` | Additional custom labels for the PVC | `{}` | -| `sentinel.persistence.selector` | Additional labels to match for the PVC | `{}` | -| `sentinel.persistence.dataSource` | Custom PVC data source | `{}` | -| `sentinel.persistence.medium` | Provide a medium for `emptyDir` volumes. | `""` | -| `sentinel.persistence.sizeLimit` | Set this to enable a size limit for `emptyDir` volumes. | `""` | -| `sentinel.persistentVolumeClaimRetentionPolicy.enabled` | Controls if and how PVCs are deleted during the lifecycle of a StatefulSet | `false` | -| `sentinel.persistentVolumeClaimRetentionPolicy.whenScaled` | Volume retention behavior when the replica count of the StatefulSet is reduced | `Retain` | -| `sentinel.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted | `Retain` | -| `sentinel.resources.limits` | The resources limits for the Redis® Sentinel containers | `{}` | -| `sentinel.resources.requests` | The requested resources for the Redis® Sentinel containers | `{}` | -| `sentinel.containerSecurityContext.enabled` | Enabled Redis® Sentinel containers' Security Context | `true` | -| `sentinel.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | -| `sentinel.containerSecurityContext.runAsUser` | Set Redis® Sentinel containers' Security Context runAsUser | `1001` | -| `sentinel.containerSecurityContext.runAsGroup` | Set Redis® Sentinel containers' Security Context runAsGroup | `0` | -| `sentinel.containerSecurityContext.runAsNonRoot` | Set Redis® Sentinel containers' Security Context runAsNonRoot | `true` | -| `sentinel.containerSecurityContext.allowPrivilegeEscalation` | Set Redis® Sentinel containers' Security Context allowPrivilegeEscalation | `false` | -| `sentinel.containerSecurityContext.seccompProfile.type` | Set Redis® Sentinel containers' Security Context seccompProfile | `RuntimeDefault` | -| `sentinel.containerSecurityContext.capabilities.drop` | Set Redis® Sentinel containers' Security Context capabilities to drop | `["ALL"]` | -| `sentinel.lifecycleHooks` | for the Redis® sentinel container(s) to automate configuration before or after startup | `{}` | -| `sentinel.extraVolumes` | Optionally specify extra list of additional volumes for the Redis® Sentinel | `[]` | -| `sentinel.extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for the Redis® Sentinel container(s) | `[]` | -| `sentinel.service.type` | Redis® Sentinel service type | `ClusterIP` | -| `sentinel.service.ports.redis` | Redis® service port for Redis® | `6379` | -| `sentinel.service.ports.sentinel` | Redis® service port for Redis® Sentinel | `26379` | -| `sentinel.service.nodePorts.redis` | Node port for Redis® | `""` | -| `sentinel.service.nodePorts.sentinel` | Node port for Sentinel | `""` | -| `sentinel.service.externalTrafficPolicy` | Redis® Sentinel service external traffic policy | `Cluster` | -| `sentinel.service.extraPorts` | Extra ports to expose (normally used with the `sidecar` value) | `[]` | -| `sentinel.service.clusterIP` | Redis® Sentinel service Cluster IP | `""` | -| `sentinel.service.loadBalancerIP` | Redis® Sentinel service Load Balancer IP | `""` | -| `sentinel.service.loadBalancerClass` | sentinel service Load Balancer class if service type is `LoadBalancer` (optional, cloud specific) | `""` | -| `sentinel.service.loadBalancerSourceRanges` | Redis® Sentinel service Load Balancer sources | `[]` | -| `sentinel.service.annotations` | Additional custom annotations for Redis® Sentinel service | `{}` | -| `sentinel.service.sessionAffinity` | Session Affinity for Kubernetes service, can be "None" or "ClientIP" | `None` | -| `sentinel.service.sessionAffinityConfig` | Additional settings for the sessionAffinity | `{}` | -| `sentinel.service.headless.annotations` | Annotations for the headless service. | `{}` | -| `sentinel.terminationGracePeriodSeconds` | Integer setting the termination grace period for the redis-node pods | `30` | - -### Other Parameters - -| Name | Description | Value | -| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------- | -| `serviceBindings.enabled` | Create secret for service binding (Experimental) | `false` | -| `networkPolicy.enabled` | Enable creation of NetworkPolicy resources | `false` | -| `networkPolicy.allowExternal` | Don't require client label for connections | `true` | -| `networkPolicy.extraIngress` | Add extra ingress rules to the NetworkPolicy | `[]` | -| `networkPolicy.extraEgress` | Add extra egress rules to the NetworkPolicy | `[]` | -| `networkPolicy.ingressNSMatchLabels` | Labels to match to allow traffic from other namespaces | `{}` | -| `networkPolicy.ingressNSPodMatchLabels` | Pod labels to match to allow traffic from other namespaces | `{}` | -| `networkPolicy.metrics.allowExternal` | Don't require client label for connections for metrics endpoint | `true` | -| `networkPolicy.metrics.ingressNSMatchLabels` | Labels to match to allow traffic from other namespaces to metrics endpoint | `{}` | -| `networkPolicy.metrics.ingressNSPodMatchLabels` | Pod labels to match to allow traffic from other namespaces to metrics endpoint | `{}` | -| `podSecurityPolicy.create` | Whether to create a PodSecurityPolicy. WARNING: PodSecurityPolicy is deprecated in Kubernetes v1.21 or later, unavailable in v1.25 or later | `false` | -| `podSecurityPolicy.enabled` | Enable PodSecurityPolicy's RBAC rules | `false` | -| `rbac.create` | Specifies whether RBAC resources should be created | `false` | -| `rbac.rules` | Custom RBAC rules to set | `[]` | -| `serviceAccount.create` | Specifies whether a ServiceAccount should be created | `true` | -| `serviceAccount.name` | The name of the ServiceAccount to use. | `""` | -| `serviceAccount.automountServiceAccountToken` | Whether to auto mount the service account token | `false` | -| `serviceAccount.annotations` | Additional custom annotations for the ServiceAccount | `{}` | -| `pdb.create` | Specifies whether a PodDisruptionBudget should be created | `false` | -| `pdb.minAvailable` | Min number of pods that must still be available after the eviction | `1` | -| `pdb.maxUnavailable` | Max number of pods that can be unavailable after the eviction | `""` | -| `tls.enabled` | Enable TLS traffic | `false` | -| `tls.authClients` | Require clients to authenticate | `true` | -| `tls.autoGenerated` | Enable autogenerated certificates | `false` | -| `tls.existingSecret` | The name of the existing secret that contains the TLS certificates | `""` | -| `tls.certificatesSecret` | DEPRECATED. Use existingSecret instead. | `""` | -| `tls.certFilename` | Certificate filename | `""` | -| `tls.certKeyFilename` | Certificate Key filename | `""` | -| `tls.certCAFilename` | CA Certificate filename | `""` | -| `tls.dhParamsFilename` | File containing DH params (in order to support DH based ciphers) | `""` | - -### Metrics Parameters - -| Name | Description | Value | -| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | -------------------------------- | -| `metrics.enabled` | Start a sidecar prometheus exporter to expose Redis® metrics | `false` | -| `metrics.image.registry` | Redis® Exporter image registry | `REGISTRY_NAME` | -| `metrics.image.repository` | Redis® Exporter image repository | `REPOSITORY_NAME/redis-exporter` | -| `metrics.image.digest` | Redis® Exporter image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | -| `metrics.image.pullPolicy` | Redis® Exporter image pull policy | `IfNotPresent` | -| `metrics.image.pullSecrets` | Redis® Exporter image pull secrets | `[]` | -| `metrics.startupProbe.enabled` | Enable startupProbe on Redis® replicas nodes | `false` | -| `metrics.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `10` | -| `metrics.startupProbe.periodSeconds` | Period seconds for startupProbe | `10` | -| `metrics.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `5` | -| `metrics.startupProbe.failureThreshold` | Failure threshold for startupProbe | `5` | -| `metrics.startupProbe.successThreshold` | Success threshold for startupProbe | `1` | -| `metrics.livenessProbe.enabled` | Enable livenessProbe on Redis® replicas nodes | `true` | -| `metrics.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `10` | -| `metrics.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `10` | -| `metrics.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `5` | -| `metrics.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `5` | -| `metrics.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` | -| `metrics.readinessProbe.enabled` | Enable readinessProbe on Redis® replicas nodes | `true` | -| `metrics.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `5` | -| `metrics.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `10` | -| `metrics.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `1` | -| `metrics.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `3` | -| `metrics.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` | -| `metrics.customStartupProbe` | Custom startupProbe that overrides the default one | `{}` | -| `metrics.customLivenessProbe` | Custom livenessProbe that overrides the default one | `{}` | -| `metrics.customReadinessProbe` | Custom readinessProbe that overrides the default one | `{}` | -| `metrics.command` | Override default metrics container init command (useful when using custom images) | `[]` | -| `metrics.redisTargetHost` | A way to specify an alternative Redis® hostname | `localhost` | -| `metrics.extraArgs` | Extra arguments for Redis® exporter, for example: | `{}` | -| `metrics.extraEnvVars` | Array with extra environment variables to add to Redis® exporter | `[]` | -| `metrics.containerSecurityContext.enabled` | Enabled Redis® exporter containers' Security Context | `true` | -| `metrics.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | -| `metrics.containerSecurityContext.runAsUser` | Set Redis® exporter containers' Security Context runAsUser | `1001` | -| `metrics.containerSecurityContext.runAsGroup` | Set Redis® exporter containers' Security Context runAsGroup | `0` | -| `metrics.containerSecurityContext.runAsNonRoot` | Set Redis® exporter containers' Security Context runAsNonRoot | `true` | -| `metrics.containerSecurityContext.allowPrivilegeEscalation` | Set Redis® exporter containers' Security Context allowPrivilegeEscalation | `false` | -| `metrics.containerSecurityContext.seccompProfile.type` | Set Redis® exporter containers' Security Context seccompProfile | `RuntimeDefault` | -| `metrics.containerSecurityContext.capabilities.drop` | Set Redis® exporter containers' Security Context capabilities to drop | `["ALL"]` | -| `metrics.extraVolumes` | Optionally specify extra list of additional volumes for the Redis® metrics sidecar | `[]` | -| `metrics.extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for the Redis® metrics sidecar | `[]` | -| `metrics.resources.limits` | The resources limits for the Redis® exporter container | `{}` | -| `metrics.resources.requests` | The requested resources for the Redis® exporter container | `{}` | -| `metrics.podLabels` | Extra labels for Redis® exporter pods | `{}` | -| `metrics.podAnnotations` | Annotations for Redis® exporter pods | `{}` | -| `metrics.service.type` | Redis® exporter service type | `ClusterIP` | -| `metrics.service.port` | Redis® exporter service port | `9121` | -| `metrics.service.externalTrafficPolicy` | Redis® exporter service external traffic policy | `Cluster` | -| `metrics.service.extraPorts` | Extra ports to expose (normally used with the `sidecar` value) | `[]` | -| `metrics.service.loadBalancerIP` | Redis® exporter service Load Balancer IP | `""` | -| `metrics.service.loadBalancerClass` | exporter service Load Balancer class if service type is `LoadBalancer` (optional, cloud specific) | `""` | -| `metrics.service.loadBalancerSourceRanges` | Redis® exporter service Load Balancer sources | `[]` | -| `metrics.service.annotations` | Additional custom annotations for Redis® exporter service | `{}` | -| `metrics.service.clusterIP` | Redis® exporter service Cluster IP | `""` | -| `metrics.serviceMonitor.enabled` | Create ServiceMonitor resource(s) for scraping metrics using PrometheusOperator | `false` | -| `metrics.serviceMonitor.namespace` | The namespace in which the ServiceMonitor will be created | `""` | -| `metrics.serviceMonitor.interval` | The interval at which metrics should be scraped | `30s` | -| `metrics.serviceMonitor.scrapeTimeout` | The timeout after which the scrape is ended | `""` | -| `metrics.serviceMonitor.relabellings` | Metrics RelabelConfigs to apply to samples before scraping. | `[]` | -| `metrics.serviceMonitor.metricRelabelings` | Metrics RelabelConfigs to apply to samples before ingestion. | `[]` | -| `metrics.serviceMonitor.honorLabels` | Specify honorLabels parameter to add the scrape endpoint | `false` | -| `metrics.serviceMonitor.additionalLabels` | Additional labels that can be used so ServiceMonitor resource(s) can be discovered by Prometheus | `{}` | -| `metrics.serviceMonitor.podTargetLabels` | Labels from the Kubernetes pod to be transferred to the created metrics | `[]` | -| `metrics.serviceMonitor.sampleLimit` | Limit of how many samples should be scraped from every Pod | `false` | -| `metrics.serviceMonitor.targetLimit` | Limit of how many targets should be scraped | `false` | -| `metrics.serviceMonitor.additionalEndpoints` | Additional endpoints to scrape (e.g sentinel) | `[]` | -| `metrics.podMonitor.enabled` | Create PodMonitor resource(s) for scraping metrics using PrometheusOperator | `false` | -| `metrics.podMonitor.namespace` | The namespace in which the PodMonitor will be created | `""` | -| `metrics.podMonitor.interval` | The interval at which metrics should be scraped | `30s` | -| `metrics.podMonitor.scrapeTimeout` | The timeout after which the scrape is ended | `""` | -| `metrics.podMonitor.relabellings` | Metrics RelabelConfigs to apply to samples before scraping. | `[]` | -| `metrics.podMonitor.metricRelabelings` | Metrics RelabelConfigs to apply to samples before ingestion. | `[]` | -| `metrics.podMonitor.honorLabels` | Specify honorLabels parameter to add the scrape endpoint | `false` | -| `metrics.podMonitor.additionalLabels` | Additional labels that can be used so PodMonitor resource(s) can be discovered by Prometheus | `{}` | -| `metrics.podMonitor.podTargetLabels` | Labels from the Kubernetes pod to be transferred to the created metrics | `[]` | -| `metrics.podMonitor.sampleLimit` | Limit of how many samples should be scraped from every Pod | `false` | -| `metrics.podMonitor.targetLimit` | Limit of how many targets should be scraped | `false` | -| `metrics.podMonitor.additionalEndpoints` | Additional endpoints to scrape (e.g sentinel) | `[]` | -| `metrics.prometheusRule.enabled` | Create a custom prometheusRule Resource for scraping metrics using PrometheusOperator | `false` | -| `metrics.prometheusRule.namespace` | The namespace in which the prometheusRule will be created | `""` | -| `metrics.prometheusRule.additionalLabels` | Additional labels for the prometheusRule | `{}` | -| `metrics.prometheusRule.rules` | Custom Prometheus rules | `[]` | - -### Init Container Parameters - -| Name | Description | Value | -| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | -------------------------- | -| `volumePermissions.enabled` | Enable init container that changes the owner/group of the PV mount point to `runAsUser:fsGroup` | `false` | -| `volumePermissions.image.registry` | OS Shell + Utility image registry | `REGISTRY_NAME` | -| `volumePermissions.image.repository` | OS Shell + Utility image repository | `REPOSITORY_NAME/os-shell` | -| `volumePermissions.image.digest` | OS Shell + Utility image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | -| `volumePermissions.image.pullPolicy` | OS Shell + Utility image pull policy | `IfNotPresent` | -| `volumePermissions.image.pullSecrets` | OS Shell + Utility image pull secrets | `[]` | -| `volumePermissions.resources.limits` | The resources limits for the init container | `{}` | -| `volumePermissions.resources.requests` | The requested resources for the init container | `{}` | -| `volumePermissions.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `nil` | -| `volumePermissions.containerSecurityContext.runAsUser` | Set init container's Security Context runAsUser | `0` | -| `sysctl.enabled` | Enable init container to modify Kernel settings | `false` | -| `sysctl.image.registry` | OS Shell + Utility image registry | `REGISTRY_NAME` | -| `sysctl.image.repository` | OS Shell + Utility image repository | `REPOSITORY_NAME/os-shell` | -| `sysctl.image.digest` | OS Shell + Utility image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""` | -| `sysctl.image.pullPolicy` | OS Shell + Utility image pull policy | `IfNotPresent` | -| `sysctl.image.pullSecrets` | OS Shell + Utility image pull secrets | `[]` | -| `sysctl.command` | Override default init-sysctl container command (useful when using custom images) | `[]` | -| `sysctl.mountHostSys` | Mount the host `/sys` folder to `/host-sys` | `false` | -| `sysctl.resources.limits` | The resources limits for the init container | `{}` | -| `sysctl.resources.requests` | The requested resources for the init container | `{}` | - -### useExternalDNS Parameters - -| Name | Description | Value | -| -------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- | -| `useExternalDNS.enabled` | Enable various syntax that would enable external-dns to work. Note this requires a working installation of `external-dns` to be usable. | `false` | -| `useExternalDNS.additionalAnnotations` | Extra annotations to be utilized when `external-dns` is enabled. | `{}` | -| `useExternalDNS.annotationKey` | The annotation key utilized when `external-dns` is enabled. Setting this to `false` will disable annotations. | `external-dns.alpha.kubernetes.io/` | -| `useExternalDNS.suffix` | The DNS suffix utilized when `external-dns` is enabled. Note that we prepend the suffix with the full name of the release. | `""` | - -Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example, - -```console -helm install my-release \ - --set auth.password=secretpassword \ - oci://REGISTRY_NAME/REPOSITORY_NAME/redis -``` - -> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. - -The above command sets the Redis® server password to `secretpassword`. - -> NOTE: Once this chart is deployed, it is not possible to change the application's access credentials, such as usernames or passwords, using Helm. To change these application credentials after deployment, delete any persistent volumes (PVs) used by the chart and re-deploy it, or use the application's built-in administrative tools if available. - -Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example, - -```console -helm install my-release -f values.yaml oci://REGISTRY_NAME/REPOSITORY_NAME/redis -``` - -> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. -> **Tip**: You can use the default [values.yaml](https://github.com/bitnami/charts/tree/main/bitnami/redis/values.yaml) - -## Configuration and installation details - -### [Rolling VS Immutable tags](https://docs.bitnami.com/tutorials/understand-rolling-tags-containers) - -It is strongly recommended to use immutable tags in a production environment. This ensures your deployment does not change automatically if the same tag is updated with a different image. - -Bitnami will release a new chart updating its containers if a new version of the main container, significant changes, or critical vulnerabilities exist. - -### Use a different Redis® version - -To modify the application version used in this chart, specify a different version of the image using the `image.tag` parameter and/or a different repository using the `image.repository` parameter. - -### Bootstrapping with an External Cluster - -This chart is equipped with the ability to bring online a set of Pods that connect to an existing Redis deployment that lies outside of Kubernetes. This effectively creates a hybrid Redis Deployment where both Pods in Kubernetes and Instances such as Virtual Machines can partake in a single Redis Deployment. This is helpful in situations where one may be migrating Redis from Virtual Machines into Kubernetes, for example. To take advantage of this, use the following as an example configuration: - -```yaml -replica: - externalMaster: - enabled: true - host: external-redis-0.internal -sentinel: - externalMaster: - enabled: true - host: external-redis-0.internal -``` - -:warning: This is currently limited to clusters in which Sentinel and Redis run on the same node! :warning: - -Please also note that the external sentinel must be listening on port `26379`, and this is currently not configurable. - -Once the Kubernetes Redis Deployment is online and confirmed to be working with the existing cluster, the configuration can then be removed and the cluster will remain connected. - -### External DNS - -This chart is equipped to allow leveraging the ExternalDNS project. Doing so will enable ExternalDNS to publish the FQDN for each instance, in the format of `..`. -Example, when using the following configuration: - -```yaml -useExternalDNS: - enabled: true - suffix: prod.example.org - additionalAnnotations: - ttl: 10 -``` - -On a cluster where the name of the Helm release is `a`, the hostname of a Pod is generated as: `a-redis-node-0.a-redis.prod.example.org`. The IP of that FQDN will match that of the associated Pod. This modifies the following parameters of the Redis/Sentinel configuration using this new FQDN: - -- `replica-announce-ip` -- `known-sentinel` -- `known-replica` -- `announce-ip` - -:warning: This requires a working installation of `external-dns` to be fully functional. :warning: - -See the [official ExternalDNS documentation](https://github.com/kubernetes-sigs/external-dns) for additional configuration options. - -### Cluster topologies - -#### Default: Master-Replicas - -When installing the chart with `architecture=replication`, it will deploy a Redis® master StatefulSet and a Redis® replicas StatefulSet. The replicas will be read-replicas of the master. Two services will be exposed: - -- Redis® Master service: Points to the master, where read-write operations can be performed -- Redis® Replicas service: Points to the replicas, where only read operations are allowed by default. - -In case the master crashes, the replicas will wait until the master node is respawned again by the Kubernetes Controller Manager. - -#### Standalone - -When installing the chart with `architecture=standalone`, it will deploy a standalone Redis® StatefulSet. A single service will be exposed: - -- Redis® Master service: Points to the master, where read-write operations can be performed - -#### Master-Replicas with Sentinel - -When installing the chart with `architecture=replication` and `sentinel.enabled=true`, it will deploy a Redis® master StatefulSet (only one master allowed) and a Redis® replicas StatefulSet. In this case, the pods will contain an extra container with Redis® Sentinel. This container will form a cluster of Redis® Sentinel nodes, which will promote a new master in case the actual one fails. - -On graceful termination of the Redis® master pod, a failover of the master is initiated to promote a new master. The Redis® Sentinel container in this pod will wait for the failover to occur before terminating. If `sentinel.redisShutdownWaitFailover=true` is set (the default), the Redis® container will wait for the failover as well before terminating. This increases availability for reads during failover, but may cause stale reads until all clients have switched to the new master. - -In addition to this, only one service is exposed: - -- Redis® service: Exposes port 6379 for Redis® read-only operations and port 26379 for accessing Redis® Sentinel. - -For read-only operations, access the service using port 6379. For write operations, it's necessary to access the Redis® Sentinel cluster and query the current master using the command below (using redis-cli or similar): - -```console -SENTINEL get-master-addr-by-name -``` - -This command will return the address of the current master, which can be accessed from inside the cluster. - -In case the current master crashes, the Sentinel containers will elect a new master node. - -`master.count` greater than `1` is not designed for use when `sentinel.enabled=true`. - -### Multiple masters (experimental) - -When `master.count` is greater than `1`, special care must be taken to create a consistent setup. - -An example of use case is the creation of a redundant set of standalone masters or master-replicas per Kubernetes node where you must ensure: - -- No more than `1` master can be deployed per Kubernetes node -- Replicas and writers can only see the single master of their own Kubernetes node - -One way of achieving this is by setting `master.service.internalTrafficPolicy=Local` in combination with a `master.affinity.podAntiAffinity` spec to never schedule more than one master per Kubernetes node. - -It's recommended to only change `master.count` if you know what you are doing. -`master.count` greater than `1` is not designed for use when `sentinel.enabled=true`. - -### Using a password file - -To use a password file for Redis® you need to create a secret containing the password and then deploy the chart using that secret. Follow these instructions: - -- Create the secret with the password. It is important that the file with the password must be called `redis-password`. - -```console -kubectl create secret generic redis-password-secret --from-file=redis-password.yaml -``` - -- Deploy the Helm Chart using the secret name as parameter: - -```text -usePassword=true -usePasswordFile=true -existingSecret=redis-password-secret -sentinels.enabled=true -metrics.enabled=true -``` - -### Securing traffic using TLS - -TLS support can be enabled in the chart by specifying the `tls.` parameters while creating a release. The following parameters should be configured to properly enable the TLS support in the cluster: - -- `tls.enabled`: Enable TLS support. Defaults to `false` -- `tls.existingSecret`: Name of the secret that contains the certificates. No defaults. -- `tls.certFilename`: Certificate filename. No defaults. -- `tls.certKeyFilename`: Certificate key filename. No defaults. -- `tls.certCAFilename`: CA Certificate filename. No defaults. - -For example: - -First, create the secret with the certificates files: - -```console -kubectl create secret generic certificates-tls-secret --from-file=./cert.pem --from-file=./cert.key --from-file=./ca.pem -``` - -Then, use the following parameters: - -```console -tls.enabled="true" -tls.existingSecret="certificates-tls-secret" -tls.certFilename="cert.pem" -tls.certKeyFilename="cert.key" -tls.certCAFilename="ca.pem" -``` - -### Metrics - -The chart optionally can start a metrics exporter for [prometheus](https://prometheus.io). The metrics endpoint (port 9121) is exposed in the service. Metrics can be scraped from within the cluster using something similar as the described in the [example Prometheus scrape configuration](https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus-kubernetes.yml). If metrics are to be scraped from outside the cluster, the Kubernetes API proxy can be utilized to access the endpoint. - -If you have enabled TLS by specifying `tls.enabled=true` you also need to specify TLS option to the metrics exporter. You can do that via `metrics.extraArgs`. You can find the metrics exporter CLI flags for TLS [here](https://github.com/oliver006/redis_exporter#command-line-flags). For example: - -You can either specify `metrics.extraArgs.skip-tls-verification=true` to skip TLS verification or providing the following values under `metrics.extraArgs` for TLS client authentication: - -```console -tls-client-key-file -tls-client-cert-file -tls-ca-cert-file -``` - -### Deploy a custom metrics script in the sidecar - -A custom Lua script can be added to the `redis-exporter` sidecar by way of the `metrics.extraArgs.script` parameter. The pathname of the script must exist on the container, or the `redis_exporter` process (and therefore the whole pod) will refuse to start. The script can be provided to the sidecar containers via the `metrics.extraVolumes` and `metrics.extraVolumeMounts` parameters: - -```yaml -metrics: - extraVolumeMounts: - - name: '{{ printf "%s-metrics-script-file" (include "common.names.fullname" .) }}' - mountPath: '{{ printf "/mnt/%s/" (include "common.names.name" .) }}' - readOnly: true - extraVolumes: - - name: '{{ printf "%s-metrics-script-file" (include "common.names.fullname" .) }}' - configMap: - name: '{{ printf "%s-metrics-script" (include "common.names.fullname" .) }}' - extraArgs: - script: '{{ printf "/mnt/%s/my_custom_metrics.lua" (include "common.names.name" .) }}' -``` - -Then deploy the script into the correct location via `extraDeploy`: - -```yaml -extraDeploy: - - apiVersion: v1 - kind: ConfigMap - metadata: - name: '{{ printf "%s-metrics-script" (include "common.names.fullname" .) }}' - data: - my_custom_metrics.lua: | - -- LUA SCRIPT CODE HERE, e.g., - return {'bitnami_makes_the_best_charts', '1'} -``` - -### Host Kernel Settings - -Redis® may require some changes in the kernel of the host machine to work as expected, in particular increasing the `somaxconn` value and disabling transparent huge pages. To do so, you can set up a privileged `initContainer` with the `sysctlImage` config values, for example: - -```yaml -sysctlImage: - enabled: true - mountHostSys: true - command: - - /bin/sh - - -c - - |- - install_packages procps - sysctl -w net.core.somaxconn=10000 - echo never > /host-sys/kernel/mm/transparent_hugepage/enabled -``` - -Alternatively, for Kubernetes 1.12+ you can set `securityContext.sysctls` which will configure `sysctls` for master and slave pods. Example: - -```yaml -securityContext: - sysctls: - - name: net.core.somaxconn - value: "10000" -``` - -Note that this will not disable transparent huge tables. - -## Persistence - -By default, the chart mounts a [Persistent Volume](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) at the `/data` path. The volume is created using dynamic volume provisioning. If a Persistent Volume Claim already exists, specify it during installation. - -### Existing PersistentVolumeClaim - -1. Create the PersistentVolume -2. Create the PersistentVolumeClaim -3. Install the chart - -```console -helm install my-release --set master.persistence.existingClaim=PVC_NAME oci://REGISTRY_NAME/REPOSITORY_NAME/redis -``` - -> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. - -## Backup and restore - -To backup and restore Redis deployments on Kubernetes, you will need to create a snapshot of the data in the source cluster, and later restore it in a new cluster with the new parameters. Follow the instructions below: - -### Step 1: Backup the deployment - -- Connect to one of the nodes and start the Redis CLI tool. Then, run the commands below: - - ```text - $ kubectl exec -it my-release-master-0 bash - $ redis-cli - 127.0.0.1:6379> auth your_current_redis_password - OK - 127.0.0.1:6379> save - OK - ``` - -- Copy the dump file from the Redis node: - - ```console - kubectl cp my-release-master-0:/data/dump.rdb dump.rdb -c redis - ``` - -### Step 2: Restore the data on the destination cluster - -To restore the data in a new cluster, you will need to create a PVC and then upload the *dump.rdb* file to the new volume. - -Follow the following steps: - -- In the [*values.yaml*](https://github.com/bitnami/charts/blob/main/bitnami/redis/values.yaml) file set the *appendonly* parameter to *no*. You can skip this step if it is already configured as *no* - - ```yaml - commonConfiguration: |- - # Enable AOF https://redis.io/topics/persistence#append-only-file - appendonly no - # Disable RDB persistence, AOF persistence already enabled. - save "" - ``` - - > *Note that the `Enable AOF` comment belongs to the original config file and what you're actually doing is disabling it. This change will only be neccessary for the temporal cluster you're creating to upload the dump.* - -- Start the new cluster to create the PVCs. Use the command below as an example: - - ```console - helm install new-redis -f values.yaml . --set cluster.enabled=true --set cluster.slaveCount=3 - ``` - -- Now that the PVC were created, stop it and copy the *dump.rdp* file on the persisted data by using a helping pod. - - ```text - $ helm delete new-redis - - $ kubectl run --generator=run-pod/v1 -i --rm --tty volpod --overrides=' - { - "apiVersion": "v1", - "kind": "Pod", - "metadata": { - "name": "redisvolpod" - }, - "spec": { - "containers": [{ - "command": [ - "tail", - "-f", - "/dev/null" - ], - "image": "bitnami/minideb", - "name": "mycontainer", - "volumeMounts": [{ - "mountPath": "/mnt", - "name": "redisdata" - }] - }], - "restartPolicy": "Never", - "volumes": [{ - "name": "redisdata", - "persistentVolumeClaim": { - "claimName": "redis-data-new-redis-master-0" - } - }] - } - }' --image="bitnami/minideb" - - $ kubectl cp dump.rdb redisvolpod:/mnt/dump.rdb - $ kubectl delete pod volpod - ``` - -- Restart the cluster: - - > **INFO:** The *appendonly* parameter can be safely restored to your desired value. - - ```console - helm install new-redis -f values.yaml . --set cluster.enabled=true --set cluster.slaveCount=3 - ``` - -## NetworkPolicy - -To enable network policy for Redis®, install [a networking plugin that implements the Kubernetes NetworkPolicy spec](https://kubernetes.io/docs/tasks/administer-cluster/declare-network-policy#before-you-begin), and set `networkPolicy.enabled` to `true`. - -With NetworkPolicy enabled, only pods with the generated client label will be able to connect to Redis. This label will be displayed in the output after a successful install. - -With `networkPolicy.ingressNSMatchLabels` pods from other namespaces can connect to Redis. Set `networkPolicy.ingressNSPodMatchLabels` to match pod labels in matched namespace. For example, for a namespace labeled `redis=external` and pods in that namespace labeled `redis-client=true` the fields should be set: - -```yaml -networkPolicy: - enabled: true - ingressNSMatchLabels: - redis: external - ingressNSPodMatchLabels: - redis-client: true -``` - -### Setting Pod's affinity - -This chart allows you to set your custom affinity using the `XXX.affinity` parameter(s). Find more information about Pod's affinity in the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity). - -As an alternative, you can use of the preset configurations for pod affinity, pod anti-affinity, and node affinity available at the [bitnami/common](https://github.com/bitnami/charts/tree/main/bitnami/common#affinities) chart. To do so, set the `XXX.podAffinityPreset`, `XXX.podAntiAffinityPreset`, or `XXX.nodeAffinityPreset` parameters. - -## Troubleshooting - -Find more information about how to deal with common errors related to Bitnami's Helm charts in [this troubleshooting guide](https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues). - -## Upgrading - -A major chart version change (like v1.2.3 -> v2.0.0) indicates that there is an incompatible breaking change needing manual actions. - -### RDB compatibility - -It's common to have RDB format changes across Redis® releases where we see backward compatibility but no forward compatibility. For example, v7.0 can load an RDB created by v6.2 , but the opposite is not true. -When that's the case, the rolling update can cause replicas to temporarily stop synchronizing while they are running a lower version than master. -For example, on a rolling update `master-0` and `replica-2` are updated first from version v6.2 to v7.0; `replica-0` and `replica-1` won't be able to start a full sync with `master-0` because they are still running v6.2 and can't support the RDB format from version 7.0 that master is now using. -This issue can be mitigated by splitting the upgrade into two stages: one for all replicas and another for any master. - -- Stage 1 (replicas only, as there's no master with an ordinal higher than 99): -`helm upgrade oci://REGISTRY_NAME/REPOSITORY_NAME/redis --set master.updateStrategy.rollingUpdate.partition=99` -- Stage 2 (anything else that is not up to date, in this case only master): -`helm upgrade oci://REGISTRY_NAME/REPOSITORY_NAME/redis` - -### To 18.0.0 - -This major version updates the Redis® docker image version used from `7.0` to `7.2`, the new stable version. There are no major changes in the chart, but we recommend checking the [Redis® 7.2 release notes](https://raw.githubusercontent.com/redis/redis/7.2/00-RELEASENOTES) before upgrading. - -NOTE: Due to an error in our release process, versions higher or equal than 17.15.4 already use 7.2 by default. - -### To 17.0.0 - -This major version updates the Redis® docker image version used from `6.2` to `7.0`, the new stable version. There are no major changes in the chart, but we recommend checking the [Redis® 7.0 release notes](https://raw.githubusercontent.com/redis/redis/7.0/00-RELEASENOTES) before upgrading. - -### To 16.0.0 - -This major release renames several values in this chart and adds missing features, in order to be inline with the rest of assets in the Bitnami charts repository. - -Affected values: - -- `master.service.port` renamed as `master.service.ports.redis`. -- `master.service.nodePort` renamed as `master.service.nodePorts.redis`. -- `replica.service.port` renamed as `replica.service.ports.redis`. -- `replica.service.nodePort` renamed as `replica.service.nodePorts.redis`. -- `sentinel.service.port` renamed as `sentinel.service.ports.redis`. -- `sentinel.service.sentinelPort` renamed as `sentinel.service.ports.sentinel`. -- `master.containerPort` renamed as `master.containerPorts.redis`. -- `replica.containerPort` renamed as `replica.containerPorts.redis`. -- `sentinel.containerPort` renamed as `sentinel.containerPorts.sentinel`. -- `master.spreadConstraints` renamed as `master.topologySpreadConstraints` -- `replica.spreadConstraints` renamed as `replica.topologySpreadConstraints` - -### To 15.0.0 - -The parameter to enable the usage of StaticIDs was removed. The behavior is to [always use StaticIDs](https://github.com/bitnami/charts/pull/7278). - -### To 14.8.0 - -The Redis® sentinel exporter was removed in this version because the upstream project was deprecated. The regular Redis® exporter is included in the sentinel scenario as usual. - -### To 14.0.0 - -- Several parameters were renamed or disappeared in favor of new ones on this major version: - - The term *slave* has been replaced by the term *replica*. Therefore, parameters prefixed with `slave` are now prefixed with `replicas`. - - Credentials parameter are reorganized under the `auth` parameter. - - `cluster.enabled` parameter is deprecated in favor of `architecture` parameter that accepts two values: `standalone` and `replication`. - - `securityContext.*` is deprecated in favor of `XXX.podSecurityContext` and `XXX.containerSecurityContext`. - - `sentinel.metrics.*` parameters are deprecated in favor of `metrics.sentinel.*` ones. -- New parameters to add custom command, environment variables, sidecars, init containers, etc. were added. -- Chart labels were adapted to follow the [Helm charts standard labels](https://helm.sh/docs/chart_best_practices/labels/#standard-labels). -- values.yaml metadata was adapted to follow the format supported by [Readme Generator for Helm](https://github.com/bitnami/readme-generator-for-helm). - -Consequences: - -Backwards compatibility is not guaranteed. To upgrade to `14.0.0`, install a new release of the Redis® chart, and migrate the data from your previous release. You have 2 alternatives to do so: - -- Create a backup of the database, and restore it on the new release as explained in the [Backup and restore](#backup-and-restore) section. -- Reuse the PVC used to hold the master data on your previous release. To do so, use the `master.persistence.existingClaim` parameter. The following example assumes that the release name is `redis`: - -```console -helm install redis oci://REGISTRY_NAME/REPOSITORY_NAME/redis --set auth.password=[PASSWORD] --set master.persistence.existingClaim=[EXISTING_PVC] -``` - -> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. - -| Note: you need to substitute the placeholder *[EXISTING_PVC]* with the name of the PVC used on your previous release, and *[PASSWORD]* with the password used in your previous release. - -### To 13.0.0 - -This major version updates the Redis® docker image version used from `6.0` to `6.2`, the new stable version. There are no major changes in the chart and there shouldn't be any breaking changes in it as `6.2` is basically a stricter superset of `6.0`. For more information, please refer to [Redis® 6.2 release notes](https://raw.githubusercontent.com/redis/redis/6.2/00-RELEASENOTES). - -### To 12.3.0 - -This version also introduces `bitnami/common`, a [library chart](https://helm.sh/docs/topics/library_charts/#helm) as a dependency. More documentation about this new utility could be found [here](https://github.com/bitnami/charts/tree/main/bitnami/common#bitnami-common-library-chart). Please, make sure that you have updated the chart dependencies before executing any upgrade. - -### To 12.0.0 - -[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. - -#### What changes were introduced in this major version? - -- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. -- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts - -#### Considerations when upgrading to this version - -- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues -- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore -- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 - -#### Useful links - -- -- -- - -### To 11.0.0 - -When using sentinel, a new statefulset called `-node` was introduced. This will break upgrading from a previous version where the statefulsets are called master and slave. Hence the PVC will not match the new naming and won't be reused. If you want to keep your data, you will need to perform a backup and then a restore the data in this new version. - -When deployed with sentinel enabled, only a group of nodes is deployed and the master/slave role is handled in the group. To avoid breaking the compatibility, the settings for this nodes are given through the `slave.xxxx` parameters in `values.yaml` - -### To 10.0.0 - -For releases with `usePassword: true`, the value `sentinel.usePassword` controls whether the password authentication also applies to the sentinel port. This defaults to `true` for a secure configuration, however it is possible to disable to account for the following cases: - -- Using a version of redis-sentinel prior to `5.0.1` where the authentication feature was introduced. -- Where redis clients need to be updated to support sentinel authentication. - -If using a master/slave topology, or with `usePassword: false`, no action is required. - -### To 9.0.0 - -The metrics exporter has been changed from a separate deployment to a sidecar container, due to the latest changes in the Redis® exporter code. Check the [official page](https://github.com/oliver006/redis_exporter/) for more information. The metrics container image was changed from oliver006/redis_exporter to bitnami/redis-exporter (Bitnami's maintained package of oliver006/redis_exporter). - -### To 8.0.18 - -For releases with `metrics.enabled: true` the default tag for the exporter image is now `v1.x.x`. This introduces many changes including metrics names. You'll want to use [this dashboard](https://github.com/oliver006/redis_exporter/blob/master/contrib/grafana_prometheus_redis_dashboard.json) now. Please see the [redis_exporter github page](https://github.com/oliver006/redis_exporter#upgrading-from-0x-to-1x) for more details. - -### To 7.0.0 - -This version causes a change in the Redis® Master StatefulSet definition, so the command helm upgrade would not work out of the box. As an alternative, one of the following could be done: - -- Recommended: Create a clone of the Redis® Master PVC (for example, using projects like [this one](https://github.com/edseymour/pvc-transfer)). Then launch a fresh release reusing this cloned PVC. - -```console -helm install my-release oci://REGISTRY_NAME/REPOSITORY_NAME/redis --set persistence.existingClaim= -``` - -> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. - -- Alternative (not recommended, do at your own risk): `helm delete --purge` does not remove the PVC assigned to the Redis® Master StatefulSet. As a consequence, the following commands can be done to upgrade the release - -```console -helm delete --purge -helm install oci://REGISTRY_NAME/REPOSITORY_NAME/redis -``` - -> Note: You need to substitute the placeholders `REGISTRY_NAME` and `REPOSITORY_NAME` with a reference to your Helm chart registry and repository. For example, in the case of Bitnami, you need to use `REGISTRY_NAME=registry-1.docker.io` and `REPOSITORY_NAME=bitnamicharts`. - -Previous versions of the chart were not using persistence in the slaves, so this upgrade would add it to them. Another important change is that no values are inherited from master to slaves. For example, in 6.0.0 `slaves.readinessProbe.periodSeconds`, if empty, would be set to `master.readinessProbe.periodSeconds`. This approach lacked transparency and was difficult to maintain. From now on, all the slave parameters must be configured just as it is done with the masters. - -Some values have changed as well: - -- `master.port` and `slave.port` have been changed to `redisPort` (same value for both master and slaves) -- `master.securityContext` and `slave.securityContext` have been changed to `securityContext`(same values for both master and slaves) - -By default, the upgrade will not change the cluster topology. In case you want to use Redis® Sentinel, you must explicitly set `sentinel.enabled` to `true`. - -### To 6.0.0 - -Previous versions of the chart were using an init-container to change the permissions of the volumes. This was done in case the `securityContext` directive in the template was not enough for that (for example, with cephFS). In this new version of the chart, this container is disabled by default (which should not affect most of the deployments). If your installation still requires that init container, execute `helm upgrade` with the `--set volumePermissions.enabled=true`. - -### To 5.0.0 - -The default image in this release may be switched out for any image containing the `redis-server` -and `redis-cli` binaries. If `redis-server` is not the default image ENTRYPOINT, `master.command` -must be specified. - -#### Breaking changes - -- `master.args` and `slave.args` are removed. Use `master.command` or `slave.command` instead in order to override the image entrypoint, or `master.extraFlags` to pass additional flags to `redis-server`. -- `disableCommands` is now interpreted as an array of strings instead of a string of comma separated values. -- `master.persistence.path` now defaults to `/data`. - -### To 4.0.0 - -This version removes the `chart` label from the `spec.selector.matchLabels` -which is immutable since `StatefulSet apps/v1beta2`. It has been inadvertently -added, causing any subsequent upgrade to fail. See . - -It also fixes where a deployment `extensions/v1beta1` can not be upgraded if `spec.selector` is not explicitly set. - -Finally, it fixes by removing mutable labels in `spec.VolumeClaimTemplate.metadata.labels` so that it is upgradable. - -In order to upgrade, delete the Redis® StatefulSet before upgrading: - -```console -kubectl delete statefulsets.apps --cascade=false my-release-redis-master -``` - -And edit the Redis® slave (and metrics if enabled) deployment: - -```console -kubectl patch deployments my-release-redis-slave --type=json -p='[{"op": "remove", "path": "/spec/selector/matchLabels/chart"}]' -kubectl patch deployments my-release-redis-metrics --type=json -p='[{"op": "remove", "path": "/spec/selector/matchLabels/chart"}]' -``` - -## License - -Copyright © 2024 Broadcom. The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. - -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 - - - -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. diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/.helmignore b/thunder_deployment/infra/beta9/charts/redis/charts/common/.helmignore deleted file mode 100644 index 50af03172..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/.helmignore +++ /dev/null @@ -1,22 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/Chart.yaml b/thunder_deployment/infra/beta9/charts/redis/charts/common/Chart.yaml deleted file mode 100644 index 9a6aa881f..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/Chart.yaml +++ /dev/null @@ -1,23 +0,0 @@ -annotations: - category: Infrastructure - licenses: Apache-2.0 -apiVersion: v2 -appVersion: 2.14.1 -description: A Library Helm Chart for grouping common logic between bitnami charts. - This chart is not deployable by itself. -home: https://bitnami.com -icon: https://bitnami.com/downloads/logos/bitnami-mark.png -keywords: -- common -- helper -- template -- function -- bitnami -maintainers: -- name: VMware, Inc. - url: https://github.com/bitnami/charts -name: common -sources: -- https://github.com/bitnami/charts -type: library -version: 2.14.1 diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/README.md b/thunder_deployment/infra/beta9/charts/redis/charts/common/README.md deleted file mode 100644 index a76fa46a2..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/README.md +++ /dev/null @@ -1,235 +0,0 @@ -# Bitnami Common Library Chart - -A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between Bitnami charts. - -## TL;DR - -```yaml -dependencies: - - name: common - version: 2.x.x - repository: oci://registry-1.docker.io/bitnamicharts -``` - -```console -helm dependency update -``` - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.names.fullname" . }} -data: - myvalue: "Hello World" -``` - -Looking to use our applications in production? Try [VMware Tanzu Application Catalog](https://bitnami.com/enterprise), the enterprise edition of Bitnami Application Catalog. - -## Introduction - -This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. - -Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. - -## Prerequisites - -- Kubernetes 1.23+ -- Helm 3.8.0+ - -## Parameters - -## Special input schemas - -### ImageRoot - -```yaml -registry: - type: string - description: Docker registry where the image is located - example: docker.io - -repository: - type: string - description: Repository and image name - example: bitnami/nginx - -tag: - type: string - description: image tag - example: 1.16.1-debian-10-r63 - -pullPolicy: - type: string - description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' - -pullSecrets: - type: array - items: - type: string - description: Optionally specify an array of imagePullSecrets (evaluated as templates). - -debug: - type: boolean - description: Set to true if you would like to see extra information on logs - example: false - -## An instance would be: -# registry: docker.io -# repository: bitnami/nginx -# tag: 1.16.1-debian-10-r63 -# pullPolicy: IfNotPresent -# debug: false -``` - -### Persistence - -```yaml -enabled: - type: boolean - description: Whether enable persistence. - example: true - -storageClass: - type: string - description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. - example: "-" - -accessMode: - type: string - description: Access mode for the Persistent Volume Storage. - example: ReadWriteOnce - -size: - type: string - description: Size the Persistent Volume Storage. - example: 8Gi - -path: - type: string - description: Path to be persisted. - example: /bitnami - -## An instance would be: -# enabled: true -# storageClass: "-" -# accessMode: ReadWriteOnce -# size: 8Gi -# path: /bitnami -``` - -### ExistingSecret - -```yaml -name: - type: string - description: Name of the existing secret. - example: mySecret -keyMapping: - description: Mapping between the expected key name and the name of the key in the existing secret. - type: object - -## An instance would be: -# name: mySecret -# keyMapping: -# password: myPasswordKey -``` - -#### Example of use - -When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. - -```yaml -# templates/secret.yaml ---- -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "common.names.fullname" . }} - labels: - app: {{ include "common.names.fullname" . }} -type: Opaque -data: - password: {{ .Values.password | b64enc | quote }} - -# templates/dpl.yaml ---- -... - env: - - name: PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} - key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} -... - -# values.yaml ---- -name: mySecret -keyMapping: - password: myPasswordKey -``` - -### ValidateValue - -#### NOTES.txt - -```console -{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} - -{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} -``` - -If we force those values to be empty we will see some alerts - -```console -helm install test mychart --set path.to.value00="",path.to.value01="" - 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: - - export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) - - 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: - - export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) -``` - -## Upgrading - -### To 1.0.0 - -[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. - -#### What changes were introduced in this major version? - -- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. -- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. -- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts - -#### Considerations when upgrading to this version - -- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues -- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore -- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 - -#### Useful links - -- -- -- - -## License - -Copyright © 2023 VMware, Inc. - -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 - - - -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. diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_affinities.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_affinities.tpl deleted file mode 100644 index e85b1df45..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_affinities.tpl +++ /dev/null @@ -1,139 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} - -{{/* -Return a soft nodeAffinity definition -{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.soft" -}} -preferredDuringSchedulingIgnoredDuringExecution: - - preference: - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} - weight: 1 -{{- end -}} - -{{/* -Return a hard nodeAffinity definition -{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.hard" -}} -requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} -{{- end -}} - -{{/* -Return a nodeAffinity definition -{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.nodes.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.nodes.hard" . -}} - {{- end -}} -{{- end -}} - -{{/* -Return a topologyKey definition -{{ include "common.affinities.topologyKey" (dict "topologyKey" "BAR") -}} -*/}} -{{- define "common.affinities.topologyKey" -}} -{{ .topologyKey | default "kubernetes.io/hostname" -}} -{{- end -}} - -{{/* -Return a soft podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.soft" (dict "component" "FOO" "customLabels" .Values.podLabels "extraMatchLabels" .Values.extraMatchLabels "topologyKey" "BAR" "extraPodAffinityTerms" .Values.extraPodAffinityTerms "context" $) -}} -*/}} -{{- define "common.affinities.pods.soft" -}} -{{- $component := default "" .component -}} -{{- $customLabels := default (dict) .customLabels -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -{{- $extraPodAffinityTerms := default (list) .extraPodAffinityTerms -}} -preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" ( dict "customLabels" $customLabels "context" .context )) | nindent 10 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} - weight: 1 - {{- range $extraPodAffinityTerms }} - - podAffinityTerm: - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" ( dict "customLabels" $customLabels "context" $.context )) | nindent 10 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := .extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} - weight: {{ .weight | default 1 -}} - {{- end -}} -{{- end -}} - -{{/* -Return a hard podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.hard" (dict "component" "FOO" "customLabels" .Values.podLabels "extraMatchLabels" .Values.extraMatchLabels "topologyKey" "BAR" "extraPodAffinityTerms" .Values.extraPodAffinityTerms "context" $) -}} -*/}} -{{- define "common.affinities.pods.hard" -}} -{{- $component := default "" .component -}} -{{- $customLabels := default (dict) .customLabels -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -{{- $extraPodAffinityTerms := default (list) .extraPodAffinityTerms -}} -requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" ( dict "customLabels" $customLabels "context" .context )) | nindent 8 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} - {{- range $extraPodAffinityTerms }} - - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" ( dict "customLabels" $customLabels "context" $.context )) | nindent 8 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := .extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - topologyKey: {{ include "common.affinities.topologyKey" (dict "topologyKey" .topologyKey) }} - {{- end -}} -{{- end -}} - -{{/* -Return a podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.pods" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.pods.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.pods.hard" . -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_capabilities.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_capabilities.tpl deleted file mode 100644 index 115674af8..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_capabilities.tpl +++ /dev/null @@ -1,229 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} - -{{/* -Return the target Kubernetes version -*/}} -{{- define "common.capabilities.kubeVersion" -}} -{{- if .Values.global }} - {{- if .Values.global.kubeVersion }} - {{- .Values.global.kubeVersion -}} - {{- else }} - {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} - {{- end -}} -{{- else }} -{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for poddisruptionbudget. -*/}} -{{- define "common.capabilities.policy.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "policy/v1beta1" -}} -{{- else -}} -{{- print "policy/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for networkpolicy. -*/}} -{{- define "common.capabilities.networkPolicy.apiVersion" -}} -{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for cronjob. -*/}} -{{- define "common.capabilities.cronjob.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "batch/v1beta1" -}} -{{- else -}} -{{- print "batch/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for daemonset. -*/}} -{{- define "common.capabilities.daemonset.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for deployment. -*/}} -{{- define "common.capabilities.deployment.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for statefulset. -*/}} -{{- define "common.capabilities.statefulset.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apps/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for ingress. -*/}} -{{- define "common.capabilities.ingress.apiVersion" -}} -{{- if .Values.ingress -}} -{{- if .Values.ingress.apiVersion -}} -{{- .Values.ingress.apiVersion -}} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end }} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for RBAC resources. -*/}} -{{- define "common.capabilities.rbac.apiVersion" -}} -{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "rbac.authorization.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "rbac.authorization.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for CRDs. -*/}} -{{- define "common.capabilities.crd.apiVersion" -}} -{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiextensions.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiextensions.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for APIService. -*/}} -{{- define "common.capabilities.apiService.apiVersion" -}} -{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiregistration.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiregistration.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for Horizontal Pod Autoscaler. -*/}} -{{- define "common.capabilities.hpa.apiVersion" -}} -{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} -{{- if .beta2 -}} -{{- print "autoscaling/v2beta2" -}} -{{- else -}} -{{- print "autoscaling/v2beta1" -}} -{{- end -}} -{{- else -}} -{{- print "autoscaling/v2" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for Vertical Pod Autoscaler. -*/}} -{{- define "common.capabilities.vpa.apiVersion" -}} -{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} -{{- if .beta2 -}} -{{- print "autoscaling/v2beta2" -}} -{{- else -}} -{{- print "autoscaling/v2beta1" -}} -{{- end -}} -{{- else -}} -{{- print "autoscaling/v2" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if PodSecurityPolicy is supported -*/}} -{{- define "common.capabilities.psp.supported" -}} -{{- if semverCompare "<1.25-0" (include "common.capabilities.kubeVersion" .) -}} - {{- true -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if AdmissionConfiguration is supported -*/}} -{{- define "common.capabilities.admissionConfiguration.supported" -}} -{{- if semverCompare ">=1.23-0" (include "common.capabilities.kubeVersion" .) -}} - {{- true -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for AdmissionConfiguration. -*/}} -{{- define "common.capabilities.admissionConfiguration.apiVersion" -}} -{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiserver.config.k8s.io/v1alpha1" -}} -{{- else if semverCompare "<1.25-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiserver.config.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiserver.config.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for PodSecurityConfiguration. -*/}} -{{- define "common.capabilities.podSecurityConfiguration.apiVersion" -}} -{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "pod-security.admission.config.k8s.io/v1alpha1" -}} -{{- else if semverCompare "<1.25-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "pod-security.admission.config.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "pod-security.admission.config.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the used Helm version is 3.3+. -A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. -This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. -**To be removed when the catalog's minimun Helm version is 3.3** -*/}} -{{- define "common.capabilities.supportsHelmVersion" -}} -{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_errors.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_errors.tpl deleted file mode 100644 index 07ded6f64..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_errors.tpl +++ /dev/null @@ -1,28 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Through error when upgrading using empty passwords values that must not be empty. - -Usage: -{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} -{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} -{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} - -Required password params: - - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. - - context - Context - Required. Parent context. -*/}} -{{- define "common.errors.upgrade.passwords.empty" -}} - {{- $validationErrors := join "" .validationErrors -}} - {{- if and $validationErrors .context.Release.IsUpgrade -}} - {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} - {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} - {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} - {{- $errorString = print $errorString "\n%s" -}} - {{- printf $errorString $validationErrors | fail -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_images.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_images.tpl deleted file mode 100644 index 1bcb779df..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_images.tpl +++ /dev/null @@ -1,117 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper image name -{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" .Values.global ) }} -*/}} -{{- define "common.images.image" -}} -{{- $registryName := .imageRoot.registry -}} -{{- $repositoryName := .imageRoot.repository -}} -{{- $separator := ":" -}} -{{- $termination := .imageRoot.tag | toString -}} -{{- if .global }} - {{- if .global.imageRegistry }} - {{- $registryName = .global.imageRegistry -}} - {{- end -}} -{{- end -}} -{{- if .imageRoot.digest }} - {{- $separator = "@" -}} - {{- $termination = .imageRoot.digest | toString -}} -{{- end -}} -{{- if $registryName }} - {{- printf "%s/%s%s%s" $registryName $repositoryName $separator $termination -}} -{{- else -}} - {{- printf "%s%s%s" $repositoryName $separator $termination -}} -{{- end -}} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) -{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} -*/}} -{{- define "common.images.pullSecrets" -}} - {{- $pullSecrets := list }} - - {{- if .global }} - {{- range .global.imagePullSecrets -}} - {{- if kindIs "map" . -}} - {{- $pullSecrets = append $pullSecrets .name -}} - {{- else -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end }} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- if kindIs "map" . -}} - {{- $pullSecrets = append $pullSecrets .name -}} - {{- else -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets | uniq }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names evaluating values as templates -{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} -*/}} -{{- define "common.images.renderPullSecrets" -}} - {{- $pullSecrets := list }} - {{- $context := .context }} - - {{- if $context.Values.global }} - {{- range $context.Values.global.imagePullSecrets -}} - {{- if kindIs "map" . -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" .name "context" $context)) -}} - {{- else -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- if kindIs "map" . -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" .name "context" $context)) -}} - {{- else -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets | uniq }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} - -{{/* -Return the proper image version (ingores image revision/prerelease info & fallbacks to chart appVersion) -{{ include "common.images.version" ( dict "imageRoot" .Values.path.to.the.image "chart" .Chart ) }} -*/}} -{{- define "common.images.version" -}} -{{- $imageTag := .imageRoot.tag | toString -}} -{{/* regexp from https://github.com/Masterminds/semver/blob/23f51de38a0866c5ef0bfc42b3f735c73107b700/version.go#L41-L44 */}} -{{- if regexMatch `^([0-9]+)(\.[0-9]+)?(\.[0-9]+)?(-([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?(\+([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?$` $imageTag -}} - {{- $version := semver $imageTag -}} - {{- printf "%d.%d.%d" $version.Major $version.Minor $version.Patch -}} -{{- else -}} - {{- print .chart.AppVersion -}} -{{- end -}} -{{- end -}} - diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_ingress.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_ingress.tpl deleted file mode 100644 index efa5b85c7..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_ingress.tpl +++ /dev/null @@ -1,73 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} - -{{/* -Generate backend entry that is compatible with all Kubernetes API versions. - -Usage: -{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} - -Params: - - serviceName - String. Name of an existing service backend - - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.ingress.backend" -}} -{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} -{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} -serviceName: {{ .serviceName }} -servicePort: {{ .servicePort }} -{{- else -}} -service: - name: {{ .serviceName }} - port: - {{- if typeIs "string" .servicePort }} - name: {{ .servicePort }} - {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} - number: {{ .servicePort | int }} - {{- end }} -{{- end -}} -{{- end -}} - -{{/* -Print "true" if the API pathType field is supported -Usage: -{{ include "common.ingress.supportsPathType" . }} -*/}} -{{- define "common.ingress.supportsPathType" -}} -{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the ingressClassname field is supported -Usage: -{{ include "common.ingress.supportsIngressClassname" . }} -*/}} -{{- define "common.ingress.supportsIngressClassname" -}} -{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if cert-manager required annotations for TLS signed -certificates are set in the Ingress annotations -Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations -Usage: -{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} -*/}} -{{- define "common.ingress.certManagerRequest" -}} -{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") (hasKey .annotations "kubernetes.io/tls-acme") }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_labels.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_labels.tpl deleted file mode 100644 index d90a6cdc0..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_labels.tpl +++ /dev/null @@ -1,46 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} - -{{/* -Kubernetes standard labels -{{ include "common.labels.standard" (dict "customLabels" .Values.commonLabels "context" $) -}} -*/}} -{{- define "common.labels.standard" -}} -{{- if and (hasKey . "customLabels") (hasKey . "context") -}} -{{- $default := dict "app.kubernetes.io/name" (include "common.names.name" .context) "helm.sh/chart" (include "common.names.chart" .context) "app.kubernetes.io/instance" .context.Release.Name "app.kubernetes.io/managed-by" .context.Release.Service -}} -{{- with .context.Chart.AppVersion -}} -{{- $_ := set $default "app.kubernetes.io/version" . -}} -{{- end -}} -{{ template "common.tplvalues.merge" (dict "values" (list .customLabels $default) "context" .context) }} -{{- else -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -helm.sh/chart: {{ include "common.names.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- with .Chart.AppVersion }} -app.kubernetes.io/version: {{ . | quote }} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Labels used on immutable fields such as deploy.spec.selector.matchLabels or svc.spec.selector -{{ include "common.labels.matchLabels" (dict "customLabels" .Values.podLabels "context" $) -}} - -We don't want to loop over custom labels appending them to the selector -since it's very likely that it will break deployments, services, etc. -However, it's important to overwrite the standard labels if the user -overwrote them on metadata.labels fields. -*/}} -{{- define "common.labels.matchLabels" -}} -{{- if and (hasKey . "customLabels") (hasKey . "context") -}} -{{ merge (pick (include "common.tplvalues.render" (dict "value" .customLabels "context" .context) | fromYaml) "app.kubernetes.io/name" "app.kubernetes.io/instance") (dict "app.kubernetes.io/name" (include "common.names.name" .context) "app.kubernetes.io/instance" .context.Release.Name ) | toYaml }} -{{- else -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_names.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_names.tpl deleted file mode 100644 index a222924f1..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_names.tpl +++ /dev/null @@ -1,71 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "common.names.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "common.names.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "common.names.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a default fully qualified dependency name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -Usage: -{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} -*/}} -{{- define "common.names.dependency.fullname" -}} -{{- if .chartValues.fullnameOverride -}} -{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .chartName .chartValues.nameOverride -}} -{{- if contains $name .context.Release.Name -}} -{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Allow the release namespace to be overridden for multi-namespace deployments in combined charts. -*/}} -{{- define "common.names.namespace" -}} -{{- default .Release.Namespace .Values.namespaceOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a fully qualified app name adding the installation's namespace. -*/}} -{{- define "common.names.fullname.namespace" -}} -{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_secrets.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_secrets.tpl deleted file mode 100644 index 84dbe3803..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_secrets.tpl +++ /dev/null @@ -1,182 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Generate secret name. - -Usage: -{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/main/bitnami/common#existingsecret - - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.secrets.name" -}} -{{- $name := (include "common.names.fullname" .context) -}} - -{{- if .defaultNameSuffix -}} -{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{- with .existingSecret -}} -{{- if not (typeIs "string" .) -}} -{{- with .name -}} -{{- $name = . -}} -{{- end -}} -{{- else -}} -{{- $name = . -}} -{{- end -}} -{{- end -}} - -{{- printf "%s" $name -}} -{{- end -}} - -{{/* -Generate secret key. - -Usage: -{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/main/bitnami/common#existingsecret - - key - String - Required. Name of the key in the secret. -*/}} -{{- define "common.secrets.key" -}} -{{- $key := .key -}} - -{{- if .existingSecret -}} - {{- if not (typeIs "string" .existingSecret) -}} - {{- if .existingSecret.keyMapping -}} - {{- $key = index .existingSecret.keyMapping $.key -}} - {{- end -}} - {{- end }} -{{- end -}} - -{{- printf "%s" $key -}} -{{- end -}} - -{{/* -Generate secret password or retrieve one if already created. - -Usage: -{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - key - String - Required - Name of the key in the secret. - - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. - - length - int - Optional - Length of the generated random password. - - strong - Boolean - Optional - Whether to add symbols to the generated random password. - - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. - - context - Context - Required - Parent context. - - failOnNew - Boolean - Optional - Default to true. If set to false, skip errors adding new keys to existing secrets. - - skipB64enc - Boolean - Optional - Default to false. If set to true, no the secret will not be base64 encrypted. - - skipQuote - Boolean - Optional - Default to false. If set to true, no quotes will be added around the secret. -The order in which this function returns a secret password: - 1. Already existing 'Secret' resource - (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) - 2. Password provided via the values.yaml - (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) - 3. Randomly generated secret password - (A new random secret password with the length specified in the 'length' parameter will be generated and returned) - -*/}} -{{- define "common.secrets.passwords.manage" -}} - -{{- $password := "" }} -{{- $subchart := "" }} -{{- $chartName := default "" .chartName }} -{{- $passwordLength := default 10 .length }} -{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} -{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} -{{- $secretData := (lookup "v1" "Secret" (include "common.names.namespace" .context) .secret).data }} -{{- if $secretData }} - {{- if hasKey $secretData .key }} - {{- $password = index $secretData .key | b64dec }} - {{- else if not (eq .failOnNew false) }} - {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} - {{- else if $providedPasswordValue }} - {{- $password = $providedPasswordValue | toString }} - {{- end -}} -{{- else if $providedPasswordValue }} - {{- $password = $providedPasswordValue | toString }} -{{- else }} - - {{- if .context.Values.enabled }} - {{- $subchart = $chartName }} - {{- end -}} - - {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} - {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} - {{- $passwordValidationErrors := list $requiredPasswordError -}} - {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} - - {{- if .strong }} - {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} - {{- $password = randAscii $passwordLength }} - {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} - {{- $password = printf "%s%s" $subStr $password | toString | shuffle }} - {{- else }} - {{- $password = randAlphaNum $passwordLength }} - {{- end }} -{{- end -}} -{{- if not .skipB64enc }} -{{- $password = $password | b64enc }} -{{- end -}} -{{- if .skipQuote -}} -{{- printf "%s" $password -}} -{{- else -}} -{{- printf "%s" $password | quote -}} -{{- end -}} -{{- end -}} - -{{/* -Reuses the value from an existing secret, otherwise sets its value to a default value. - -Usage: -{{ include "common.secrets.lookup" (dict "secret" "secret-name" "key" "keyName" "defaultValue" .Values.myValue "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - key - String - Required - Name of the key in the secret. - - defaultValue - String - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. - - context - Context - Required - Parent context. - -*/}} -{{- define "common.secrets.lookup" -}} -{{- $value := "" -}} -{{- $secretData := (lookup "v1" "Secret" (include "common.names.namespace" .context) .secret).data -}} -{{- if and $secretData (hasKey $secretData .key) -}} - {{- $value = index $secretData .key -}} -{{- else if .defaultValue -}} - {{- $value = .defaultValue | toString | b64enc -}} -{{- end -}} -{{- if $value -}} -{{- printf "%s" $value -}} -{{- end -}} -{{- end -}} - -{{/* -Returns whether a previous generated secret already exists - -Usage: -{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - context - Context - Required - Parent context. -*/}} -{{- define "common.secrets.exists" -}} -{{- $secret := (lookup "v1" "Secret" (include "common.names.namespace" .context) .secret) }} -{{- if $secret }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_storage.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_storage.tpl deleted file mode 100644 index 16405a0f8..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_storage.tpl +++ /dev/null @@ -1,28 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper Storage Class -{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} -*/}} -{{- define "common.storage.class" -}} - -{{- $storageClass := .persistence.storageClass -}} -{{- if .global -}} - {{- if .global.storageClass -}} - {{- $storageClass = .global.storageClass -}} - {{- end -}} -{{- end -}} - -{{- if $storageClass -}} - {{- if (eq "-" $storageClass) -}} - {{- printf "storageClassName: \"\"" -}} - {{- else }} - {{- printf "storageClassName: %s" $storageClass -}} - {{- end -}} -{{- end -}} - -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_tplvalues.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_tplvalues.tpl deleted file mode 100644 index a8ed7637e..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_tplvalues.tpl +++ /dev/null @@ -1,38 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Renders a value that contains template perhaps with scope if the scope is present. -Usage: -{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $ ) }} -{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $ "scope" $app ) }} -*/}} -{{- define "common.tplvalues.render" -}} -{{- $value := typeIs "string" .value | ternary .value (.value | toYaml) }} -{{- if contains "{{" (toJson .value) }} - {{- if .scope }} - {{- tpl (cat "{{- with $.RelativeScope -}}" $value "{{- end }}") (merge (dict "RelativeScope" .scope) .context) }} - {{- else }} - {{- tpl $value .context }} - {{- end }} -{{- else }} - {{- $value }} -{{- end }} -{{- end -}} - -{{/* -Merge a list of values that contains template after rendering them. -Merge precedence is consistent with http://masterminds.github.io/sprig/dicts.html#merge-mustmerge -Usage: -{{ include "common.tplvalues.merge" ( dict "values" (list .Values.path.to.the.Value1 .Values.path.to.the.Value2) "context" $ ) }} -*/}} -{{- define "common.tplvalues.merge" -}} -{{- $dst := dict -}} -{{- range .values -}} -{{- $dst = include "common.tplvalues.render" (dict "value" . "context" $.context "scope" $.scope) | fromYaml | merge $dst -}} -{{- end -}} -{{ $dst | toYaml }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_utils.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_utils.tpl deleted file mode 100644 index bfbddf054..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_utils.tpl +++ /dev/null @@ -1,77 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Print instructions to get a secret value. -Usage: -{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} -*/}} -{{- define "common.utils.secret.getvalue" -}} -{{- $varname := include "common.utils.fieldToEnvVar" . -}} -export {{ $varname }}=$(kubectl get secret --namespace {{ include "common.names.namespace" .context | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) -{{- end -}} - -{{/* -Build env var name given a field -Usage: -{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} -*/}} -{{- define "common.utils.fieldToEnvVar" -}} - {{- $fieldNameSplit := splitList "-" .field -}} - {{- $upperCaseFieldNameSplit := list -}} - - {{- range $fieldNameSplit -}} - {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} - {{- end -}} - - {{ join "_" $upperCaseFieldNameSplit }} -{{- end -}} - -{{/* -Gets a value from .Values given -Usage: -{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} -*/}} -{{- define "common.utils.getValueFromKey" -}} -{{- $splitKey := splitList "." .key -}} -{{- $value := "" -}} -{{- $latestObj := $.context.Values -}} -{{- range $splitKey -}} - {{- if not $latestObj -}} - {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} - {{- end -}} - {{- $value = ( index $latestObj . ) -}} - {{- $latestObj = $value -}} -{{- end -}} -{{- printf "%v" (default "" $value) -}} -{{- end -}} - -{{/* -Returns first .Values key with a defined value or first of the list if all non-defined -Usage: -{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} -*/}} -{{- define "common.utils.getKeyFromList" -}} -{{- $key := first .keys -}} -{{- $reverseKeys := reverse .keys }} -{{- range $reverseKeys }} - {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} - {{- if $value -}} - {{- $key = . }} - {{- end -}} -{{- end -}} -{{- printf "%s" $key -}} -{{- end -}} - -{{/* -Checksum a template at "path" containing a *single* resource (ConfigMap,Secret) for use in pod annotations, excluding the metadata (see #18376). -Usage: -{{ include "common.utils.checksumTemplate" (dict "path" "/configmap.yaml" "context" $) }} -*/}} -{{- define "common.utils.checksumTemplate" -}} -{{- $obj := include (print .context.Template.BasePath .path) .context | fromYaml -}} -{{ omit $obj "apiVersion" "kind" "metadata" | toYaml | sha256sum }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_warnings.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_warnings.tpl deleted file mode 100644 index 66dffc1fe..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/_warnings.tpl +++ /dev/null @@ -1,19 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Warning about using rolling tag. -Usage: -{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} -*/}} -{{- define "common.warnings.rollingTag" -}} - -{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} -WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. -+info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ -{{- end }} - -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_cassandra.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_cassandra.tpl deleted file mode 100644 index eda9aada5..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_cassandra.tpl +++ /dev/null @@ -1,77 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Cassandra required passwords are not empty. - -Usage: -{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.cassandra.passwords" -}} - {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} - {{- $enabled := include "common.cassandra.values.enabled" . -}} - {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} - {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.dbUser.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled cassandra. - -Usage: -{{ include "common.cassandra.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.cassandra.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.cassandra.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key dbUser - -Usage: -{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.key.dbUser" -}} - {{- if .subchart -}} - cassandra.dbUser - {{- else -}} - dbUser - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mariadb.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mariadb.tpl deleted file mode 100644 index 17d83a2fd..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mariadb.tpl +++ /dev/null @@ -1,108 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MariaDB required passwords are not empty. - -Usage: -{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mariadb.passwords" -}} - {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mariadb.values.enabled" . -}} - {{- $architecture := include "common.mariadb.values.architecture" . -}} - {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mariadb. - -Usage: -{{ include "common.mariadb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mariadb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mariadb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.key.auth" -}} - {{- if .subchart -}} - mariadb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mongodb.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mongodb.tpl deleted file mode 100644 index bbb445b86..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mongodb.tpl +++ /dev/null @@ -1,113 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MongoDB® required passwords are not empty. - -Usage: -{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mongodb.passwords" -}} - {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mongodb.values.enabled" . -}} - {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} - {{- $architecture := include "common.mongodb.values.architecture" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} - {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} - - {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} - {{- if and $valueUsername $valueDatabase -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replicaset") -}} - {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mongodb. - -Usage: -{{ include "common.mongodb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mongodb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mongodb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.key.auth" -}} - {{- if .subchart -}} - mongodb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mysql.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mysql.tpl deleted file mode 100644 index ca3953f86..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_mysql.tpl +++ /dev/null @@ -1,108 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MySQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mysql.passwords" -}} - {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mysql.values.enabled" . -}} - {{- $architecture := include "common.mysql.values.architecture" . -}} - {{- $authPrefix := include "common.mysql.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mysql. - -Usage: -{{ include "common.mysql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mysql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mysql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.key.auth" -}} - {{- if .subchart -}} - mysql.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_postgresql.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_postgresql.tpl deleted file mode 100644 index 8c9aa570e..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_postgresql.tpl +++ /dev/null @@ -1,134 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate PostgreSQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.postgresql.passwords" -}} - {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} - {{- $enabled := include "common.postgresql.values.enabled" . -}} - {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} - {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} - - {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} - {{- if (eq $enabledReplication "true") -}} - {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to decide whether evaluate global values. - -Usage: -{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} -Params: - - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" -*/}} -{{- define "common.postgresql.values.use.global" -}} - {{- if .context.Values.global -}} - {{- if .context.Values.global.postgresql -}} - {{- index .context.Values.global.postgresql .key | quote -}} - {{- end -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.existingSecret" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} - - {{- if .subchart -}} - {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} - {{- else -}} - {{- default (.context.Values.existingSecret | quote) $globalValue -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled postgresql. - -Usage: -{{ include "common.postgresql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key postgressPassword. - -Usage: -{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.postgressPassword" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} - - {{- if not $globalValue -}} - {{- if .subchart -}} - postgresql.postgresqlPassword - {{- else -}} - postgresqlPassword - {{- end -}} - {{- else -}} - global.postgresql.postgresqlPassword - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled.replication. - -Usage: -{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.enabled.replication" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.replication.enabled -}} - {{- else -}} - {{- printf "%v" .context.Values.replication.enabled -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key replication.password. - -Usage: -{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.replicationPassword" -}} - {{- if .subchart -}} - postgresql.replication.password - {{- else -}} - replication.password - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_redis.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_redis.tpl deleted file mode 100644 index fc0d208dd..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_redis.tpl +++ /dev/null @@ -1,81 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Redis® required passwords are not empty. - -Usage: -{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.redis.passwords" -}} - {{- $enabled := include "common.redis.values.enabled" . -}} - {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} - {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} - - {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} - {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} - - {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} - {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} - {{- if eq $useAuth "true" -}} - {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled redis. - -Usage: -{{ include "common.redis.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.redis.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.redis.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right prefix path for the values - -Usage: -{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.redis.values.keys.prefix" -}} - {{- if .subchart -}}redis.{{- else -}}{{- end -}} -{{- end -}} - -{{/* -Checks whether the redis chart's includes the standarizations (version >= 14) - -Usage: -{{ include "common.redis.values.standarized.version" (dict "context" $) }} -*/}} -{{- define "common.redis.values.standarized.version" -}} - - {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} - {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} - - {{- if $standarizedAuthValues -}} - {{- true -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_validations.tpl b/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_validations.tpl deleted file mode 100644 index 31ceda871..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/templates/validations/_validations.tpl +++ /dev/null @@ -1,51 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate values must not be empty. - -Usage: -{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} -{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" -*/}} -{{- define "common.validations.values.multiple.empty" -}} - {{- range .required -}} - {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} - {{- end -}} -{{- end -}} - -{{/* -Validate a value must not be empty. - -Usage: -{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" - - subchart - String - Optional - Name of the subchart that the validated password is part of. -*/}} -{{- define "common.validations.values.single.empty" -}} - {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} - {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} - - {{- if not $value -}} - {{- $varname := "my-value" -}} - {{- $getCurrentValue := "" -}} - {{- if and .secret .field -}} - {{- $varname = include "common.utils.fieldToEnvVar" . -}} - {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} - {{- end -}} - {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} - {{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/charts/common/values.yaml b/thunder_deployment/infra/beta9/charts/redis/charts/common/values.yaml deleted file mode 100644 index 9abe0e154..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/charts/common/values.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright VMware, Inc. -# SPDX-License-Identifier: APACHE-2.0 - -## bitnami/common -## It is required by CI/CD tools and processes. -## @skip exampleValue -## -exampleValue: common-chart diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/NOTES.txt b/thunder_deployment/infra/beta9/charts/redis/templates/NOTES.txt deleted file mode 100644 index cc191dee6..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/NOTES.txt +++ /dev/null @@ -1,191 +0,0 @@ -CHART NAME: {{ .Chart.Name }} -CHART VERSION: {{ .Chart.Version }} -APP VERSION: {{ .Chart.AppVersion }} - -** Please be patient while the chart is being deployed ** - -{{- if .Values.diagnosticMode.enabled }} -The chart has been deployed in diagnostic mode. All probes have been disabled and the command has been overwritten with: - - command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 4 }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 4 }} - -Get the list of pods by executing: - - kubectl get pods --namespace {{ include "common.names.namespace" . }} -l app.kubernetes.io/instance={{ .Release.Name }} - -Access the pod you want to debug by executing - - kubectl exec --namespace {{ include "common.names.namespace" . }} -ti -- bash - -In order to replicate the container startup scripts execute this command: - -For Redis: - - /opt/bitnami/scripts/redis/entrypoint.sh /opt/bitnami/scripts/redis/run.sh - -{{- if .Values.sentinel.enabled }} - -For Redis Sentinel: - - /opt/bitnami/scripts/redis-sentinel/entrypoint.sh /opt/bitnami/scripts/redis-sentinel/run.sh - -{{- end }} -{{- else }} - -{{- if contains .Values.master.service.type "LoadBalancer" }} -{{- if not .Values.auth.enabled }} -{{ if and (not .Values.networkPolicy.enabled) (.Values.networkPolicy.allowExternal) }} - -------------------------------------------------------------------------------- - WARNING - - By specifying "master.service.type=LoadBalancer" and "auth.enabled=false" you have - most likely exposed the Redis® service externally without any authentication - mechanism. - - For security reasons, we strongly suggest that you switch to "ClusterIP" or - "NodePort". As alternative, you can also switch to "auth.enabled=true" - providing a valid password on "password" parameter. - -------------------------------------------------------------------------------- -{{- end }} -{{- end }} -{{- end }} - -{{- if eq .Values.architecture "replication" }} -{{- if .Values.sentinel.enabled }} - -Redis® can be accessed via port {{ .Values.sentinel.service.ports.redis }} on the following DNS name from within your cluster: - - {{ template "common.names.fullname" . }}.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }} for read only operations - -For read/write operations, first access the Redis® Sentinel cluster, which is available in port {{ .Values.sentinel.service.ports.sentinel }} using the same domain name above. - -{{- else }} - -Redis® can be accessed on the following DNS names from within your cluster: - - {{ printf "%s-master.%s.svc.%s" (include "common.names.fullname" .) (include "common.names.namespace" . ) .Values.clusterDomain }} for read/write operations (port {{ .Values.master.service.ports.redis }}) - {{ printf "%s-replicas.%s.svc.%s" (include "common.names.fullname" .) (include "common.names.namespace" . ) .Values.clusterDomain }} for read-only operations (port {{ .Values.replica.service.ports.redis }}) - -{{- end }} -{{- else }} - -Redis® can be accessed via port {{ .Values.master.service.ports.redis }} on the following DNS name from within your cluster: - - {{ template "common.names.fullname" . }}-master.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }} - -{{- end }} - -{{ if .Values.auth.enabled }} - -To get your password run: - - export REDIS_PASSWORD=$(kubectl get secret --namespace {{ include "common.names.namespace" . }} {{ template "redis.secretName" . }} -o jsonpath="{.data.redis-password}" | base64 -d) - -{{- end }} - -To connect to your Redis® server: - -1. Run a Redis® pod that you can use as a client: - - kubectl run --namespace {{ include "common.names.namespace" . }} redis-client --restart='Never' {{ if .Values.auth.enabled }} --env REDIS_PASSWORD=$REDIS_PASSWORD {{ end }} --image {{ template "redis.image" . }} --command -- sleep infinity - -{{- if .Values.tls.enabled }} - - Copy your TLS certificates to the pod: - - kubectl cp --namespace {{ include "common.names.namespace" . }} /path/to/client.cert redis-client:/tmp/client.cert - kubectl cp --namespace {{ include "common.names.namespace" . }} /path/to/client.key redis-client:/tmp/client.key - kubectl cp --namespace {{ include "common.names.namespace" . }} /path/to/CA.cert redis-client:/tmp/CA.cert - -{{- end }} - - Use the following command to attach to the pod: - - kubectl exec --tty -i redis-client \ - {{- if and (.Values.networkPolicy.enabled) (not .Values.networkPolicy.allowExternal) }}--labels="{{ template "common.names.fullname" . }}-client=true" \{{- end }} - --namespace {{ include "common.names.namespace" . }} -- bash - -2. Connect using the Redis® CLI: - -{{- if eq .Values.architecture "replication" }} - {{- if .Values.sentinel.enabled }} - {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h {{ template "common.names.fullname" . }} -p {{ .Values.sentinel.service.ports.redis }}{{ if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} # Read only operations - {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h {{ template "common.names.fullname" . }} -p {{ .Values.sentinel.service.ports.sentinel }}{{ if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} # Sentinel access - {{- else }} - {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h {{ printf "%s-master" (include "common.names.fullname" .) }}{{ if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} - {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h {{ printf "%s-replicas" (include "common.names.fullname" .) }}{{ if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} - {{- end }} -{{- else }} - {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h {{ template "common.names.fullname" . }}-master{{ if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} -{{- end }} - -{{- if and (.Values.networkPolicy.enabled) (not .Values.networkPolicy.allowExternal) }} - -Note: Since NetworkPolicy is enabled, only pods with label {{ template "common.names.fullname" . }}-client=true" will be able to connect to redis. - -{{- else }} - -To connect to your database from outside the cluster execute the following commands: - -{{- if and (eq .Values.architecture "replication") .Values.sentinel.enabled }} -{{- if contains "NodePort" .Values.sentinel.service.type }} - - export NODE_IP=$(kubectl get nodes --namespace {{ include "common.names.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}") - export NODE_PORT=$(kubectl get --namespace {{ include "common.names.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "common.names.fullname" . }}) - {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h $NODE_IP -p $NODE_PORT {{- if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} - -{{- else if contains "LoadBalancer" .Values.sentinel.service.type }} - - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - Watch the status with: 'kubectl get svc --namespace {{ include "common.names.namespace" . }} -w {{ template "common.names.fullname" . }}' - - export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.names.namespace" . }} {{ template "common.names.fullname" . }} --template "{{ "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}" }}") - {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h $SERVICE_IP -p {{ .Values.sentinel.service.ports.redis }} {{- if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} - -{{- else if contains "ClusterIP" .Values.sentinel.service.type }} - - kubectl port-forward --namespace {{ include "common.names.namespace" . }} svc/{{ template "common.names.fullname" . }} {{ .Values.sentinel.service.ports.redis }}:{{ .Values.sentinel.service.ports.redis }} & - {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h 127.0.0.1 -p {{ .Values.sentinel.service.ports.redis }} {{- if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} - -{{- end }} -{{- else }} -{{- if contains "NodePort" .Values.master.service.type }} - - export NODE_IP=$(kubectl get nodes --namespace {{ include "common.names.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}") - export NODE_PORT=$(kubectl get --namespace {{ include "common.names.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ printf "%s-master" (include "common.names.fullname" .) }}) - {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h $NODE_IP -p $NODE_PORT {{- if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} - -{{- else if contains "LoadBalancer" .Values.master.service.type }} - - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - Watch the status with: 'kubectl get svc --namespace {{ include "common.names.namespace" . }} -w {{ template "common.names.fullname" . }}' - - export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.names.namespace" . }} {{ printf "%s-master" (include "common.names.fullname" .) }} --template "{{ "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}" }}") - {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h $SERVICE_IP -p {{ .Values.master.service.ports.redis }} {{- if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} - -{{- else if contains "ClusterIP" .Values.master.service.type }} - - kubectl port-forward --namespace {{ include "common.names.namespace" . }} svc/{{ printf "%s-master" (include "common.names.fullname" .) }} {{ .Values.master.service.ports.redis }}:{{ .Values.master.service.ports.redis }} & - {{ if .Values.auth.enabled }}REDISCLI_AUTH="$REDIS_PASSWORD" {{ end }}redis-cli -h 127.0.0.1 -p {{ .Values.master.service.ports.redis }} {{- if .Values.tls.enabled }} --tls --cert /tmp/client.cert --key /tmp/client.key --cacert /tmp/CA.cert{{ end }} - -{{- end }} -{{- end }} - -{{- end }} -{{- end }} -{{- include "redis.checkRollingTags" . }} -{{- include "common.warnings.rollingTag" .Values.volumePermissions.image }} -{{- include "common.warnings.rollingTag" .Values.sysctl.image }} -{{- include "redis.validateValues" . }} - -{{- if and (eq .Values.architecture "replication") .Values.sentinel.enabled (eq .Values.sentinel.service.type "NodePort") (not .Release.IsUpgrade ) }} -{{- if $.Values.sentinel.service.nodePorts.sentinel }} -No need to upgrade, ports and nodeports have been set from values -{{- else }} -#!#!#!#!#!#!#!# IMPORTANT #!#!#!#!#!#!#!# -YOU NEED TO PERFORM AN UPGRADE FOR THE SERVICES AND WORKLOAD TO BE CREATED -{{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/_helpers.tpl b/thunder_deployment/infra/beta9/charts/redis/templates/_helpers.tpl deleted file mode 100644 index 9eb017f19..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/_helpers.tpl +++ /dev/null @@ -1,328 +0,0 @@ -{{/* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{/* vim: set filetype=mustache: */}} - -{{/* -Return the proper Redis image name -*/}} -{{- define "redis.image" -}} -{{ include "common.images.image" (dict "imageRoot" .Values.image "global" .Values.global) }} -{{- end -}} - -{{/* -Return the proper Redis Sentinel image name -*/}} -{{- define "redis.sentinel.image" -}} -{{ include "common.images.image" (dict "imageRoot" .Values.sentinel.image "global" .Values.global) }} -{{- end -}} - -{{/* -Return the proper image name (for the metrics image) -*/}} -{{- define "redis.metrics.image" -}} -{{ include "common.images.image" (dict "imageRoot" .Values.metrics.image "global" .Values.global) }} -{{- end -}} - -{{/* -Return the proper image name (for the init container volume-permissions image) -*/}} -{{- define "redis.volumePermissions.image" -}} -{{ include "common.images.image" (dict "imageRoot" .Values.volumePermissions.image "global" .Values.global) }} -{{- end -}} - -{{/* -Return sysctl image -*/}} -{{- define "redis.sysctl.image" -}} -{{ include "common.images.image" (dict "imageRoot" .Values.sysctl.image "global" .Values.global) }} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names -*/}} -{{- define "redis.imagePullSecrets" -}} -{{- include "common.images.renderPullSecrets" (dict "images" (list .Values.image .Values.sentinel.image .Values.metrics.image .Values.volumePermissions.image .Values.sysctl.image) "context" $) -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for networkpolicy. -*/}} -{{- define "networkPolicy.apiVersion" -}} -{{- if semverCompare ">=1.4-0, <1.7-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiGroup for PodSecurityPolicy. -*/}} -{{- define "podSecurityPolicy.apiGroup" -}} -{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "policy" -}} -{{- else -}} -{{- print "extensions" -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if a TLS secret object should be created -*/}} -{{- define "redis.createTlsSecret" -}} -{{- if and .Values.tls.enabled .Values.tls.autoGenerated (and (not .Values.tls.existingSecret) (not .Values.tls.certificatesSecret)) }} - {{- true -}} -{{- end -}} -{{- end -}} - -{{/* -Return the secret containing Redis TLS certificates -*/}} -{{- define "redis.tlsSecretName" -}} -{{- $secretName := coalesce .Values.tls.existingSecret .Values.tls.certificatesSecret -}} -{{- if $secretName -}} - {{- printf "%s" (tpl $secretName $) -}} -{{- else -}} - {{- printf "%s-crt" (include "common.names.fullname" .) -}} -{{- end -}} -{{- end -}} - -{{/* -Return the path to the cert file. -*/}} -{{- define "redis.tlsCert" -}} -{{- if (include "redis.createTlsSecret" . ) -}} - {{- printf "/opt/bitnami/redis/certs/%s" "tls.crt" -}} -{{- else -}} - {{- required "Certificate filename is required when TLS in enabled" .Values.tls.certFilename | printf "/opt/bitnami/redis/certs/%s" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the path to the cert key file. -*/}} -{{- define "redis.tlsCertKey" -}} -{{- if (include "redis.createTlsSecret" . ) -}} - {{- printf "/opt/bitnami/redis/certs/%s" "tls.key" -}} -{{- else -}} - {{- required "Certificate Key filename is required when TLS in enabled" .Values.tls.certKeyFilename | printf "/opt/bitnami/redis/certs/%s" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the path to the CA cert file. -*/}} -{{- define "redis.tlsCACert" -}} -{{- if (include "redis.createTlsSecret" . ) -}} - {{- printf "/opt/bitnami/redis/certs/%s" "ca.crt" -}} -{{- else -}} - {{- required "Certificate CA filename is required when TLS in enabled" .Values.tls.certCAFilename | printf "/opt/bitnami/redis/certs/%s" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the path to the DH params file. -*/}} -{{- define "redis.tlsDHParams" -}} -{{- if .Values.tls.dhParamsFilename -}} -{{- printf "/opt/bitnami/redis/certs/%s" .Values.tls.dhParamsFilename -}} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the shared service account to use -*/}} -{{- define "redis.serviceAccountName" -}} -{{- if .Values.serviceAccount.create -}} - {{ default (include "common.names.fullname" .) .Values.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the master service account to use -*/}} -{{- define "redis.masterServiceAccountName" -}} -{{- if .Values.master.serviceAccount.create -}} - {{ default (printf "%s-master" (include "common.names.fullname" .)) .Values.master.serviceAccount.name }} -{{- else -}} - {{- if .Values.serviceAccount.create -}} - {{ template "redis.serviceAccountName" . }} - {{- else -}} - {{ default "default" .Values.master.serviceAccount.name }} - {{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the replicas service account to use -*/}} -{{- define "redis.replicaServiceAccountName" -}} -{{- if .Values.replica.serviceAccount.create -}} - {{ default (printf "%s-replica" (include "common.names.fullname" .)) .Values.replica.serviceAccount.name }} -{{- else -}} - {{- if .Values.serviceAccount.create -}} - {{ template "redis.serviceAccountName" . }} - {{- else -}} - {{ default "default" .Values.replica.serviceAccount.name }} - {{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Return the configuration configmap name -*/}} -{{- define "redis.configmapName" -}} -{{- if .Values.existingConfigmap -}} - {{- printf "%s" (tpl .Values.existingConfigmap $) -}} -{{- else -}} - {{- printf "%s-configuration" (include "common.names.fullname" .) -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if a configmap object should be created -*/}} -{{- define "redis.createConfigmap" -}} -{{- if empty .Values.existingConfigmap }} - {{- true -}} -{{- end -}} -{{- end -}} - -{{/* -Get the password secret. -*/}} -{{- define "redis.secretName" -}} -{{- if .Values.auth.existingSecret -}} -{{- printf "%s" (tpl .Values.auth.existingSecret $) -}} -{{- else -}} -{{- printf "%s" (include "common.names.fullname" .) -}} -{{- end -}} -{{- end -}} - -{{/* -Get the password key to be retrieved from Redis® secret. -*/}} -{{- define "redis.secretPasswordKey" -}} -{{- if and .Values.auth.existingSecret .Values.auth.existingSecretPasswordKey -}} -{{- printf "%s" (tpl .Values.auth.existingSecretPasswordKey $) -}} -{{- else -}} -{{- printf "redis-password" -}} -{{- end -}} -{{- end -}} - - -{{/* -Returns the available value for certain key in an existing secret (if it exists), -otherwise it generates a random value. -*/}} -{{- define "getValueFromSecret" }} - {{- $len := (default 16 .Length) | int -}} - {{- $obj := (lookup "v1" "Secret" .Namespace .Name).data -}} - {{- if $obj }} - {{- index $obj .Key | b64dec -}} - {{- else -}} - {{- randAlphaNum $len -}} - {{- end -}} -{{- end }} - -{{/* -Return Redis® password -*/}} -{{- define "redis.password" -}} -{{- if or .Values.auth.enabled .Values.global.redis.password }} - {{- if not (empty .Values.global.redis.password) }} - {{- .Values.global.redis.password -}} - {{- else if not (empty .Values.auth.password) -}} - {{- .Values.auth.password -}} - {{- else -}} - {{- include "getValueFromSecret" (dict "Namespace" (include "common.names.namespace" .) "Name" (include "redis.secretName" .) "Length" 10 "Key" (include "redis.secretPasswordKey" .)) -}} - {{- end -}} -{{- end -}} -{{- end }} - -{{/* Check if there are rolling tags in the images */}} -{{- define "redis.checkRollingTags" -}} -{{- include "common.warnings.rollingTag" .Values.image }} -{{- include "common.warnings.rollingTag" .Values.sentinel.image }} -{{- include "common.warnings.rollingTag" .Values.metrics.image }} -{{- end -}} - -{{/* -Compile all warnings into a single message, and call fail. -*/}} -{{- define "redis.validateValues" -}} -{{- $messages := list -}} -{{- $messages := append $messages (include "redis.validateValues.topologySpreadConstraints" .) -}} -{{- $messages := append $messages (include "redis.validateValues.architecture" .) -}} -{{- $messages := append $messages (include "redis.validateValues.podSecurityPolicy.create" .) -}} -{{- $messages := append $messages (include "redis.validateValues.tls" .) -}} -{{- $messages := without $messages "" -}} -{{- $message := join "\n" $messages -}} - -{{- if $message -}} -{{- printf "\nVALUES VALIDATION:\n%s" $message | fail -}} -{{- end -}} -{{- end -}} - -{{/* Validate values of Redis® - spreadConstrainsts K8s version */}} -{{- define "redis.validateValues.topologySpreadConstraints" -}} -{{- if and (semverCompare "<1.16-0" .Capabilities.KubeVersion.GitVersion) .Values.replica.topologySpreadConstraints -}} -redis: topologySpreadConstraints - Pod Topology Spread Constraints are only available on K8s >= 1.16 - Find more information at https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ -{{- end -}} -{{- end -}} - -{{/* Validate values of Redis® - must provide a valid architecture */}} -{{- define "redis.validateValues.architecture" -}} -{{- if and (ne .Values.architecture "standalone") (ne .Values.architecture "replication") -}} -redis: architecture - Invalid architecture selected. Valid values are "standalone" and - "replication". Please set a valid architecture (--set architecture="xxxx") -{{- end -}} -{{- if and .Values.sentinel.enabled (not (eq .Values.architecture "replication")) }} -redis: architecture - Using redis sentinel on standalone mode is not supported. - To deploy redis sentinel, please select the "replication" mode - (--set "architecture=replication,sentinel.enabled=true") -{{- end -}} -{{- end -}} - -{{/* Validate values of Redis® - PodSecurityPolicy create */}} -{{- define "redis.validateValues.podSecurityPolicy.create" -}} -{{- if and .Values.podSecurityPolicy.create (not .Values.podSecurityPolicy.enabled) }} -redis: podSecurityPolicy.create - In order to create PodSecurityPolicy, you also need to enable - podSecurityPolicy.enabled field -{{- end -}} -{{- end -}} - -{{/* Validate values of Redis® - TLS enabled */}} -{{- define "redis.validateValues.tls" -}} -{{- if and .Values.tls.enabled (not .Values.tls.autoGenerated) (not .Values.tls.existingSecret) (not .Values.tls.certificatesSecret) }} -redis: tls.enabled - In order to enable TLS, you also need to provide - an existing secret containing the TLS certificates or - enable auto-generated certificates. -{{- end -}} -{{- end -}} - -{{/* Define the suffix utilized for external-dns */}} -{{- define "redis.externalDNS.suffix" -}} -{{ printf "%s.%s" (include "common.names.fullname" .) .Values.useExternalDNS.suffix }} -{{- end -}} - -{{/* Compile all annotations utilized for external-dns */}} -{{- define "redis.externalDNS.annotations" -}} -{{- if and .Values.useExternalDNS.enabled .Values.useExternalDNS.annotationKey }} -{{ .Values.useExternalDNS.annotationKey }}hostname: {{ include "redis.externalDNS.suffix" . }} -{{- range $key, $val := .Values.useExternalDNS.additionalAnnotations }} -{{ $.Values.useExternalDNS.annotationKey }}{{ $key }}: {{ $val | quote }} -{{- end }} -{{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/configmap.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/configmap.yaml deleted file mode 100644 index 6c370a2aa..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/configmap.yaml +++ /dev/null @@ -1,61 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if (include "redis.createConfigmap" .) }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ printf "%s-configuration" (include "common.names.fullname" .) }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -data: - redis.conf: |- - # User-supplied common configuration: - {{- if .Values.commonConfiguration }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonConfiguration "context" $ ) | nindent 4 }} - {{- end }} - # End of common configuration - master.conf: |- - dir {{ .Values.master.persistence.path }} - # User-supplied master configuration: - {{- if .Values.master.configuration }} - {{- include "common.tplvalues.render" ( dict "value" .Values.master.configuration "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.master.disableCommands }} - {{- range .Values.master.disableCommands }} - rename-command {{ . }} "" - {{- end }} - {{- end }} - # End of master configuration - replica.conf: |- - dir {{ .Values.replica.persistence.path }} - # User-supplied replica configuration: - {{- if .Values.replica.configuration }} - {{- include "common.tplvalues.render" ( dict "value" .Values.replica.configuration "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.replica.disableCommands }} - {{- range .Values.replica.disableCommands }} - rename-command {{ . }} "" - {{- end }} - {{- end }} - # End of replica configuration - {{- if .Values.sentinel.enabled }} - sentinel.conf: |- - dir "/tmp" - port {{ .Values.sentinel.containerPorts.sentinel }} - sentinel monitor {{ .Values.sentinel.masterSet }} {{ template "common.names.fullname" . }}-node-0.{{ template "common.names.fullname" . }}-headless.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }} {{ .Values.sentinel.service.ports.redis }} {{ .Values.sentinel.quorum }} - sentinel down-after-milliseconds {{ .Values.sentinel.masterSet }} {{ .Values.sentinel.downAfterMilliseconds }} - sentinel failover-timeout {{ .Values.sentinel.masterSet }} {{ .Values.sentinel.failoverTimeout }} - sentinel parallel-syncs {{ .Values.sentinel.masterSet }} {{ .Values.sentinel.parallelSyncs }} - # User-supplied sentinel configuration: - {{- if .Values.sentinel.configuration }} - {{- include "common.tplvalues.render" ( dict "value" .Values.sentinel.configuration "context" $ ) | nindent 4 }} - {{- end }} - # End of sentinel configuration - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/extra-list.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/extra-list.yaml deleted file mode 100644 index 2d35a580e..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/extra-list.yaml +++ /dev/null @@ -1,9 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- range .Values.extraDeploy }} ---- -{{ include "common.tplvalues.render" (dict "value" . "context" $) }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/headless-svc.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/headless-svc.yaml deleted file mode 100644 index e69329f82..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/headless-svc.yaml +++ /dev/null @@ -1,33 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -apiVersion: v1 -kind: Service -metadata: - name: {{ printf "%s-headless" (include "common.names.fullname" .) }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - annotations: - {{- if or .Values.sentinel.service.headless.annotations .Values.commonAnnotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.sentinel.service.headless.annotations .Values.commonAnnotations ) "context" . ) }} - {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} - {{- include "redis.externalDNS.annotations" . | nindent 4 }} -spec: - type: ClusterIP - clusterIP: None - {{- if .Values.sentinel.enabled }} - publishNotReadyAddresses: true - {{- end }} - ports: - - name: tcp-redis - port: {{ if .Values.sentinel.enabled }}{{ .Values.sentinel.service.ports.redis }}{{ else }}{{ .Values.master.service.ports.redis }}{{ end }} - targetPort: redis - {{- if .Values.sentinel.enabled }} - - name: tcp-sentinel - port: {{ .Values.sentinel.service.ports.sentinel }} - targetPort: redis-sentinel - {{- end }} - selector: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/health-configmap.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/health-configmap.yaml deleted file mode 100644 index 5d15b0639..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/health-configmap.yaml +++ /dev/null @@ -1,194 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ printf "%s-health" (include "common.names.fullname" .) }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -data: - ping_readiness_local.sh: |- - #!/bin/bash - - [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")" - [[ -n "$REDIS_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_PASSWORD" - response=$( - timeout -s 15 $1 \ - redis-cli \ - -h localhost \ -{{- if .Values.tls.enabled }} - -p $REDIS_TLS_PORT \ - --tls \ - --cacert {{ template "redis.tlsCACert" . }} \ - {{- if .Values.tls.authClients }} - --cert {{ template "redis.tlsCert" . }} \ - --key {{ template "redis.tlsCertKey" . }} \ - {{- end }} -{{- else }} - -p $REDIS_PORT \ -{{- end }} - ping - ) - if [ "$?" -eq "124" ]; then - echo "Timed out" - exit 1 - fi - if [ "$response" != "PONG" ]; then - echo "$response" - exit 1 - fi - ping_liveness_local.sh: |- - #!/bin/bash - - [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")" - [[ -n "$REDIS_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_PASSWORD" - response=$( - timeout -s 15 $1 \ - redis-cli \ - -h localhost \ -{{- if .Values.tls.enabled }} - -p $REDIS_TLS_PORT \ - --tls \ - --cacert {{ template "redis.tlsCACert" . }} \ - {{- if .Values.tls.authClients }} - --cert {{ template "redis.tlsCert" . }} \ - --key {{ template "redis.tlsCertKey" . }} \ - {{- end }} -{{- else }} - -p $REDIS_PORT \ -{{- end }} - ping - ) - if [ "$?" -eq "124" ]; then - echo "Timed out" - exit 1 - fi - responseFirstWord=$(echo $response | head -n1 | awk '{print $1;}') - if [ "$response" != "PONG" ] && [ "$responseFirstWord" != "LOADING" ] && [ "$responseFirstWord" != "MASTERDOWN" ]; then - echo "$response" - exit 1 - fi -{{- if .Values.sentinel.enabled }} - ping_sentinel.sh: |- - #!/bin/bash - -{{- if .Values.auth.sentinel }} - [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")" - [[ -n "$REDIS_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_PASSWORD" -{{- end }} - response=$( - timeout -s 15 $1 \ - redis-cli \ - -h localhost \ -{{- if .Values.tls.enabled }} - -p $REDIS_SENTINEL_TLS_PORT_NUMBER \ - --tls \ - --cacert "$REDIS_SENTINEL_TLS_CA_FILE" \ - {{- if .Values.tls.authClients }} - --cert "$REDIS_SENTINEL_TLS_CERT_FILE" \ - --key "$REDIS_SENTINEL_TLS_KEY_FILE" \ - {{- end }} -{{- else }} - -p $REDIS_SENTINEL_PORT \ -{{- end }} - ping - ) - if [ "$?" -eq "124" ]; then - echo "Timed out" - exit 1 - fi - if [ "$response" != "PONG" ]; then - echo "$response" - exit 1 - fi - parse_sentinels.awk: |- - /ip/ {FOUND_IP=1} - /port/ {FOUND_PORT=1} - /runid/ {FOUND_RUNID=1} - !/ip|port|runid/ { - if (FOUND_IP==1) { - IP=$1; FOUND_IP=0; - } - else if (FOUND_PORT==1) { - PORT=$1; - FOUND_PORT=0; - } else if (FOUND_RUNID==1) { - printf "\nsentinel known-sentinel {{ .Values.sentinel.masterSet }} %s %s %s", IP, PORT, $0; FOUND_RUNID=0; - } - } -{{- end }} - ping_readiness_master.sh: |- - #!/bin/bash - - [[ -f $REDIS_MASTER_PASSWORD_FILE ]] && export REDIS_MASTER_PASSWORD="$(< "${REDIS_MASTER_PASSWORD_FILE}")" - [[ -n "$REDIS_MASTER_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_MASTER_PASSWORD" - response=$( - timeout -s 15 $1 \ - redis-cli \ - -h $REDIS_MASTER_HOST \ - -p $REDIS_MASTER_PORT_NUMBER \ -{{- if .Values.tls.enabled }} - --tls \ - --cacert {{ template "redis.tlsCACert" . }} \ - {{- if .Values.tls.authClients }} - --cert {{ template "redis.tlsCert" . }} \ - --key {{ template "redis.tlsCertKey" . }} \ - {{- end }} -{{- end }} - ping - ) - if [ "$?" -eq "124" ]; then - echo "Timed out" - exit 1 - fi - if [ "$response" != "PONG" ]; then - echo "$response" - exit 1 - fi - ping_liveness_master.sh: |- - #!/bin/bash - - [[ -f $REDIS_MASTER_PASSWORD_FILE ]] && export REDIS_MASTER_PASSWORD="$(< "${REDIS_MASTER_PASSWORD_FILE}")" - [[ -n "$REDIS_MASTER_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_MASTER_PASSWORD" - response=$( - timeout -s 15 $1 \ - redis-cli \ - -h $REDIS_MASTER_HOST \ - -p $REDIS_MASTER_PORT_NUMBER \ -{{- if .Values.tls.enabled }} - --tls \ - --cacert {{ template "redis.tlsCACert" . }} \ - {{- if .Values.tls.authClients }} - --cert {{ template "redis.tlsCert" . }} \ - --key {{ template "redis.tlsCertKey" . }} \ - {{- end }} -{{- end }} - ping - ) - if [ "$?" -eq "124" ]; then - echo "Timed out" - exit 1 - fi - responseFirstWord=$(echo $response | head -n1 | awk '{print $1;}') - if [ "$response" != "PONG" ] && [ "$responseFirstWord" != "LOADING" ]; then - echo "$response" - exit 1 - fi - ping_readiness_local_and_master.sh: |- - script_dir="$(dirname "$0")" - exit_status=0 - "$script_dir/ping_readiness_local.sh" $1 || exit_status=$? - "$script_dir/ping_readiness_master.sh" $1 || exit_status=$? - exit $exit_status - ping_liveness_local_and_master.sh: |- - script_dir="$(dirname "$0")" - exit_status=0 - "$script_dir/ping_liveness_local.sh" $1 || exit_status=$? - "$script_dir/ping_liveness_master.sh" $1 || exit_status=$? - exit $exit_status diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/master/application.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/master/application.yaml deleted file mode 100644 index 84569b930..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/master/application.yaml +++ /dev/null @@ -1,532 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if gt (int64 .Values.master.count) 0 -}} -{{- if or (not (eq .Values.architecture "replication")) (not .Values.sentinel.enabled) }} -apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }} -kind: {{ .Values.master.kind }} -metadata: - name: {{ printf "%s-master" (include "common.names.fullname" .) }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: master - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - {{- if not (eq .Values.master.kind "DaemonSet") }} - replicas: {{ .Values.master.count }} - {{- end }} - {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.master.podLabels .Values.commonLabels ) "context" . ) }} - selector: - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }} - app.kubernetes.io/component: master - {{- if (eq .Values.master.kind "StatefulSet") }} - serviceName: {{ printf "%s-headless" (include "common.names.fullname" .) }} - {{- end }} - {{- if .Values.master.updateStrategy }} - {{- if (eq .Values.master.kind "Deployment") }} - strategy: {{- toYaml .Values.master.updateStrategy | nindent 4 }} - {{- else }} - updateStrategy: {{- toYaml .Values.master.updateStrategy | nindent 4 }} - {{- end }} - {{- if and .Values.master.minReadySeconds (semverCompare ">= 1.23-0" (include "common.capabilities.kubeVersion" .)) }} - minReadySeconds: {{ .Values.master.minReadySeconds }} - {{- end }} - {{- end }} - template: - metadata: - labels: {{- include "common.labels.standard" ( dict "customLabels" $podLabels "context" $ ) | nindent 8 }} - app.kubernetes.io/component: master - {{- if and .Values.metrics.enabled .Values.metrics.podLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.podLabels "context" $ ) | nindent 8 }} - {{- end }} - annotations: - {{- if (include "redis.createConfigmap" .) }} - checksum/configmap: {{ pick ( include (print $.Template.BasePath "/configmap.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} - {{- end }} - checksum/health: {{ pick ( include (print $.Template.BasePath "/health-configmap.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} - checksum/scripts: {{ pick ( include (print $.Template.BasePath "/scripts-configmap.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} - checksum/secret: {{ pick ( include (print $.Template.BasePath "/secret.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} - {{- if .Values.master.podAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.master.podAnnotations "context" $ ) | nindent 8 }} - {{- end }} - {{- if and .Values.metrics.enabled .Values.metrics.podAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.podAnnotations "context" $ ) | nindent 8 }} - {{- end }} - spec: - {{- include "redis.imagePullSecrets" . | nindent 6 }} - {{- if .Values.master.hostAliases }} - hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.master.hostAliases "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.master.podSecurityContext.enabled }} - securityContext: {{- omit .Values.master.podSecurityContext "enabled" | toYaml | nindent 8 }} - {{- end }} - serviceAccountName: {{ template "redis.masterServiceAccountName" . }} - automountServiceAccountToken: {{ .Values.master.automountServiceAccountToken }} - {{- if .Values.master.priorityClassName }} - priorityClassName: {{ .Values.master.priorityClassName | quote }} - {{- end }} - {{- if .Values.master.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.master.affinity "context" $) | nindent 8 }} - {{- else }} - affinity: - podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.master.podAffinityPreset "component" "master" "customLabels" $podLabels "context" $) | nindent 10 }} - podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.master.podAntiAffinityPreset "component" "master" "customLabels" $podLabels "context" $) | nindent 10 }} - nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.master.nodeAffinityPreset.type "key" .Values.master.nodeAffinityPreset.key "values" .Values.master.nodeAffinityPreset.values) | nindent 10 }} - {{- end }} - {{- if .Values.master.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.master.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.master.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.master.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.master.topologySpreadConstraints }} - topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.master.topologySpreadConstraints "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.master.shareProcessNamespace }} - shareProcessNamespace: {{ .Values.master.shareProcessNamespace }} - {{- end }} - {{- if .Values.master.schedulerName }} - schedulerName: {{ .Values.master.schedulerName | quote }} - {{- end }} - {{- if .Values.master.dnsPolicy }} - dnsPolicy: {{ .Values.master.dnsPolicy }} - {{- end }} - {{- if .Values.master.dnsConfig }} - dnsConfig: {{- include "common.tplvalues.render" (dict "value" .Values.master.dnsConfig "context" $) | nindent 8 }} - {{- end }} - enableServiceLinks: {{ .Values.master.enableServiceLinks }} - terminationGracePeriodSeconds: {{ .Values.master.terminationGracePeriodSeconds }} - containers: - - name: redis - image: {{ template "redis.image" . }} - imagePullPolicy: {{ .Values.image.pullPolicy | quote }} - {{- if .Values.master.lifecycleHooks }} - lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.master.lifecycleHooks "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.master.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.master.containerSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} - {{- else if .Values.master.command }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.master.command "context" $) | nindent 12 }} - {{- else }} - command: - - /bin/bash - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} - {{- else if .Values.master.args }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.master.args "context" $) | nindent 12 }} - {{- else }} - args: - - -c - - /opt/bitnami/scripts/start-scripts/start-master.sh - {{- end }} - env: - - name: BITNAMI_DEBUG - value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }} - - name: REDIS_REPLICATION_MODE - value: master - - name: ALLOW_EMPTY_PASSWORD - value: {{ ternary "no" "yes" .Values.auth.enabled | quote }} - {{- if .Values.auth.enabled }} - {{- if .Values.auth.usePasswordFiles }} - - name: REDIS_PASSWORD_FILE - value: "/opt/bitnami/redis/secrets/redis-password" - {{- else }} - - name: REDIS_PASSWORD - valueFrom: - secretKeyRef: - name: {{ template "redis.secretName" . }} - key: {{ template "redis.secretPasswordKey" . }} - {{- end }} - {{- end }} - - name: REDIS_TLS_ENABLED - value: {{ ternary "yes" "no" .Values.tls.enabled | quote }} - {{- if .Values.tls.enabled }} - - name: REDIS_TLS_PORT - value: {{ .Values.master.containerPorts.redis | quote }} - - name: REDIS_TLS_AUTH_CLIENTS - value: {{ ternary "yes" "no" .Values.tls.authClients | quote }} - - name: REDIS_TLS_CERT_FILE - value: {{ template "redis.tlsCert" . }} - - name: REDIS_TLS_KEY_FILE - value: {{ template "redis.tlsCertKey" . }} - - name: REDIS_TLS_CA_FILE - value: {{ template "redis.tlsCACert" . }} - {{- if .Values.tls.dhParamsFilename }} - - name: REDIS_TLS_DH_PARAMS_FILE - value: {{ template "redis.tlsDHParams" . }} - {{- end }} - {{- else }} - - name: REDIS_PORT - value: {{ .Values.master.containerPorts.redis | quote }} - {{- end }} - {{- if .Values.master.extraEnvVars }} - {{- include "common.tplvalues.render" (dict "value" .Values.master.extraEnvVars "context" $) | nindent 12 }} - {{- end }} - {{- if or .Values.master.extraEnvVarsCM .Values.master.extraEnvVarsSecret }} - envFrom: - {{- if .Values.master.extraEnvVarsCM }} - - configMapRef: - name: {{ .Values.master.extraEnvVarsCM }} - {{- end }} - {{- if .Values.master.extraEnvVarsSecret }} - - secretRef: - name: {{ .Values.master.extraEnvVarsSecret }} - {{- end }} - {{- end }} - ports: - - name: redis - containerPort: {{ .Values.master.containerPorts.redis }} - {{- if not .Values.diagnosticMode.enabled }} - {{- if .Values.master.customStartupProbe }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.master.customStartupProbe "context" $) | nindent 12 }} - {{- else if .Values.master.startupProbe.enabled }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.master.startupProbe "enabled") "context" $) | nindent 12 }} - tcpSocket: - port: redis - {{- end }} - {{- if .Values.master.customLivenessProbe }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.master.customLivenessProbe "context" $) | nindent 12 }} - {{- else if .Values.master.livenessProbe.enabled }} - livenessProbe: - initialDelaySeconds: {{ .Values.master.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.master.livenessProbe.periodSeconds }} - # One second longer than command timeout should prevent generation of zombie processes. - timeoutSeconds: {{ add1 .Values.master.livenessProbe.timeoutSeconds }} - successThreshold: {{ .Values.master.livenessProbe.successThreshold }} - failureThreshold: {{ .Values.master.livenessProbe.failureThreshold }} - exec: - command: - - sh - - -c - - /health/ping_liveness_local.sh {{ .Values.master.livenessProbe.timeoutSeconds }} - {{- end }} - {{- if .Values.master.customReadinessProbe }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.master.customReadinessProbe "context" $) | nindent 12 }} - {{- else if .Values.master.readinessProbe.enabled }} - readinessProbe: - initialDelaySeconds: {{ .Values.master.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.master.readinessProbe.periodSeconds }} - timeoutSeconds: {{ add1 .Values.master.readinessProbe.timeoutSeconds }} - successThreshold: {{ .Values.master.readinessProbe.successThreshold }} - failureThreshold: {{ .Values.master.readinessProbe.failureThreshold }} - exec: - command: - - sh - - -c - - /health/ping_readiness_local.sh {{ .Values.master.readinessProbe.timeoutSeconds }} - {{- end }} - {{- end }} - {{- if .Values.master.resources }} - resources: {{- toYaml .Values.master.resources | nindent 12 }} - {{- end }} - volumeMounts: - - name: start-scripts - mountPath: /opt/bitnami/scripts/start-scripts - - name: health - mountPath: /health - {{- if .Values.auth.usePasswordFiles }} - - name: redis-password - mountPath: /opt/bitnami/redis/secrets/ - {{- end }} - - name: redis-data - mountPath: {{ .Values.master.persistence.path }} - {{- if .Values.master.persistence.subPath }} - subPath: {{ .Values.master.persistence.subPath }} - {{- else if .Values.master.persistence.subPathExpr }} - subPathExpr: {{ .Values.master.persistence.subPathExpr }} - {{- end }} - - name: config - mountPath: /opt/bitnami/redis/mounted-etc - - name: redis-tmp-conf - mountPath: /opt/bitnami/redis/etc/ - - name: tmp - mountPath: /tmp - {{- if .Values.tls.enabled }} - - name: redis-certificates - mountPath: /opt/bitnami/redis/certs - readOnly: true - {{- end }} - {{- if .Values.master.extraVolumeMounts }} - {{- include "common.tplvalues.render" ( dict "value" .Values.master.extraVolumeMounts "context" $ ) | nindent 12 }} - {{- end }} - {{- if .Values.metrics.enabled }} - - name: metrics - image: {{ include "redis.metrics.image" . }} - imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }} - {{- if .Values.metrics.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.metrics.containerSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} - {{- else if .Values.metrics.command }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.command "context" $) | nindent 12 }} - {{- else }} - command: - - /bin/bash - - -c - - | - if [[ -f '/secrets/redis-password' ]]; then - export REDIS_PASSWORD=$(cat /secrets/redis-password) - fi - redis_exporter{{- range $key, $value := .Values.metrics.extraArgs }} --{{ $key }}={{ $value }}{{- end }} - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} - {{- end }} - env: - - name: REDIS_ALIAS - value: {{ template "common.names.fullname" . }} - {{- if .Values.auth.enabled }} - - name: REDIS_USER - value: default - {{- if (not .Values.auth.usePasswordFiles) }} - - name: REDIS_PASSWORD - valueFrom: - secretKeyRef: - name: {{ template "redis.secretName" . }} - key: {{ template "redis.secretPasswordKey" . }} - {{- end }} - {{- end }} - {{- if .Values.tls.enabled }} - - name: REDIS_ADDR - value: rediss://{{ .Values.metrics.redisTargetHost }}:{{ .Values.master.containerPorts.redis }} - {{- if .Values.tls.authClients }} - - name: REDIS_EXPORTER_TLS_CLIENT_KEY_FILE - value: {{ template "redis.tlsCertKey" . }} - - name: REDIS_EXPORTER_TLS_CLIENT_CERT_FILE - value: {{ template "redis.tlsCert" . }} - {{- end }} - - name: REDIS_EXPORTER_TLS_CA_CERT_FILE - value: {{ template "redis.tlsCACert" . }} - {{- end }} - {{- if .Values.metrics.extraEnvVars }} - {{- include "common.tplvalues.render" (dict "value" .Values.metrics.extraEnvVars "context" $) | nindent 12 }} - {{- end }} - ports: - - name: metrics - containerPort: 9121 - {{- if not .Values.diagnosticMode.enabled }} - {{- if .Values.metrics.customStartupProbe }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customStartupProbe "context" $) | nindent 12 }} - {{- else if .Values.metrics.startupProbe.enabled }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.startupProbe "enabled") "context" $) | nindent 12 }} - tcpSocket: - port: metrics - {{- end }} - {{- if .Values.metrics.customLivenessProbe }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customLivenessProbe "context" $) | nindent 12 }} - {{- else if .Values.metrics.livenessProbe.enabled }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.livenessProbe "enabled") "context" $) | nindent 12 }} - tcpSocket: - port: metrics - {{- end }} - {{- if .Values.metrics.customReadinessProbe }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customReadinessProbe "context" $) | nindent 12 }} - {{- else if .Values.metrics.readinessProbe.enabled }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.readinessProbe "enabled") "context" $) | nindent 12 }} - httpGet: - path: / - port: metrics - {{- end }} - {{- end }} - {{- if .Values.metrics.resources }} - resources: {{- toYaml .Values.metrics.resources | nindent 12 }} - {{- end }} - volumeMounts: - {{- if .Values.auth.usePasswordFiles }} - - name: redis-password - mountPath: /secrets/ - {{- end }} - {{- if .Values.tls.enabled }} - - name: redis-certificates - mountPath: /opt/bitnami/redis/certs - readOnly: true - {{- end }} - {{- if .Values.metrics.extraVolumeMounts }} - {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.extraVolumeMounts "context" $ ) | nindent 12 }} - {{- end }} - {{- end }} - {{- if .Values.master.sidecars }} - {{- include "common.tplvalues.render" (dict "value" .Values.master.sidecars "context" $) | nindent 8 }} - {{- end }} - {{- $needsVolumePermissions := and .Values.volumePermissions.enabled .Values.master.persistence.enabled .Values.master.podSecurityContext.enabled .Values.master.containerSecurityContext.enabled }} - {{- if or .Values.master.initContainers $needsVolumePermissions .Values.sysctl.enabled }} - initContainers: - {{- if .Values.master.initContainers }} - {{- include "common.tplvalues.render" (dict "value" .Values.master.initContainers "context" $) | nindent 8 }} - {{- end }} - {{- if $needsVolumePermissions }} - - name: volume-permissions - image: {{ include "redis.volumePermissions.image" . }} - imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }} - command: - - /bin/bash - - -ec - - | - {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} - chown -R `id -u`:`id -G | cut -d " " -f2` {{ .Values.master.persistence.path }} - {{- else }} - chown -R {{ .Values.master.containerSecurityContext.runAsUser }}:{{ .Values.master.podSecurityContext.fsGroup }} {{ .Values.master.persistence.path }} - {{- end }} - {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} - securityContext: {{- omit .Values.volumePermissions.containerSecurityContext "runAsUser" | toYaml | nindent 12 }} - {{- else }} - securityContext: {{- .Values.volumePermissions.containerSecurityContext | toYaml | nindent 12 }} - {{- end }} - {{- if .Values.volumePermissions.resources }} - resources: {{- toYaml .Values.volumePermissions.resources | nindent 12 }} - {{- end }} - volumeMounts: - - name: redis-data - mountPath: {{ .Values.master.persistence.path }} - {{- if .Values.master.persistence.subPath }} - subPath: {{ .Values.master.persistence.subPath }} - {{- else if .Values.master.persistence.subPathExpr }} - subPathExpr: {{ .Values.master.persistence.subPathExpr }} - {{- end }} - {{- end }} - {{- if .Values.sysctl.enabled }} - - name: init-sysctl - image: {{ include "redis.sysctl.image" . }} - imagePullPolicy: {{ default "" .Values.sysctl.image.pullPolicy | quote }} - securityContext: - privileged: true - runAsUser: 0 - {{- if .Values.sysctl.command }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.sysctl.command "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.sysctl.resources }} - resources: {{- toYaml .Values.sysctl.resources | nindent 12 }} - {{- end }} - {{- if .Values.sysctl.mountHostSys }} - volumeMounts: - - name: host-sys - mountPath: /host-sys - {{- end }} - {{- end }} - {{- end }} - volumes: - - name: start-scripts - configMap: - name: {{ printf "%s-scripts" (include "common.names.fullname" .) }} - defaultMode: 0755 - - name: health - configMap: - name: {{ printf "%s-health" (include "common.names.fullname" .) }} - defaultMode: 0755 - {{- if .Values.auth.usePasswordFiles }} - - name: redis-password - secret: - secretName: {{ template "redis.secretName" . }} - items: - - key: {{ template "redis.secretPasswordKey" . }} - path: redis-password - {{- end }} - - name: config - configMap: - name: {{ include "redis.configmapName" . }} - {{- if .Values.sysctl.mountHostSys }} - - name: host-sys - hostPath: - path: /sys - {{- end }} - - name: redis-tmp-conf - {{- if or .Values.master.persistence.medium .Values.master.persistence.sizeLimit }} - emptyDir: - {{- if .Values.master.persistence.medium }} - medium: {{ .Values.master.persistence.medium | quote }} - {{- end }} - {{- if .Values.master.persistence.sizeLimit }} - sizeLimit: {{ .Values.master.persistence.sizeLimit | quote }} - {{- end }} - {{- else }} - emptyDir: {} - {{- end }} - - name: tmp - {{- if or .Values.master.persistence.medium .Values.master.persistence.sizeLimit }} - emptyDir: - {{- if .Values.master.persistence.medium }} - medium: {{ .Values.master.persistence.medium | quote }} - {{- end }} - {{- if .Values.master.persistence.sizeLimit }} - sizeLimit: {{ .Values.master.persistence.sizeLimit | quote }} - {{- end }} - {{- else }} - emptyDir: {} - {{- end }} - {{- if .Values.tls.enabled }} - - name: redis-certificates - secret: - secretName: {{ include "redis.tlsSecretName" . }} - defaultMode: 256 - {{- end }} - {{- if .Values.master.extraVolumes }} - {{- include "common.tplvalues.render" ( dict "value" .Values.master.extraVolumes "context" $ ) | nindent 8 }} - {{- end }} - {{- if .Values.metrics.extraVolumes }} - {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.extraVolumes "context" $ ) | nindent 8 }} - {{- end }} - {{- if or (not .Values.master.persistence.enabled) (eq .Values.master.kind "DaemonSet") }} - - name: redis-data - {{- if or .Values.master.persistence.medium .Values.master.persistence.sizeLimit }} - emptyDir: - {{- if .Values.master.persistence.medium }} - medium: {{ .Values.master.persistence.medium | quote }} - {{- end }} - {{- if .Values.master.persistence.sizeLimit }} - sizeLimit: {{ .Values.master.persistence.sizeLimit | quote }} - {{- end }} - {{- else }} - emptyDir: {} - {{- end }} - {{- else if .Values.master.persistence.existingClaim }} - - name: redis-data - persistentVolumeClaim: - claimName: {{ printf "%s" (tpl .Values.master.persistence.existingClaim .) }} - {{- else if (eq .Values.master.kind "Deployment") }} - - name: redis-data - persistentVolumeClaim: - claimName: {{ printf "redis-data-%s-master" (include "common.names.fullname" .) }} - {{- else }} - {{- if .Values.master.persistentVolumeClaimRetentionPolicy.enabled }} - persistentVolumeClaimRetentionPolicy: - whenDeleted: {{ .Values.master.persistentVolumeClaimRetentionPolicy.whenDeleted }} - whenScaled: {{ .Values.master.persistentVolumeClaimRetentionPolicy.whenScaled }} - {{- end }} - volumeClaimTemplates: - - apiVersion: v1 - kind: PersistentVolumeClaim - metadata: - name: redis-data - {{- $claimLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.master.persistence.labels .Values.commonLabels ) "context" . ) }} - labels: {{- include "common.labels.matchLabels" ( dict "customLabels" $claimLabels "context" $ ) | nindent 10 }} - app.kubernetes.io/component: master - {{- if .Values.master.persistence.annotations }} - annotations: {{- toYaml .Values.master.persistence.annotations | nindent 10 }} - {{- end }} - spec: - accessModes: - {{- range .Values.master.persistence.accessModes }} - - {{ . | quote }} - {{- end }} - resources: - requests: - storage: {{ .Values.master.persistence.size | quote }} - {{- if .Values.master.persistence.selector }} - selector: {{- include "common.tplvalues.render" (dict "value" .Values.master.persistence.selector "context" $) | nindent 10 }} - {{- end }} - {{- if .Values.master.persistence.dataSource }} - dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.master.persistence.dataSource "context" $) | nindent 10 }} - {{- end }} - {{- include "common.storage.class" (dict "persistence" .Values.master.persistence "global" .Values.global) | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/master/psp.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/master/psp.yaml deleted file mode 100644 index 5a47afbf7..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/master/psp.yaml +++ /dev/null @@ -1,47 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and (include "common.capabilities.psp.supported" .) .Values.podSecurityPolicy.create }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ printf "%s-master" (include "common.names.fullname" .) }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - allowPrivilegeEscalation: false - fsGroup: - rule: 'MustRunAs' - ranges: - - min: {{ .Values.master.podSecurityContext.fsGroup }} - max: {{ .Values.master.podSecurityContext.fsGroup }} - hostIPC: false - hostNetwork: false - hostPID: false - privileged: false - readOnlyRootFilesystem: false - requiredDropCapabilities: - - ALL - runAsUser: - rule: 'MustRunAs' - ranges: - - min: {{ .Values.master.containerSecurityContext.runAsUser }} - max: {{ .Values.master.containerSecurityContext.runAsUser }} - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - - min: {{ .Values.master.containerSecurityContext.runAsUser }} - max: {{ .Values.master.containerSecurityContext.runAsUser }} - volumes: - - 'configMap' - - 'secret' - - 'emptyDir' - - 'persistentVolumeClaim' -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/master/pvc.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/master/pvc.yaml deleted file mode 100644 index 019f60d14..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/master/pvc.yaml +++ /dev/null @@ -1,33 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and (eq .Values.architecture "standalone") (eq .Values.master.kind "Deployment") (.Values.master.persistence.enabled) (not .Values.master.persistence.existingClaim) }} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ printf "redis-data-%s-master" (include "common.names.fullname" .) }} - namespace: {{ include "common.names.namespace" . | quote }} - {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.master.persistence.labels .Values.commonLabels ) "context" . ) }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: master - {{- if .Values.master.persistence.annotations }} - annotations: {{- toYaml .Values.master.persistence.annotations | nindent 4 }} - {{- end }} -spec: - accessModes: - {{- range .Values.master.persistence.accessModes }} - - {{ . | quote }} - {{- end }} - resources: - requests: - storage: {{ .Values.master.persistence.size | quote }} - {{- if .Values.master.persistence.selector }} - selector: {{- include "common.tplvalues.render" (dict "value" .Values.master.persistence.selector "context" $) | nindent 4 }} - {{- end }} - {{- if .Values.master.persistence.dataSource }} - dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.master.persistence.dataSource "context" $) | nindent 4 }} - {{- end }} - {{- include "common.storage.class" (dict "persistence" .Values.master.persistence "global" .Values.global) | nindent 2 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/master/service.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/master/service.yaml deleted file mode 100644 index ba744dbce..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/master/service.yaml +++ /dev/null @@ -1,62 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and (not .Values.sentinel.enabled) (gt (int64 .Values.master.count) 0) }} -apiVersion: v1 -kind: Service -metadata: - name: {{ printf "%s-master" (include "common.names.fullname" .) }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: master - {{- if or .Values.master.service.annotations .Values.commonAnnotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.master.service.annotations .Values.commonAnnotations ) "context" . ) }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} -spec: - type: {{ .Values.master.service.type }} - {{- if or (eq .Values.master.service.type "LoadBalancer") (eq .Values.master.service.type "NodePort") }} - externalTrafficPolicy: {{ .Values.master.service.externalTrafficPolicy | quote }} - {{- end }} - {{- if (semverCompare ">=1.22-0" (include "common.capabilities.kubeVersion" .)) }} - internalTrafficPolicy: {{ .Values.master.service.internalTrafficPolicy }} - {{- end }} - {{- if and (eq .Values.master.service.type "LoadBalancer") (not (empty .Values.master.service.loadBalancerIP)) }} - loadBalancerIP: {{ .Values.master.service.loadBalancerIP }} - {{- end }} - {{- if and (eq .Values.master.service.type "LoadBalancer") .Values.master.service.loadBalancerClass }} - loadBalancerClass: {{ .Values.master.service.loadBalancerClass }} - {{- end }} - {{- if and (eq .Values.master.service.type "LoadBalancer") (not (empty .Values.master.service.loadBalancerSourceRanges)) }} - loadBalancerSourceRanges: {{ toYaml .Values.master.service.loadBalancerSourceRanges | nindent 4 }} - {{- end }} - {{- if and .Values.master.service.clusterIP (eq .Values.master.service.type "ClusterIP") }} - clusterIP: {{ .Values.master.service.clusterIP }} - {{- end }} - {{- if .Values.master.service.sessionAffinity }} - sessionAffinity: {{ .Values.master.service.sessionAffinity }} - {{- end }} - {{- if .Values.master.service.sessionAffinityConfig }} - sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.master.service.sessionAffinityConfig "context" $) | nindent 4 }} - {{- end }} - {{- if .Values.master.service.externalIPs }} - externalIPs: {{- include "common.tplvalues.render" (dict "value" .Values.master.service.externalIPs "context" $) | nindent 4 }} - {{- end }} - ports: - - name: tcp-redis - port: {{ .Values.master.service.ports.redis }} - targetPort: redis - {{- if and (or (eq .Values.master.service.type "NodePort") (eq .Values.master.service.type "LoadBalancer")) .Values.master.service.nodePorts.redis}} - nodePort: {{ .Values.master.service.nodePorts.redis}} - {{- else if eq .Values.master.service.type "ClusterIP" }} - nodePort: null - {{- end }} - {{- if .Values.master.service.extraPorts }} - {{- include "common.tplvalues.render" (dict "value" .Values.master.service.extraPorts "context" $) | nindent 4 }} - {{- end }} - {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.master.podLabels .Values.commonLabels ) "context" . ) }} - selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: master -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/master/serviceaccount.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/master/serviceaccount.yaml deleted file mode 100644 index d442051de..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/master/serviceaccount.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.master.serviceAccount.create (or (not (eq .Values.architecture "replication")) (not .Values.sentinel.enabled)) }} -apiVersion: v1 -kind: ServiceAccount -automountServiceAccountToken: {{ .Values.master.serviceAccount.automountServiceAccountToken }} -metadata: - name: {{ template "redis.masterServiceAccountName" . }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if or .Values.master.serviceAccount.annotations .Values.commonAnnotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.master.serviceAccount.annotations .Values.commonAnnotations ) "context" . ) }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/metrics-svc.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/metrics-svc.yaml deleted file mode 100644 index 5e24b6d35..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/metrics-svc.yaml +++ /dev/null @@ -1,44 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if .Values.metrics.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ printf "%s-metrics" (include "common.names.fullname" .) }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: metrics - {{- if or .Values.metrics.service.annotations .Values.commonAnnotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.metrics.service.annotations .Values.commonAnnotations ) "context" . ) }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} -spec: - type: {{ .Values.metrics.service.type }} - {{- if and .Values.metrics.service.clusterIP (eq .Values.metrics.service.type "ClusterIP") }} - clusterIP: {{ .Values.metrics.service.clusterIP }} - {{- end }} - {{- if eq .Values.metrics.service.type "LoadBalancer" }} - externalTrafficPolicy: {{ .Values.metrics.service.externalTrafficPolicy }} - {{- end }} - {{- if and (eq .Values.metrics.service.type "LoadBalancer") .Values.metrics.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.metrics.service.loadBalancerIP }} - {{- end }} - {{- if and (eq .Values.metrics.service.type "LoadBalancer") .Values.metrics.service.loadBalancerClass }} - loadBalancerClass: {{ .Values.metrics.service.loadBalancerClass }} - {{- end }} - {{- if and (eq .Values.metrics.service.type "LoadBalancer") .Values.metrics.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: {{- toYaml .Values.metrics.service.loadBalancerSourceRanges | nindent 4 }} - {{- end }} - ports: - - name: http-metrics - port: {{ .Values.metrics.service.port }} - protocol: TCP - targetPort: metrics - {{- if .Values.metrics.service.extraPorts }} - {{- include "common.tplvalues.render" (dict "value" .Values.metrics.service.extraPorts "context" $) | nindent 4 }} - {{- end }} - selector: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/networkpolicy.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/networkpolicy.yaml deleted file mode 100644 index 84f5ada5d..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/networkpolicy.yaml +++ /dev/null @@ -1,105 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if .Values.networkPolicy.enabled }} -kind: NetworkPolicy -apiVersion: {{ template "networkPolicy.apiVersion" . }} -metadata: - name: {{ template "common.names.fullname" . }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - podSelector: - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 6 }} - policyTypes: - - Ingress - {{- if or (eq .Values.architecture "replication") .Values.networkPolicy.extraEgress }} - - Egress - egress: - {{- if eq .Values.architecture "replication" }} - # Allow dns resolution - - ports: - - port: 53 - protocol: UDP - # Allow outbound connections to other cluster pods - - ports: - - port: {{ .Values.master.containerPorts.redis }} - {{- if .Values.sentinel.enabled }} - - port: {{ .Values.sentinel.containerPorts.sentinel }} - {{- end }} - to: - - podSelector: - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 14 }} - {{- end }} - {{- if .Values.networkPolicy.extraEgress }} - {{- include "common.tplvalues.render" ( dict "value" .Values.networkPolicy.extraEgress "context" $ ) | nindent 4 }} - {{- end }} - {{- end }} - ingress: - # Allow inbound connections - - ports: - - port: {{ .Values.master.containerPorts.redis }} - {{- if .Values.sentinel.enabled }} - - port: {{ .Values.sentinel.containerPorts.sentinel }} - {{- end }} - {{- if not .Values.networkPolicy.allowExternal }} - from: - - podSelector: - matchLabels: - {{ template "common.names.fullname" . }}-client: "true" - - podSelector: - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 14 }} - {{- if or .Values.networkPolicy.ingressNSMatchLabels .Values.networkPolicy.ingressNSPodMatchLabels }} - - namespaceSelector: - matchLabels: - {{- if .Values.networkPolicy.ingressNSMatchLabels }} - {{- range $key, $value := .Values.networkPolicy.ingressNSMatchLabels }} - {{ $key | quote }}: {{ $value | quote }} - {{- end }} - {{ else }} - {} - {{- end }} - {{- if .Values.networkPolicy.ingressNSPodMatchLabels }} - podSelector: - matchLabels: - {{- range $key, $value := .Values.networkPolicy.ingressNSPodMatchLabels }} - {{ $key | quote }}: {{ $value | quote }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.metrics.enabled }} - # Allow prometheus scrapes for metrics - - ports: - - port: 9121 - {{- if not .Values.networkPolicy.metrics.allowExternal }} - from: - {{- if or .Values.networkPolicy.metrics.ingressNSMatchLabels .Values.networkPolicy.metrics.ingressNSPodMatchLabels }} - - namespaceSelector: - matchLabels: - {{- if .Values.networkPolicy.metrics.ingressNSMatchLabels }} - {{- range $key, $value := .Values.networkPolicy.metrics.ingressNSMatchLabels }} - {{ $key | quote }}: {{ $value | quote }} - {{- end }} - {{ else }} - {} - {{- end }} - {{- if .Values.networkPolicy.metrics.ingressNSPodMatchLabels }} - podSelector: - matchLabels: - {{- range $key, $value := .Values.networkPolicy.metrics.ingressNSPodMatchLabels }} - {{ $key | quote }}: {{ $value | quote }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.networkPolicy.extraIngress }} - {{- include "common.tplvalues.render" ( dict "value" .Values.networkPolicy.extraIngress "context" $ ) | nindent 4 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/pdb.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/pdb.yaml deleted file mode 100644 index d2ca15d9d..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/pdb.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if .Values.pdb.create }} -apiVersion: {{ include "common.capabilities.policy.apiVersion" . }} -kind: PodDisruptionBudget -metadata: - name: {{ template "common.names.fullname" . }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - {{- if .Values.pdb.minAvailable }} - minAvailable: {{ .Values.pdb.minAvailable }} - {{- end }} - {{- if .Values.pdb.maxUnavailable }} - maxUnavailable: {{ .Values.pdb.maxUnavailable }} - {{- end }} - selector: - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 6 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/podmonitor.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/podmonitor.yaml deleted file mode 100644 index c808aefeb..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/podmonitor.yaml +++ /dev/null @@ -1,69 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.metrics.enabled .Values.metrics.podMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: PodMonitor -metadata: - name: {{ template "common.names.fullname" . }} - namespace: {{ default (include "common.names.namespace" .) .Values.metrics.podMonitor.namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.metrics.podMonitor.additionalLabels }} - {{- include "common.tplvalues.render" (dict "value" .Values.metrics.podMonitor.additionalLabels "context" $) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - podMetricsEndpoints: - - port: http-metrics - {{- if .Values.metrics.podMonitor.interval }} - interval: {{ .Values.metrics.podMonitor.interval }} - {{- end }} - {{- if .Values.metrics.podMonitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.metrics.podMonitor.scrapeTimeout }} - {{- end }} - {{- if .Values.metrics.podMonitor.honorLabels }} - honorLabels: {{ .Values.metrics.podMonitor.honorLabels }} - {{- end }} - {{- if .Values.metrics.podMonitor.relabellings }} - relabelings: {{- toYaml .Values.metrics.podMonitor.relabellings | nindent 6 }} - {{- end }} - {{- if .Values.metrics.podMonitor.metricRelabelings }} - metricRelabelings: {{- toYaml .Values.metrics.podMonitor.metricRelabelings | nindent 6 }} - {{- end }} - {{- range .Values.metrics.podMonitor.additionalEndpoints }} - - port: {{ .port }} - {{- if .interval }} - interval: {{ .interval }} - {{- end }} - {{- if .path }} - path: {{ .path }} - {{- end }} - {{- if .params }} - params: - {{- range $key, $value := .params }} - {{ $key }}: - {{- range $value }} - - {{ . | quote }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.podTargetLabels }} - podTargetLabels: {{- toYaml .Values.metrics.podMonitor.podTargetLabels | nindent 4 }} - {{- end }} - {{- with .Values.metrics.podMonitor.sampleLimit -}} - sampleLimit: {{ . }} - {{- end }} - {{- with .Values.metrics.podMonitor.targetLimit -}} - targetLimit: {{ . }} - {{- end }} - namespaceSelector: - matchNames: - - {{ include "common.names.namespace" . | quote }} - selector: - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 6 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/prometheusrule.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/prometheusrule.yaml deleted file mode 100644 index 3406918b3..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/prometheusrule.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.metrics.enabled .Values.metrics.prometheusRule.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ template "common.names.fullname" . }} - namespace: {{ default (include "common.names.namespace" .) .Values.metrics.prometheusRule.namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.metrics.prometheusRule.additionalLabels }} - {{- include "common.tplvalues.render" (dict "value" .Values.metrics.prometheusRule.additionalLabels "context" $) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - groups: - - name: {{ include "common.names.fullname" . }} - rules: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.prometheusRule.rules "context" $ ) | nindent 8 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/replicas/application.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/replicas/application.yaml deleted file mode 100644 index aeb193ae1..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/replicas/application.yaml +++ /dev/null @@ -1,533 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and (eq .Values.architecture "replication") (not .Values.sentinel.enabled) }} -apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }} -kind: {{ .Values.replica.kind }} -metadata: - name: {{ printf "%s-replicas" (include "common.names.fullname" .) }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: replica - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - {{- if and (not (eq .Values.replica.kind "DaemonSet")) (not .Values.replica.autoscaling.enabled) }} - replicas: {{ .Values.replica.replicaCount }} - {{- end }} - {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.replica.podLabels .Values.commonLabels ) "context" . ) }} - selector: - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }} - app.kubernetes.io/component: replica - {{- if (eq .Values.replica.kind "StatefulSet") }} - serviceName: {{ printf "%s-headless" (include "common.names.fullname" .) }} - {{- end }} - {{- if .Values.replica.updateStrategy }} - updateStrategy: {{- toYaml .Values.replica.updateStrategy | nindent 4 }} - {{- end }} - {{- if and .Values.replica.minReadySeconds (semverCompare ">= 1.23-0" (include "common.capabilities.kubeVersion" .)) }} - minReadySeconds: {{ .Values.replica.minReadySeconds }} - {{- end }} - {{- if .Values.replica.podManagementPolicy }} - podManagementPolicy: {{ .Values.replica.podManagementPolicy | quote }} - {{- end }} - template: - metadata: - labels: {{- include "common.labels.standard" ( dict "customLabels" $podLabels "context" $ ) | nindent 8 }} - app.kubernetes.io/component: replica - {{- if and .Values.metrics.enabled .Values.metrics.podLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.podLabels "context" $ ) | nindent 8 }} - {{- end }} - annotations: - {{- if (include "redis.createConfigmap" .) }} - checksum/configmap: {{ pick ( include (print $.Template.BasePath "/configmap.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} - {{- end }} - checksum/health: {{ pick ( include (print $.Template.BasePath "/health-configmap.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} - checksum/scripts: {{ pick ( include (print $.Template.BasePath "/scripts-configmap.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} - checksum/secret: {{ pick ( include (print $.Template.BasePath "/secret.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} - {{- if .Values.replica.podAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.replica.podAnnotations "context" $ ) | nindent 8 }} - {{- end }} - {{- if and .Values.metrics.enabled .Values.metrics.podAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.podAnnotations "context" $ ) | nindent 8 }} - {{- end }} - spec: - {{- include "redis.imagePullSecrets" . | nindent 6 }} - {{- if .Values.replica.hostAliases }} - hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.replica.hostAliases "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.replica.podSecurityContext.enabled }} - securityContext: {{- omit .Values.replica.podSecurityContext "enabled" | toYaml | nindent 8 }} - {{- end }} - serviceAccountName: {{ template "redis.replicaServiceAccountName" . }} - automountServiceAccountToken: {{ .Values.replica.automountServiceAccountToken }} - {{- if .Values.replica.priorityClassName }} - priorityClassName: {{ .Values.replica.priorityClassName | quote }} - {{- end }} - {{- if .Values.replica.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.replica.affinity "context" $) | nindent 8 }} - {{- else }} - affinity: - podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.replica.podAffinityPreset "component" "replica" "customLabels" $podLabels "context" $) | nindent 10 }} - podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.replica.podAntiAffinityPreset "component" "replica" "customLabels" $podLabels "context" $) | nindent 10 }} - nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.replica.nodeAffinityPreset.type "key" .Values.replica.nodeAffinityPreset.key "values" .Values.replica.nodeAffinityPreset.values) | nindent 10 }} - {{- end }} - {{- if .Values.replica.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.replica.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.replica.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.replica.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.replica.topologySpreadConstraints }} - topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.replica.topologySpreadConstraints "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.replica.shareProcessNamespace }} - shareProcessNamespace: {{ .Values.replica.shareProcessNamespace }} - {{- end }} - {{- if .Values.replica.schedulerName }} - schedulerName: {{ .Values.replica.schedulerName | quote }} - {{- end }} - {{- if .Values.replica.dnsPolicy }} - dnsPolicy: {{ .Values.replica.dnsPolicy }} - {{- end }} - {{- if .Values.replica.dnsConfig }} - dnsConfig: {{- include "common.tplvalues.render" (dict "value" .Values.replica.dnsConfig "context" $) | nindent 8 }} - {{- end }} - enableServiceLinks: {{ .Values.replica.enableServiceLinks }} - terminationGracePeriodSeconds: {{ .Values.replica.terminationGracePeriodSeconds }} - containers: - - name: redis - image: {{ template "redis.image" . }} - imagePullPolicy: {{ .Values.image.pullPolicy | quote }} - {{- if not .Values.diagnosticMode.enabled }} - {{- if .Values.replica.lifecycleHooks }} - lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.replica.lifecycleHooks "context" $) | nindent 12 }} - {{- end }} - {{- end }} - {{- if .Values.replica.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.replica.containerSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} - {{- else if .Values.replica.command }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.replica.command "context" $) | nindent 12 }} - {{- else }} - command: - - /bin/bash - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} - {{- else if .Values.replica.args }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.replica.args "context" $) | nindent 12 }} - {{- else }} - args: - - -c - - /opt/bitnami/scripts/start-scripts/start-replica.sh - {{- end }} - env: - - name: BITNAMI_DEBUG - value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }} - - name: REDIS_REPLICATION_MODE - value: replica - - name: REDIS_MASTER_HOST - {{- if .Values.replica.externalMaster.enabled }} - value: {{ .Values.replica.externalMaster.host | quote }} - {{- else if and (eq (int64 .Values.master.count) 1) (eq .Values.master.kind "StatefulSet") }} - value: {{ template "common.names.fullname" . }}-master-0.{{ template "common.names.fullname" . }}-headless.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }} - {{- else }} - value: {{ template "common.names.fullname" . }}-master.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }} - {{- end }} - - name: REDIS_MASTER_PORT_NUMBER - {{- if .Values.replica.externalMaster.enabled }} - value: {{ .Values.replica.externalMaster.port | quote }} - {{- else }} - value: {{ .Values.master.containerPorts.redis | quote }} - {{- end }} - - name: ALLOW_EMPTY_PASSWORD - value: {{ ternary "no" "yes" .Values.auth.enabled | quote }} - {{- if .Values.auth.enabled }} - {{- if .Values.auth.usePasswordFiles }} - - name: REDIS_PASSWORD_FILE - value: "/opt/bitnami/redis/secrets/redis-password" - - name: REDIS_MASTER_PASSWORD_FILE - value: "/opt/bitnami/redis/secrets/redis-password" - {{- else }} - - name: REDIS_PASSWORD - valueFrom: - secretKeyRef: - name: {{ template "redis.secretName" . }} - key: {{ template "redis.secretPasswordKey" . }} - - name: REDIS_MASTER_PASSWORD - valueFrom: - secretKeyRef: - name: {{ template "redis.secretName" . }} - key: {{ template "redis.secretPasswordKey" . }} - {{- end }} - {{- end }} - - name: REDIS_TLS_ENABLED - value: {{ ternary "yes" "no" .Values.tls.enabled | quote }} - {{- if .Values.tls.enabled }} - - name: REDIS_TLS_PORT - value: {{ .Values.replica.containerPorts.redis | quote }} - - name: REDIS_TLS_AUTH_CLIENTS - value: {{ ternary "yes" "no" .Values.tls.authClients | quote }} - - name: REDIS_TLS_CERT_FILE - value: {{ template "redis.tlsCert" . }} - - name: REDIS_TLS_KEY_FILE - value: {{ template "redis.tlsCertKey" . }} - - name: REDIS_TLS_CA_FILE - value: {{ template "redis.tlsCACert" . }} - {{- if .Values.tls.dhParamsFilename }} - - name: REDIS_TLS_DH_PARAMS_FILE - value: {{ template "redis.tlsDHParams" . }} - {{- end }} - {{- else }} - - name: REDIS_PORT - value: {{ .Values.replica.containerPorts.redis | quote }} - {{- end }} - {{- if .Values.replica.extraEnvVars }} - {{- include "common.tplvalues.render" (dict "value" .Values.replica.extraEnvVars "context" $) | nindent 12 }} - {{- end }} - {{- if or .Values.replica.extraEnvVarsCM .Values.replica.extraEnvVarsSecret }} - envFrom: - {{- if .Values.replica.extraEnvVarsCM }} - - configMapRef: - name: {{ .Values.replica.extraEnvVarsCM }} - {{- end }} - {{- if .Values.replica.extraEnvVarsSecret }} - - secretRef: - name: {{ .Values.replica.extraEnvVarsSecret }} - {{- end }} - {{- end }} - ports: - - name: redis - containerPort: {{ .Values.replica.containerPorts.redis }} - {{- if not .Values.diagnosticMode.enabled }} - {{- if .Values.replica.customStartupProbe }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.replica.customStartupProbe "context" $) | nindent 12 }} - {{- else if .Values.replica.startupProbe.enabled }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.replica.startupProbe "enabled") "context" $) | nindent 12 }} - tcpSocket: - port: redis - {{- end }} - {{- if .Values.replica.customLivenessProbe }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.replica.customLivenessProbe "context" $) | nindent 12 }} - {{- else if .Values.replica.livenessProbe.enabled }} - livenessProbe: - initialDelaySeconds: {{ .Values.replica.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.replica.livenessProbe.periodSeconds }} - timeoutSeconds: {{ add1 .Values.replica.livenessProbe.timeoutSeconds }} - successThreshold: {{ .Values.replica.livenessProbe.successThreshold }} - failureThreshold: {{ .Values.replica.livenessProbe.failureThreshold }} - exec: - command: - - sh - - -c - - /health/ping_liveness_local_and_master.sh {{ .Values.replica.livenessProbe.timeoutSeconds }} - {{- end }} - {{- if .Values.replica.customReadinessProbe }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.replica.customReadinessProbe "context" $) | nindent 12 }} - {{- else if .Values.replica.readinessProbe.enabled }} - readinessProbe: - initialDelaySeconds: {{ .Values.replica.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.replica.readinessProbe.periodSeconds }} - timeoutSeconds: {{ add1 .Values.replica.readinessProbe.timeoutSeconds }} - successThreshold: {{ .Values.replica.readinessProbe.successThreshold }} - failureThreshold: {{ .Values.replica.readinessProbe.failureThreshold }} - exec: - command: - - sh - - -c - - /health/ping_readiness_local_and_master.sh {{ .Values.replica.readinessProbe.timeoutSeconds }} - {{- end }} - {{- end }} - {{- if .Values.replica.resources }} - resources: {{- toYaml .Values.replica.resources | nindent 12 }} - {{- end }} - volumeMounts: - - name: start-scripts - mountPath: /opt/bitnami/scripts/start-scripts - - name: health - mountPath: /health - {{- if .Values.auth.usePasswordFiles }} - - name: redis-password - mountPath: /opt/bitnami/redis/secrets/ - {{- end }} - - name: redis-data - mountPath: /data - {{- if .Values.replica.persistence.subPath }} - subPath: {{ .Values.replica.persistence.subPath }} - {{- else if .Values.replica.persistence.subPathExpr }} - subPathExpr: {{ .Values.replica.persistence.subPathExpr }} - {{- end }} - - name: config - mountPath: /opt/bitnami/redis/mounted-etc - - name: redis-tmp-conf - mountPath: /opt/bitnami/redis/etc - {{- if .Values.tls.enabled }} - - name: redis-certificates - mountPath: /opt/bitnami/redis/certs - readOnly: true - {{- end }} - {{- if .Values.replica.extraVolumeMounts }} - {{- include "common.tplvalues.render" ( dict "value" .Values.replica.extraVolumeMounts "context" $ ) | nindent 12 }} - {{- end }} - {{- if .Values.metrics.enabled }} - - name: metrics - image: {{ include "redis.metrics.image" . }} - imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }} - {{- if .Values.metrics.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.metrics.containerSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} - {{- else if .Values.metrics.command }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.command "context" $) | nindent 12 }} - {{- else }} - command: - - /bin/bash - - -c - - | - if [[ -f '/secrets/redis-password' ]]; then - export REDIS_PASSWORD=$(cat /secrets/redis-password) - fi - redis_exporter{{- range $key, $value := .Values.metrics.extraArgs }} --{{ $key }}={{ $value }}{{- end }} - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} - {{- end }} - env: - - name: REDIS_ALIAS - value: {{ template "common.names.fullname" . }} - {{- if .Values.auth.enabled }} - - name: REDIS_USER - value: default - {{- if (not .Values.auth.usePasswordFiles) }} - - name: REDIS_PASSWORD - valueFrom: - secretKeyRef: - name: {{ template "redis.secretName" . }} - key: {{ template "redis.secretPasswordKey" . }} - {{- end }} - {{- end }} - {{- if .Values.tls.enabled }} - - name: REDIS_ADDR - value: rediss://{{ .Values.metrics.redisTargetHost }}:{{ .Values.replica.containerPorts.redis }} - {{- if .Values.tls.authClients }} - - name: REDIS_EXPORTER_TLS_CLIENT_KEY_FILE - value: {{ template "redis.tlsCertKey" . }} - - name: REDIS_EXPORTER_TLS_CLIENT_CERT_FILE - value: {{ template "redis.tlsCert" . }} - {{- end }} - - name: REDIS_EXPORTER_TLS_CA_CERT_FILE - value: {{ template "redis.tlsCACert" . }} - {{- end }} - {{- if .Values.metrics.extraEnvVars }} - {{- include "common.tplvalues.render" (dict "value" .Values.metrics.extraEnvVars "context" $) | nindent 12 }} - {{- end }} - ports: - - name: metrics - containerPort: 9121 - {{- if not .Values.diagnosticMode.enabled }} - {{- if .Values.metrics.customStartupProbe }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customStartupProbe "context" $) | nindent 12 }} - {{- else if .Values.metrics.startupProbe.enabled }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.startupProbe "enabled") "context" $) | nindent 12 }} - tcpSocket: - port: metrics - {{- end }} - {{- if .Values.metrics.customLivenessProbe }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customLivenessProbe "context" $) | nindent 12 }} - {{- else if .Values.metrics.livenessProbe.enabled }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.livenessProbe "enabled") "context" $) | nindent 12 }} - tcpSocket: - port: metrics - {{- end }} - {{- if .Values.metrics.customReadinessProbe }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customReadinessProbe "context" $) | nindent 12 }} - {{- else if .Values.metrics.readinessProbe.enabled }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.readinessProbe "enabled") "context" $) | nindent 12 }} - httpGet: - path: / - port: metrics - {{- end }} - {{- end }} - {{- if .Values.metrics.resources }} - resources: {{- toYaml .Values.metrics.resources | nindent 12 }} - {{- end }} - volumeMounts: - {{- if .Values.auth.usePasswordFiles }} - - name: redis-password - mountPath: /secrets/ - {{- end }} - {{- if .Values.tls.enabled }} - - name: redis-certificates - mountPath: /opt/bitnami/redis/certs - readOnly: true - {{- end }} - {{- if .Values.metrics.extraVolumeMounts }} - {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.extraVolumeMounts "context" $ ) | nindent 12 }} - {{- end }} - {{- end }} - {{- if .Values.replica.sidecars }} - {{- include "common.tplvalues.render" (dict "value" .Values.replica.sidecars "context" $) | nindent 8 }} - {{- end }} - {{- $needsVolumePermissions := and .Values.volumePermissions.enabled .Values.replica.persistence.enabled .Values.replica.podSecurityContext.enabled .Values.replica.containerSecurityContext.enabled }} - {{- if or .Values.replica.initContainers $needsVolumePermissions .Values.sysctl.enabled }} - initContainers: - {{- if .Values.replica.initContainers }} - {{- include "common.tplvalues.render" (dict "value" .Values.replica.initContainers "context" $) | nindent 8 }} - {{- end }} - {{- if $needsVolumePermissions }} - - name: volume-permissions - image: {{ include "redis.volumePermissions.image" . }} - imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }} - command: - - /bin/bash - - -ec - - | - {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} - chown -R `id -u`:`id -G | cut -d " " -f2` {{ .Values.replica.persistence.path }} - {{- else }} - chown -R {{ .Values.replica.containerSecurityContext.runAsUser }}:{{ .Values.replica.podSecurityContext.fsGroup }} {{ .Values.replica.persistence.path }} - {{- end }} - {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} - securityContext: {{- omit .Values.volumePermissions.containerSecurityContext "runAsUser" | toYaml | nindent 12 }} - {{- else }} - securityContext: {{- .Values.volumePermissions.containerSecurityContext | toYaml | nindent 12 }} - {{- end }} - {{- if .Values.volumePermissions.resources }} - resources: {{- toYaml .Values.volumePermissions.resources | nindent 12 }} - {{- end }} - volumeMounts: - - name: redis-data - mountPath: {{ .Values.replica.persistence.path }} - {{- if .Values.replica.persistence.subPath }} - subPath: {{ .Values.replica.persistence.subPath }} - {{- else if .Values.replica.persistence.subPathExpr }} - subPathExpr: {{ .Values.replica.persistence.subPathExpr }} - {{- end }} - {{- end }} - {{- if .Values.sysctl.enabled }} - - name: init-sysctl - image: {{ include "redis.sysctl.image" . }} - imagePullPolicy: {{ default "" .Values.sysctl.image.pullPolicy | quote }} - securityContext: - privileged: true - runAsUser: 0 - {{- if .Values.sysctl.command }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.sysctl.command "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.sysctl.resources }} - resources: {{- toYaml .Values.sysctl.resources | nindent 12 }} - {{- end }} - {{- if .Values.sysctl.mountHostSys }} - volumeMounts: - - name: host-sys - mountPath: /host-sys - {{- end }} - {{- end }} - {{- end }} - volumes: - - name: start-scripts - configMap: - name: {{ printf "%s-scripts" (include "common.names.fullname" .) }} - defaultMode: 0755 - - name: health - configMap: - name: {{ printf "%s-health" (include "common.names.fullname" .) }} - defaultMode: 0755 - {{- if .Values.auth.usePasswordFiles }} - - name: redis-password - secret: - secretName: {{ template "redis.secretName" . }} - items: - - key: {{ template "redis.secretPasswordKey" . }} - path: redis-password - {{- end }} - - name: config - configMap: - name: {{ include "redis.configmapName" . }} - {{- if .Values.sysctl.mountHostSys }} - - name: host-sys - hostPath: - path: /sys - {{- end }} - - name: redis-tmp-conf - {{- if or .Values.replica.persistence.medium .Values.replica.persistence.sizeLimit }} - emptyDir: - {{- if .Values.replica.persistence.medium }} - medium: {{ .Values.replica.persistence.medium | quote }} - {{- end }} - {{- if .Values.replica.persistence.sizeLimit }} - sizeLimit: {{ .Values.replica.persistence.sizeLimit | quote }} - {{- end }} - {{- else }} - emptyDir: {} - {{- end }} - {{- if .Values.tls.enabled }} - - name: redis-certificates - secret: - secretName: {{ include "redis.tlsSecretName" . }} - defaultMode: 256 - {{- end }} - {{- if .Values.replica.extraVolumes }} - {{- include "common.tplvalues.render" ( dict "value" .Values.replica.extraVolumes "context" $ ) | nindent 8 }} - {{- end }} - {{- if .Values.metrics.extraVolumes }} - {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.extraVolumes "context" $ ) | nindent 8 }} - {{- end }} - {{- if or (not .Values.replica.persistence.enabled) (not (eq .Values.replica.kind "StatefulSet")) }} - - name: redis-data - {{- if or .Values.replica.persistence.medium .Values.replica.persistence.sizeLimit }} - emptyDir: - {{- if .Values.replica.persistence.medium }} - medium: {{ .Values.replica.persistence.medium | quote }} - {{- end }} - {{- if .Values.replica.persistence.sizeLimit }} - sizeLimit: {{ .Values.replica.persistence.sizeLimit | quote }} - {{- end }} - {{- else }} - emptyDir: {} - {{- end }} - {{- else if .Values.replica.persistence.existingClaim }} - - name: redis-data - persistentVolumeClaim: - claimName: {{ printf "%s" (tpl .Values.replica.persistence.existingClaim .) }} - {{- else }} - {{- if .Values.replica.persistentVolumeClaimRetentionPolicy.enabled }} - persistentVolumeClaimRetentionPolicy: - whenDeleted: {{ .Values.replica.persistentVolumeClaimRetentionPolicy.whenDeleted }} - whenScaled: {{ .Values.replica.persistentVolumeClaimRetentionPolicy.whenScaled }} - {{- end }} - volumeClaimTemplates: - - apiVersion: v1 - kind: PersistentVolumeClaim - metadata: - name: redis-data - {{- $claimLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.master.persistence.labels .Values.commonLabels ) "context" . ) }} - labels: {{- include "common.labels.matchLabels" ( dict "customLabels" $claimLabels "context" $ ) | nindent 10 }} - app.kubernetes.io/component: replica - {{- if .Values.replica.persistence.annotations }} - annotations: {{- toYaml .Values.replica.persistence.annotations | nindent 10 }} - {{- end }} - spec: - accessModes: - {{- range .Values.replica.persistence.accessModes }} - - {{ . | quote }} - {{- end }} - resources: - requests: - storage: {{ .Values.replica.persistence.size | quote }} - {{- if .Values.replica.persistence.selector }} - selector: {{- include "common.tplvalues.render" (dict "value" .Values.replica.persistence.selector "context" $) | nindent 10 }} - {{- end }} - {{- if .Values.replica.persistence.dataSource }} - dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.replica.persistence.dataSource "context" $) | nindent 10 }} - {{- end }} - {{- include "common.storage.class" (dict "persistence" .Values.replica.persistence "global" .Values.global) | nindent 8 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/replicas/hpa.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/replicas/hpa.yaml deleted file mode 100644 index da69290a7..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/replicas/hpa.yaml +++ /dev/null @@ -1,49 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.replica.autoscaling.enabled (not .Values.sentinel.enabled) }} -apiVersion: {{ include "common.capabilities.hpa.apiVersion" ( dict "context" $ ) }} -kind: HorizontalPodAutoscaler -metadata: - name: {{ printf "%s-replicas" (include "common.names.fullname" .) }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: replica - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - scaleTargetRef: - apiVersion: {{ include "common.capabilities.deployment.apiVersion" . }} - kind: StatefulSet - name: {{ printf "%s-replicas" (include "common.names.fullname" .) }} - minReplicas: {{ .Values.replica.autoscaling.minReplicas }} - maxReplicas: {{ .Values.replica.autoscaling.maxReplicas }} - metrics: - {{- if .Values.replica.autoscaling.targetCPU }} - - type: Resource - resource: - name: cpu - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.replica.autoscaling.targetCPU }} - {{- else }} - target: - type: Utilization - averageUtilization: {{ .Values.replica.autoscaling.targetCPU }} - {{- end }} - {{- end }} - {{- if .Values.replica.autoscaling.targetMemory }} - - type: Resource - resource: - name: memory - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.replica.autoscaling.targetMemory }} - {{- else }} - target: - type: Utilization - averageUtilization: {{ .Values.replica.autoscaling.targetMemory }} - {{- end }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/replicas/service.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/replicas/service.yaml deleted file mode 100644 index b54b85a17..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/replicas/service.yaml +++ /dev/null @@ -1,59 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and (eq .Values.architecture "replication") (not .Values.sentinel.enabled) }} -apiVersion: v1 -kind: Service -metadata: - name: {{ printf "%s-replicas" (include "common.names.fullname" .) }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: replica - {{- if or .Values.replica.service.annotations .Values.commonAnnotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.replica.service.annotations .Values.commonAnnotations ) "context" . ) }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} -spec: - type: {{ .Values.replica.service.type }} - {{- if or (eq .Values.replica.service.type "LoadBalancer") (eq .Values.replica.service.type "NodePort") }} - externalTrafficPolicy: {{ .Values.replica.service.externalTrafficPolicy | quote }} - {{- end }} - {{- if (semverCompare ">=1.22-0" (include "common.capabilities.kubeVersion" .)) }} - internalTrafficPolicy: {{ .Values.replica.service.internalTrafficPolicy }} - {{- end }} - {{- if and (eq .Values.replica.service.type "LoadBalancer") (not (empty .Values.replica.service.loadBalancerIP)) }} - loadBalancerIP: {{ .Values.replica.service.loadBalancerIP }} - {{- end }} - {{- if and (eq .Values.replica.service.type "LoadBalancer") .Values.replica.service.loadBalancerClass }} - loadBalancerClass: {{ .Values.replica.service.loadBalancerClass }} - {{- end }} - {{- if and (eq .Values.replica.service.type "LoadBalancer") (not (empty .Values.replica.service.loadBalancerSourceRanges)) }} - loadBalancerSourceRanges: {{ toYaml .Values.replica.service.loadBalancerSourceRanges | nindent 4 }} - {{- end }} - {{- if and .Values.replica.service.clusterIP (eq .Values.replica.service.type "ClusterIP") }} - clusterIP: {{ .Values.replica.service.clusterIP }} - {{- end }} - {{- if .Values.replica.service.sessionAffinity }} - sessionAffinity: {{ .Values.replica.service.sessionAffinity }} - {{- end }} - {{- if .Values.replica.service.sessionAffinityConfig }} - sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.replica.service.sessionAffinityConfig "context" $) | nindent 4 }} - {{- end }} - ports: - - name: tcp-redis - port: {{ .Values.replica.service.ports.redis }} - targetPort: redis - {{- if and (or (eq .Values.replica.service.type "NodePort") (eq .Values.replica.service.type "LoadBalancer")) .Values.replica.service.nodePorts.redis}} - nodePort: {{ .Values.replica.service.nodePorts.redis}} - {{- else if eq .Values.replica.service.type "ClusterIP" }} - nodePort: null - {{- end }} - {{- if .Values.replica.service.extraPorts }} - {{- include "common.tplvalues.render" (dict "value" .Values.replica.service.extraPorts "context" $) | nindent 4 }} - {{- end }} - {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.replica.podLabels .Values.commonLabels ) "context" . ) }} - selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: replica -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/replicas/serviceaccount.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/replicas/serviceaccount.yaml deleted file mode 100644 index d7f47f43d..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/replicas/serviceaccount.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.replica.serviceAccount.create (eq .Values.architecture "replication") (not .Values.sentinel.enabled) }} -apiVersion: v1 -kind: ServiceAccount -automountServiceAccountToken: {{ .Values.replica.serviceAccount.automountServiceAccountToken }} -metadata: - name: {{ template "redis.replicaServiceAccountName" . }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if or .Values.replica.serviceAccount.annotations .Values.commonAnnotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.replica.serviceAccount.annotations .Values.commonAnnotations ) "context" . ) }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/role.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/role.yaml deleted file mode 100644 index 5bab3b7cc..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/role.yaml +++ /dev/null @@ -1,29 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if .Values.rbac.create }} -apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }} -kind: Role -metadata: - name: {{ template "common.names.fullname" . }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -rules: - {{- if and (include "common.capabilities.psp.supported" .) .Values.podSecurityPolicy.enabled }} - - apiGroups: - - '{{ template "podSecurityPolicy.apiGroup" . }}' - resources: - - 'podsecuritypolicies' - verbs: - - 'use' - resourceNames: [{{ printf "%s-master" (include "common.names.fullname" .) }}] - {{- end }} - {{- if .Values.rbac.rules }} - {{- include "common.tplvalues.render" ( dict "value" .Values.rbac.rules "context" $ ) | nindent 2 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/rolebinding.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/rolebinding.yaml deleted file mode 100644 index 81c68f329..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/rolebinding.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if .Values.rbac.create }} -apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }} -kind: RoleBinding -metadata: - name: {{ template "common.names.fullname" . }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "common.names.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ template "redis.serviceAccountName" . }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/scripts-configmap.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/scripts-configmap.yaml deleted file mode 100644 index f785faf34..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/scripts-configmap.yaml +++ /dev/null @@ -1,757 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ printf "%s-scripts" (include "common.names.fullname" .) }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -data: -{{- if and (eq .Values.architecture "replication") .Values.sentinel.enabled }} - start-node.sh: | - #!/bin/bash - - . /opt/bitnami/scripts/libos.sh - . /opt/bitnami/scripts/liblog.sh - . /opt/bitnami/scripts/libvalidations.sh - - get_port() { - hostname="$1" - type="$2" - - port_var=$(echo "${hostname^^}_SERVICE_PORT_$type" | sed "s/-/_/g") - port=${!port_var} - - if [ -z "$port" ]; then - case $type in - "SENTINEL") - echo {{ .Values.sentinel.containerPorts.sentinel }} - ;; - "REDIS") - echo {{ .Values.master.containerPorts.redis }} - ;; - esac - else - echo $port - fi - } - - get_full_hostname() { - hostname="$1" - - {{- if .Values.useExternalDNS.enabled }} - full_hostname="${hostname}.{{- include "redis.externalDNS.suffix" . }}" - {{- else if eq .Values.sentinel.service.type "NodePort" }} - full_hostname="${hostname}.{{- include "common.names.namespace" . }}" - {{- else }} - full_hostname="${hostname}.${HEADLESS_SERVICE}" - {{- end }} - - {{- if .Values.useHostnames }} - echo "${full_hostname}" - {{- else }} - retry_count=0 - until getent hosts "${full_hostname}" | awk '{ print $1; exit }' | grep .; do - if [[ $retry_count -lt {{ .Values.nameResolutionThreshold }} ]]; then - sleep {{ .Values.nameResolutionTimeout }} - else - error "IP address for ${full_hostname} not found" - exit 1 - fi - ((retry_count++)) - done - {{- end }} - } - - REDISPORT=$(get_port "$HOSTNAME" "REDIS") - - HEADLESS_SERVICE="{{ template "common.names.fullname" . }}-headless.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }}" - - if [ -n "$REDIS_EXTERNAL_MASTER_HOST" ]; then - REDIS_SERVICE="$REDIS_EXTERNAL_MASTER_HOST" - else - REDIS_SERVICE="{{ template "common.names.fullname" . }}.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }}" - fi - - SENTINEL_SERVICE_PORT=$(get_port "{{ include "common.names.fullname" . }}" "SENTINEL") - validate_quorum() { - if is_boolean_yes "$REDIS_TLS_ENABLED"; then - quorum_info_command="{{- if and .Values.auth.enabled .Values.auth.sentinel }}REDISCLI_AUTH="\$REDIS_PASSWORD" {{ end }}redis-cli -h $REDIS_SERVICE -p $SENTINEL_SERVICE_PORT --tls --cert ${REDIS_TLS_CERT_FILE} --key ${REDIS_TLS_KEY_FILE} --cacert ${REDIS_TLS_CA_FILE} sentinel master {{ .Values.sentinel.masterSet }}" - else - quorum_info_command="{{- if and .Values.auth.enabled .Values.auth.sentinel }}REDISCLI_AUTH="\$REDIS_PASSWORD" {{ end }}redis-cli -h $REDIS_SERVICE -p $SENTINEL_SERVICE_PORT sentinel master {{ .Values.sentinel.masterSet }}" - fi - info "about to run the command: $quorum_info_command" - eval $quorum_info_command | grep -Fq "s_down" - } - - trigger_manual_failover() { - if is_boolean_yes "$REDIS_TLS_ENABLED"; then - failover_command="{{- if and .Values.auth.enabled .Values.auth.sentinel }}REDISCLI_AUTH="\$REDIS_PASSWORD" {{ end }}redis-cli -h $REDIS_SERVICE -p $SENTINEL_SERVICE_PORT --tls --cert ${REDIS_TLS_CERT_FILE} --key ${REDIS_TLS_KEY_FILE} --cacert ${REDIS_TLS_CA_FILE} sentinel failover {{ .Values.sentinel.masterSet }}" - else - failover_command="{{- if and .Values.auth.enabled .Values.auth.sentinel }}REDISCLI_AUTH="\$REDIS_PASSWORD" {{ end }}redis-cli -h $REDIS_SERVICE -p $SENTINEL_SERVICE_PORT sentinel failover {{ .Values.sentinel.masterSet }}" - fi - - info "about to run the command: $failover_command" - eval $failover_command - } - - get_sentinel_master_info() { - if is_boolean_yes "$REDIS_TLS_ENABLED"; then - sentinel_info_command="{{- if and .Values.auth.enabled .Values.auth.sentinel }}REDISCLI_AUTH="\$REDIS_PASSWORD" {{ end }}timeout {{ .Values.sentinel.getMasterTimeout }} redis-cli -h $REDIS_SERVICE -p $SENTINEL_SERVICE_PORT --tls --cert ${REDIS_TLS_CERT_FILE} --key ${REDIS_TLS_KEY_FILE} --cacert ${REDIS_TLS_CA_FILE} sentinel get-master-addr-by-name {{ .Values.sentinel.masterSet }}" - else - sentinel_info_command="{{- if and .Values.auth.enabled .Values.auth.sentinel }}REDISCLI_AUTH="\$REDIS_PASSWORD" {{ end }}timeout {{ .Values.sentinel.getMasterTimeout }} redis-cli -h $REDIS_SERVICE -p $SENTINEL_SERVICE_PORT sentinel get-master-addr-by-name {{ .Values.sentinel.masterSet }}" - fi - - info "about to run the command: $sentinel_info_command" - retry_while "eval $sentinel_info_command" 2 5 - } - - {{- if and .Values.replica.containerSecurityContext.runAsUser (eq (.Values.replica.containerSecurityContext.runAsUser | int) 0) }} - useradd redis - chown -R redis {{ .Values.replica.persistence.path }} - {{- end }} - - [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")" - [[ -f $REDIS_MASTER_PASSWORD_FILE ]] && export REDIS_MASTER_PASSWORD="$(< "${REDIS_MASTER_PASSWORD_FILE}")" - - # check if there is a master - master_in_persisted_conf="$(get_full_hostname "$HOSTNAME")" - master_port_in_persisted_conf="$REDIS_MASTER_PORT_NUMBER" - master_in_sentinel="$(get_sentinel_master_info)" - redisRetVal=$? - - {{- if .Values.sentinel.persistence.enabled }} - if [[ -f /opt/bitnami/redis-sentinel/etc/sentinel.conf ]]; then - master_in_persisted_conf="$(awk '/monitor/ {print $4}' /opt/bitnami/redis-sentinel/etc/sentinel.conf)" - master_port_in_persisted_conf="$(awk '/monitor/ {print $5}' /opt/bitnami/redis-sentinel/etc/sentinel.conf)" - info "Found previous master ${master_in_persisted_conf}:${master_port_in_persisted_conf} in /opt/bitnami/redis-sentinel/etc/sentinel.conf" - debug "$(cat /opt/bitnami/redis-sentinel/etc/sentinel.conf | grep monitor)" - touch /opt/bitnami/redis-sentinel/etc/.node_read - fi - {{- end }} - - if [[ $redisRetVal -ne 0 ]]; then - if [[ "$master_in_persisted_conf" == "$(get_full_hostname "$HOSTNAME")" ]]; then - # Case 1: No active sentinel and in previous sentinel.conf we were the master --> MASTER - info "Configuring the node as master" - export REDIS_REPLICATION_MODE="master" - else - # Case 2: No active sentinel and in previous sentinel.conf we were not master --> REPLICA - info "Configuring the node as replica" - export REDIS_REPLICATION_MODE="replica" - REDIS_MASTER_HOST=${master_in_persisted_conf} - REDIS_MASTER_PORT_NUMBER=${master_port_in_persisted_conf} - fi - else - # Fetches current master's host and port - REDIS_SENTINEL_INFO=($(get_sentinel_master_info)) - info "Current master: REDIS_SENTINEL_INFO=(${REDIS_SENTINEL_INFO[0]},${REDIS_SENTINEL_INFO[1]})" - REDIS_MASTER_HOST=${REDIS_SENTINEL_INFO[0]} - REDIS_MASTER_PORT_NUMBER=${REDIS_SENTINEL_INFO[1]} - - if [[ "$REDIS_MASTER_HOST" == "$(get_full_hostname "$HOSTNAME")" ]]; then - # Case 3: Active sentinel and master it is this node --> MASTER - info "Configuring the node as master" - export REDIS_REPLICATION_MODE="master" - else - # Case 4: Active sentinel and master is not this node --> REPLICA - info "Configuring the node as replica" - export REDIS_REPLICATION_MODE="replica" - - {{- if and .Values.sentinel.automateClusterRecovery (le (int .Values.sentinel.downAfterMilliseconds) 2000) }} - retry_count=1 - while validate_quorum - do - info "sleeping, waiting for Redis master to come up" - sleep 1s - if ! ((retry_count % 11)); then - info "Trying to manually failover" - failover_result=$(trigger_manual_failover) - - debug "Failover result: $failover_result" - fi - - ((retry_count+=1)) - done - info "Redis master is up now" - {{- end }} - fi - fi - - if [[ -n "$REDIS_EXTERNAL_MASTER_HOST" ]]; then - REDIS_MASTER_HOST="$REDIS_EXTERNAL_MASTER_HOST" - REDIS_MASTER_PORT_NUMBER="${REDIS_EXTERNAL_MASTER_PORT}" - fi - - if [[ -f /opt/bitnami/redis/mounted-etc/replica.conf ]];then - cp /opt/bitnami/redis/mounted-etc/replica.conf /opt/bitnami/redis/etc/replica.conf - fi - - if [[ -f /opt/bitnami/redis/mounted-etc/redis.conf ]];then - cp /opt/bitnami/redis/mounted-etc/redis.conf /opt/bitnami/redis/etc/redis.conf - fi - - echo "" >> /opt/bitnami/redis/etc/replica.conf - echo "replica-announce-port $REDISPORT" >> /opt/bitnami/redis/etc/replica.conf - echo "replica-announce-ip $(get_full_hostname "$HOSTNAME")" >> /opt/bitnami/redis/etc/replica.conf - - {{- if .Values.tls.enabled }} - ARGS=("--port" "0") - ARGS+=("--tls-port" "${REDIS_TLS_PORT}") - ARGS+=("--tls-cert-file" "${REDIS_TLS_CERT_FILE}") - ARGS+=("--tls-key-file" "${REDIS_TLS_KEY_FILE}") - ARGS+=("--tls-ca-cert-file" "${REDIS_TLS_CA_FILE}") - ARGS+=("--tls-auth-clients" "${REDIS_TLS_AUTH_CLIENTS}") - ARGS+=("--tls-replication" "yes") - {{- if .Values.tls.dhParamsFilename }} - ARGS+=("--tls-dh-params-file" "${REDIS_TLS_DH_PARAMS_FILE}") - {{- end }} - {{- else }} - ARGS=("--port" "${REDIS_PORT}") - {{- end }} - - if [[ "$REDIS_REPLICATION_MODE" = "slave" ]] || [[ "$REDIS_REPLICATION_MODE" = "replica" ]]; then - ARGS+=("--replicaof" "${REDIS_MASTER_HOST}" "${REDIS_MASTER_PORT_NUMBER}") - fi - - {{- if .Values.auth.enabled }} - ARGS+=("--requirepass" "${REDIS_PASSWORD}") - ARGS+=("--masterauth" "${REDIS_MASTER_PASSWORD}") - {{- else }} - ARGS+=("--protected-mode" "no") - {{- end }} - ARGS+=("--include" "/opt/bitnami/redis/etc/replica.conf") - ARGS+=("--include" "/opt/bitnami/redis/etc/redis.conf") - {{- if .Values.replica.extraFlags }} - {{- range .Values.replica.extraFlags }} - ARGS+=({{ . | quote }}) - {{- end }} - {{- end }} - - {{- if .Values.replica.preExecCmds }} - {{- .Values.replica.preExecCmds | nindent 4 }} - {{- end }} - - {{- if .Values.replica.command }} - exec {{ .Values.replica.command }} "${ARGS[@]}" - {{- else }} - exec redis-server "${ARGS[@]}" - {{- end }} - - start-sentinel.sh: | - #!/bin/bash - - . /opt/bitnami/scripts/libos.sh - . /opt/bitnami/scripts/libvalidations.sh - . /opt/bitnami/scripts/libfile.sh - - HEADLESS_SERVICE="{{ template "common.names.fullname" . }}-headless.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }}" - REDIS_SERVICE="{{ template "common.names.fullname" . }}.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }}" - - get_port() { - hostname="$1" - type="$2" - - port_var=$(echo "${hostname^^}_SERVICE_PORT_$type" | sed "s/-/_/g") - port=${!port_var} - - if [ -z "$port" ]; then - case $type in - "SENTINEL") - echo {{ .Values.sentinel.containerPorts.sentinel }} - ;; - "REDIS") - echo {{ .Values.master.containerPorts.redis }} - ;; - esac - else - echo $port - fi - } - - get_full_hostname() { - hostname="$1" - - {{- if .Values.useExternalDNS.enabled }} - full_hostname="${hostname}.{{- include "redis.externalDNS.suffix" . }}" - {{- else if eq .Values.sentinel.service.type "NodePort" }} - full_hostname="${hostname}.{{- include "common.names.namespace" . }}" - {{- else }} - full_hostname="${hostname}.${HEADLESS_SERVICE}" - {{- end }} - - {{- if .Values.useHostnames }} - echo "${full_hostname}" - {{- else }} - retry_count=0 - until getent hosts "${full_hostname}" | awk '{ print $1; exit }' | grep .; do - if [[ $retry_count -lt {{ .Values.nameResolutionThreshold }} ]]; then - sleep {{ .Values.nameResolutionTimeout }} - else - error "IP address for ${full_hostname} not found" - exit 1 - fi - ((retry_count++)) - done - {{- end }} - } - - SERVPORT=$(get_port "$HOSTNAME" "SENTINEL") - REDISPORT=$(get_port "$HOSTNAME" "REDIS") - SENTINEL_SERVICE_PORT=$(get_port "{{ include "common.names.fullname" . }}" "SENTINEL") - - sentinel_conf_set() { - local -r key="${1:?missing key}" - local value="${2:-}" - - # Sanitize inputs - value="${value//\\/\\\\}" - value="${value//&/\\&}" - value="${value//\?/\\?}" - [[ "$value" = "" ]] && value="\"$value\"" - - replace_in_file "/opt/bitnami/redis-sentinel/etc/sentinel.conf" "^#*\s*${key} .*" "${key} ${value}" false - } - sentinel_conf_add() { - echo $'\n'"$@" >> "/opt/bitnami/redis-sentinel/etc/sentinel.conf" - } - host_id() { - echo "$1" | openssl sha1 | awk '{print $2}' - } - get_sentinel_master_info() { - if is_boolean_yes "$REDIS_SENTINEL_TLS_ENABLED"; then - sentinel_info_command="{{- if and .Values.auth.enabled .Values.auth.sentinel }}REDISCLI_AUTH="\$REDIS_PASSWORD" {{ end }}timeout {{ .Values.sentinel.getMasterTimeout }} redis-cli -h $REDIS_SERVICE -p $SENTINEL_SERVICE_PORT --tls --cert ${REDIS_SENTINEL_TLS_CERT_FILE} --key ${REDIS_SENTINEL_TLS_KEY_FILE} --cacert ${REDIS_SENTINEL_TLS_CA_FILE} sentinel get-master-addr-by-name {{ .Values.sentinel.masterSet }}" - else - sentinel_info_command="{{- if and .Values.auth.enabled .Values.auth.sentinel }}REDISCLI_AUTH="\$REDIS_PASSWORD" {{ end }}timeout {{ .Values.sentinel.getMasterTimeout }} redis-cli -h $REDIS_SERVICE -p $SENTINEL_SERVICE_PORT sentinel get-master-addr-by-name {{ .Values.sentinel.masterSet }}" - fi - info "about to run the command: $sentinel_info_command" - retry_while "eval $sentinel_info_command" 2 5 - } - - [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")" - - master_in_persisted_conf="$(get_full_hostname "$HOSTNAME")" - - {{- if .Values.sentinel.persistence.enabled }} - if [[ -f /opt/bitnami/redis-sentinel/etc/sentinel.conf ]]; then - check_lock_file() { - [[ -f /opt/bitnami/redis-sentinel/etc/.node_read ]] - } - retry_while "check_lock_file" - rm -f /opt/bitnami/redis-sentinel/etc/.node_read - master_in_persisted_conf="$(awk '/monitor/ {print $4}' /opt/bitnami/redis-sentinel/etc/sentinel.conf)" - info "Found previous master $master_in_persisted_conf in /opt/bitnami/redis-sentinel/etc/sentinel.conf" - debug "$(cat /opt/bitnami/redis-sentinel/etc/sentinel.conf | grep monitor)" - fi - {{- end }} - if ! get_sentinel_master_info && [[ "$master_in_persisted_conf" == "$(get_full_hostname "$HOSTNAME")" ]]; then - # No master found, lets create a master node - export REDIS_REPLICATION_MODE="master" - - REDIS_MASTER_HOST=$(get_full_hostname "$HOSTNAME") - REDIS_MASTER_PORT_NUMBER="$REDISPORT" - else - export REDIS_REPLICATION_MODE="replica" - - # Fetches current master's host and port - REDIS_SENTINEL_INFO=($(get_sentinel_master_info)) - info "printing REDIS_SENTINEL_INFO=(${REDIS_SENTINEL_INFO[0]},${REDIS_SENTINEL_INFO[1]})" - REDIS_MASTER_HOST=${REDIS_SENTINEL_INFO[0]} - REDIS_MASTER_PORT_NUMBER=${REDIS_SENTINEL_INFO[1]} - fi - - if [[ -n "$REDIS_EXTERNAL_MASTER_HOST" ]]; then - REDIS_MASTER_HOST="$REDIS_EXTERNAL_MASTER_HOST" - REDIS_MASTER_PORT_NUMBER="${REDIS_EXTERNAL_MASTER_PORT}" - fi - - cp /opt/bitnami/redis-sentinel/mounted-etc/sentinel.conf /opt/bitnami/redis-sentinel/etc/sentinel.conf - {{- if .Values.auth.enabled }} - printf "\nsentinel auth-pass %s %s" "{{ .Values.sentinel.masterSet }}" "$REDIS_PASSWORD" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf - {{- if and .Values.auth.enabled .Values.auth.sentinel }} - printf "\nrequirepass %s" "$REDIS_PASSWORD" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf - {{- end }} - {{- end }} - printf "\nsentinel myid %s" "$(host_id "$HOSTNAME")" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf - - if [[ -z "$REDIS_MASTER_HOST" ]] || [[ -z "$REDIS_MASTER_PORT_NUMBER" ]] - then - # Prevent incorrect configuration to be written to sentinel.conf - error "Redis master host is configured incorrectly (host: $REDIS_MASTER_HOST, port: $REDIS_MASTER_PORT_NUMBER)" - exit 1 - fi - - sentinel_conf_set "sentinel monitor" "{{ .Values.sentinel.masterSet }} "$REDIS_MASTER_HOST" "$REDIS_MASTER_PORT_NUMBER" {{ .Values.sentinel.quorum }}" - - add_known_sentinel() { - hostname="$1" - ip="$2" - - if [[ -n "$hostname" && -n "$ip" && "$hostname" != "$HOSTNAME" ]]; then - sentinel_conf_add "sentinel known-sentinel {{ .Values.sentinel.masterSet }} $(get_full_hostname "$hostname") $(get_port "$hostname" "SENTINEL") $(host_id "$hostname")" - fi - } - add_known_replica() { - hostname="$1" - ip="$2" - - if [[ -n "$ip" && "$(get_full_hostname "$hostname")" != "$REDIS_MASTER_HOST" ]]; then - sentinel_conf_add "sentinel known-replica {{ .Values.sentinel.masterSet }} $(get_full_hostname "$hostname") $(get_port "$hostname" "REDIS")" - fi - } - - # Add available hosts on the network as known replicas & sentinels - for node in $(seq 0 $(({{ .Values.replica.replicaCount }}-1))); do - hostname="{{ template "common.names.fullname" . }}-node-$node" - ip="$(getent hosts "$hostname.$HEADLESS_SERVICE" | awk '{ print $1 }')" - add_known_sentinel "$hostname" "$ip" - add_known_replica "$hostname" "$ip" - done - - echo "" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf - {{- if not (contains "sentinel announce-hostnames" .Values.sentinel.configuration) }} - echo "sentinel announce-hostnames yes" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf - {{- end }} - {{- if not (contains "sentinel resolve-hostnames" .Values.sentinel.configuration) }} - echo "sentinel resolve-hostnames yes" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf - {{- end }} - {{- if not (contains "sentinel announce-port" .Values.sentinel.configuration) }} - echo "sentinel announce-port $SERVPORT" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf - {{- end }} - {{- if not (contains "sentinel announce-ip" .Values.sentinel.configuration) }} - echo "sentinel announce-ip $(get_full_hostname "$HOSTNAME")" >> /opt/bitnami/redis-sentinel/etc/sentinel.conf - {{- end }} - - {{- if .Values.tls.enabled }} - ARGS=("--port" "0") - ARGS+=("--tls-port" "${REDIS_SENTINEL_TLS_PORT_NUMBER}") - ARGS+=("--tls-cert-file" "${REDIS_SENTINEL_TLS_CERT_FILE}") - ARGS+=("--tls-key-file" "${REDIS_SENTINEL_TLS_KEY_FILE}") - ARGS+=("--tls-ca-cert-file" "${REDIS_SENTINEL_TLS_CA_FILE}") - ARGS+=("--tls-replication" "yes") - ARGS+=("--tls-auth-clients" "${REDIS_SENTINEL_TLS_AUTH_CLIENTS}") - {{- if .Values.tls.dhParamsFilename }} - ARGS+=("--tls-dh-params-file" "${REDIS_SENTINEL_TLS_DH_PARAMS_FILE}") - {{- end }} - {{- end }} - {{- if .Values.sentinel.preExecCmds }} - {{ .Values.sentinel.preExecCmds | nindent 4 }} - {{- end }} - exec redis-server /opt/bitnami/redis-sentinel/etc/sentinel.conf {{- if .Values.tls.enabled }} "${ARGS[@]}" {{- end }} --sentinel - prestop-sentinel.sh: | - #!/bin/bash - - . /opt/bitnami/scripts/libvalidations.sh - . /opt/bitnami/scripts/libos.sh - - HEADLESS_SERVICE="{{ template "common.names.fullname" . }}-headless.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }}" - - get_full_hostname() { - hostname="$1" - - {{- if .Values.useExternalDNS.enabled }} - full_hostname="${hostname}.{{- include "redis.externalDNS.suffix" . }}" - {{- else if eq .Values.sentinel.service.type "NodePort" }} - full_hostname="${hostname}.{{- include "common.names.namespace" . }}" - {{- else }} - full_hostname="${hostname}.${HEADLESS_SERVICE}" - {{- end }} - - {{- if .Values.useHostnames }} - echo "${full_hostname}" - {{- else }} - retry_count=0 - until getent hosts "${full_hostname}" | awk '{ print $1; exit }' | grep .; do - if [[ $retry_count -lt {{ .Values.nameResolutionThreshold }} ]]; then - sleep {{ .Values.nameResolutionTimeout }} - else - error "IP address for ${full_hostname} not found" - exit 1 - fi - ((retry_count++)) - done - {{- end }} - } - - run_sentinel_command() { - if is_boolean_yes "$REDIS_SENTINEL_TLS_ENABLED"; then - redis-cli -h "$REDIS_SERVICE" -p "$REDIS_SENTINEL_PORT" --tls --cert "$REDIS_SENTINEL_TLS_CERT_FILE" --key "$REDIS_SENTINEL_TLS_KEY_FILE" --cacert "$REDIS_SENTINEL_TLS_CA_FILE" sentinel "$@" - else - redis-cli -h "$REDIS_SERVICE" -p "$REDIS_SENTINEL_PORT" sentinel "$@" - fi - } - sentinel_failover_finished() { - REDIS_SENTINEL_INFO=($(run_sentinel_command get-master-addr-by-name "{{ .Values.sentinel.masterSet }}")) - REDIS_MASTER_HOST="${REDIS_SENTINEL_INFO[0]}" - [[ "$REDIS_MASTER_HOST" != "$(get_full_hostname $HOSTNAME)" ]] - } - - REDIS_SERVICE="{{ include "common.names.fullname" . }}.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }}" - - {{ if .Values.auth.sentinel -}} - # redis-cli automatically consumes credentials from the REDISCLI_AUTH variable - [[ -n "$REDIS_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_PASSWORD" - [[ -f "$REDIS_PASSWORD_FILE" ]] && export REDISCLI_AUTH="$(< "${REDIS_PASSWORD_FILE}")" - {{- end }} - - if ! sentinel_failover_finished; then - echo "I am the master pod and you are stopping me. Starting sentinel failover" - if retry_while "sentinel_failover_finished" "{{ sub .Values.sentinel.terminationGracePeriodSeconds 10 }}" 1; then - echo "Master has been successfuly failed over to a different pod." - exit 0 - else - echo "Master failover failed" - exit 1 - fi - else - exit 0 - fi - prestop-redis.sh: | - #!/bin/bash - - . /opt/bitnami/scripts/libvalidations.sh - . /opt/bitnami/scripts/libos.sh - - run_redis_command() { - if is_boolean_yes "$REDIS_TLS_ENABLED"; then - redis-cli -h 127.0.0.1 -p "$REDIS_TLS_PORT" --tls --cert "$REDIS_TLS_CERT_FILE" --key "$REDIS_TLS_KEY_FILE" --cacert "$REDIS_TLS_CA_FILE" "$@" - else - redis-cli -h 127.0.0.1 -p "$REDIS_PORT" "$@" - fi - } - is_master() { - REDIS_ROLE=$(run_redis_command role | head -1) - [[ "$REDIS_ROLE" == "master" ]] - } - - HEADLESS_SERVICE="{{ template "common.names.fullname" . }}-headless.{{- include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }}" - - get_full_hostname() { - hostname="$1" - - {{- if .Values.useExternalDNS.enabled }} - full_hostname="${hostname}.{{- include "redis.externalDNS.suffix" . }}" - {{- else if eq .Values.sentinel.service.type "NodePort" }} - full_hostname="${hostname}.{{- include "common.names.namespace" . }}" - {{- else }} - full_hostname="${hostname}.${HEADLESS_SERVICE}" - {{- end }} - - {{- if .Values.useHostnames }} - echo "${full_hostname}" - {{- else }} - retry_count=0 - until getent hosts "${full_hostname}" | awk '{ print $1; exit }' | grep .; do - if [[ $retry_count -lt {{ .Values.nameResolutionThreshold }} ]]; then - sleep {{ .Values.nameResolutionTimeout }} - else - error "IP address for ${full_hostname} not found" - exit 1 - fi - ((retry_count++)) - done - {{- end }} - } - - run_sentinel_command() { - if is_boolean_yes "$REDIS_SENTINEL_TLS_ENABLED"; then - {{ .Values.auth.sentinel | ternary "" "env -u REDISCLI_AUTH " -}} redis-cli -h "$REDIS_SERVICE" -p "$REDIS_SENTINEL_PORT" --tls --cert "$REDIS_SENTINEL_TLS_CERT_FILE" --key "$REDIS_SENTINEL_TLS_KEY_FILE" --cacert "$REDIS_SENTINEL_TLS_CA_FILE" sentinel "$@" - else - {{ .Values.auth.sentinel | ternary "" "env -u REDISCLI_AUTH " -}} redis-cli -h "$REDIS_SERVICE" -p "$REDIS_SENTINEL_PORT" sentinel "$@" - fi - } - sentinel_failover_finished() { - REDIS_SENTINEL_INFO=($(run_sentinel_command get-master-addr-by-name "{{ .Values.sentinel.masterSet }}")) - REDIS_MASTER_HOST="${REDIS_SENTINEL_INFO[0]}" - [[ "$REDIS_MASTER_HOST" != "$(get_full_hostname $HOSTNAME)" ]] - } - - REDIS_SERVICE="{{ include "common.names.fullname" . }}.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }}" - - # redis-cli automatically consumes credentials from the REDISCLI_AUTH variable - [[ -n "$REDIS_PASSWORD" ]] && export REDISCLI_AUTH="$REDIS_PASSWORD" - [[ -f "$REDIS_PASSWORD_FILE" ]] && export REDISCLI_AUTH="$(< "${REDIS_PASSWORD_FILE}")" - - - if is_master && ! sentinel_failover_finished; then - echo "I am the master pod and you are stopping me. Pausing client connections." - # Pausing client write connections to avoid data loss - run_redis_command CLIENT PAUSE "{{ mul (add 2 (sub .Values.sentinel.terminationGracePeriodSeconds 10)) 1000 }}" WRITE - - echo "Issuing failover" - # if I am the master, issue a command to failover once - run_sentinel_command failover "{{ .Values.sentinel.masterSet }}" - - {{- if .Values.sentinel.redisShutdownWaitFailover }} - echo "Waiting for sentinel to complete failover for up to {{ sub .Values.sentinel.terminationGracePeriodSeconds 10 }}s" - retry_while "sentinel_failover_finished" "{{ sub .Values.sentinel.terminationGracePeriodSeconds 10 }}" 1 - {{- end }} - else - exit 0 - fi - -{{- else }} - start-master.sh: | - #!/bin/bash - - [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")" - {{- if and .Values.master.containerSecurityContext.runAsUser (eq (.Values.master.containerSecurityContext.runAsUser | int) 0) }} - useradd redis - chown -R redis {{ .Values.master.persistence.path }} - {{- end }} - if [[ -f /opt/bitnami/redis/mounted-etc/master.conf ]];then - cp /opt/bitnami/redis/mounted-etc/master.conf /opt/bitnami/redis/etc/master.conf - fi - if [[ -f /opt/bitnami/redis/mounted-etc/redis.conf ]];then - cp /opt/bitnami/redis/mounted-etc/redis.conf /opt/bitnami/redis/etc/redis.conf - fi - {{- if .Values.tls.enabled }} - ARGS=("--port" "0") - ARGS+=("--tls-port" "${REDIS_TLS_PORT}") - ARGS+=("--tls-cert-file" "${REDIS_TLS_CERT_FILE}") - ARGS+=("--tls-key-file" "${REDIS_TLS_KEY_FILE}") - ARGS+=("--tls-ca-cert-file" "${REDIS_TLS_CA_FILE}") - ARGS+=("--tls-auth-clients" "${REDIS_TLS_AUTH_CLIENTS}") - {{- if .Values.tls.dhParamsFilename }} - ARGS+=("--tls-dh-params-file" "${REDIS_TLS_DH_PARAMS_FILE}") - {{- end }} - {{- else }} - ARGS=("--port" "${REDIS_PORT}") - {{- end }} - {{- if .Values.auth.enabled }} - ARGS+=("--requirepass" "${REDIS_PASSWORD}") - ARGS+=("--masterauth" "${REDIS_PASSWORD}") - {{- else }} - ARGS+=("--protected-mode" "no") - {{- end }} - ARGS+=("--include" "/opt/bitnami/redis/etc/redis.conf") - ARGS+=("--include" "/opt/bitnami/redis/etc/master.conf") - {{- if .Values.master.extraFlags }} - {{- range .Values.master.extraFlags }} - ARGS+=({{ . | quote }}) - {{- end }} - {{- end }} - {{- if .Values.master.preExecCmds }} - {{ .Values.master.preExecCmds | nindent 4 }} - {{- end }} - {{- if .Values.master.command }} - exec {{ .Values.master.command }} "${ARGS[@]}" - {{- else }} - exec redis-server "${ARGS[@]}" - {{- end }} - {{- if eq .Values.architecture "replication" }} - start-replica.sh: | - #!/bin/bash - - get_port() { - hostname="$1" - type="$2" - - port_var=$(echo "${hostname^^}_SERVICE_PORT_$type" | sed "s/-/_/g") - port=${!port_var} - - if [ -z "$port" ]; then - case $type in - "SENTINEL") - echo {{ .Values.sentinel.containerPorts.sentinel }} - ;; - "REDIS") - echo {{ .Values.master.containerPorts.redis }} - ;; - esac - else - echo $port - fi - } - - get_full_hostname() { - hostname="$1" - - {{- if .Values.useExternalDNS.enabled }} - full_hostname="${hostname}.{{- include "redis.externalDNS.suffix" . }}" - {{- else if eq .Values.sentinel.service.type "NodePort" }} - full_hostname="${hostname}.{{- include "common.names.namespace" . }}" - {{- else }} - full_hostname="${hostname}.${HEADLESS_SERVICE}" - {{- end }} - - {{- if .Values.useHostnames }} - echo "${full_hostname}" - {{- else }} - retry_count=0 - until getent hosts "${full_hostname}" | awk '{ print $1; exit }' | grep .; do - if [[ $retry_count -lt {{ .Values.nameResolutionThreshold }} ]]; then - sleep {{ .Values.nameResolutionTimeout }} - else - error "IP address for ${full_hostname} not found" - exit 1 - fi - ((retry_count++)) - done - {{- end }} - } - - REDISPORT=$(get_port "$HOSTNAME" "REDIS") - HEADLESS_SERVICE="{{ template "common.names.fullname" . }}-headless.{{ include "common.names.namespace" . }}.svc.{{ .Values.clusterDomain }}" - - [[ -f $REDIS_PASSWORD_FILE ]] && export REDIS_PASSWORD="$(< "${REDIS_PASSWORD_FILE}")" - [[ -f $REDIS_MASTER_PASSWORD_FILE ]] && export REDIS_MASTER_PASSWORD="$(< "${REDIS_MASTER_PASSWORD_FILE}")" - {{- if and .Values.replica.containerSecurityContext.runAsUser (eq (.Values.replica.containerSecurityContext.runAsUser | int) 0) }} - useradd redis - chown -R redis {{ .Values.replica.persistence.path }} - {{- end }} - if [[ -f /opt/bitnami/redis/mounted-etc/replica.conf ]];then - cp /opt/bitnami/redis/mounted-etc/replica.conf /opt/bitnami/redis/etc/replica.conf - fi - if [[ -f /opt/bitnami/redis/mounted-etc/redis.conf ]];then - cp /opt/bitnami/redis/mounted-etc/redis.conf /opt/bitnami/redis/etc/redis.conf - fi - - echo "" >> /opt/bitnami/redis/etc/replica.conf - echo "replica-announce-port $REDISPORT" >> /opt/bitnami/redis/etc/replica.conf - echo "replica-announce-ip $(get_full_hostname "$HOSTNAME")" >> /opt/bitnami/redis/etc/replica.conf - - {{- if .Values.tls.enabled }} - ARGS=("--port" "0") - ARGS+=("--tls-port" "${REDIS_TLS_PORT}") - ARGS+=("--tls-cert-file" "${REDIS_TLS_CERT_FILE}") - ARGS+=("--tls-key-file" "${REDIS_TLS_KEY_FILE}") - ARGS+=("--tls-ca-cert-file" "${REDIS_TLS_CA_FILE}") - ARGS+=("--tls-auth-clients" "${REDIS_TLS_AUTH_CLIENTS}") - ARGS+=("--tls-replication" "yes") - {{- if .Values.tls.dhParamsFilename }} - ARGS+=("--tls-dh-params-file" "${REDIS_TLS_DH_PARAMS_FILE}") - {{- end }} - {{- else }} - ARGS=("--port" "${REDIS_PORT}") - {{- end }} - ARGS+=("--replicaof" "${REDIS_MASTER_HOST}" "${REDIS_MASTER_PORT_NUMBER}") - {{- if .Values.auth.enabled }} - ARGS+=("--requirepass" "${REDIS_PASSWORD}") - ARGS+=("--masterauth" "${REDIS_MASTER_PASSWORD}") - {{- else }} - ARGS+=("--protected-mode" "no") - {{- end }} - ARGS+=("--include" "/opt/bitnami/redis/etc/redis.conf") - ARGS+=("--include" "/opt/bitnami/redis/etc/replica.conf") - {{- if .Values.replica.extraFlags }} - {{- range .Values.replica.extraFlags }} - ARGS+=({{ . | quote }}) - {{- end }} - {{- end }} - {{- if .Values.replica.preExecCmds }} - {{ .Values.replica.preExecCmds | nindent 4 }} - {{- end }} - {{- if .Values.replica.command }} - exec {{ .Values.replica.command }} "${ARGS[@]}" - {{- else }} - exec redis-server "${ARGS[@]}" - {{- end }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/secret-svcbind.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/secret-svcbind.yaml deleted file mode 100644 index de74913e1..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/secret-svcbind.yaml +++ /dev/null @@ -1,37 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if .Values.serviceBindings.enabled }} -{{- $host := include "common.names.fullname" . }} -{{- if not .Values.sentinel.enabled }} -{{- $host = printf "%s-master" (include "common.names.fullname" .) }} -{{- end }} -{{- $port := print .Values.master.service.ports.redis }} -{{- if .Values.sentinel.enabled }} -{{- $port = print .Values.sentinel.service.ports.redis }} -{{- end }} -{{- $password := include "redis.password" . }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "common.names.fullname" . }}-svcbind - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -type: servicebinding.io/redis -data: - provider: {{ print "bitnami" | b64enc | quote }} - type: {{ print "redis" | b64enc | quote }} - host: {{ print $host | b64enc | quote }} - port: {{ print $port | b64enc | quote }} - password: {{ print $password | b64enc | quote }} - {{- if $password }} - uri: {{ printf "redis://:%s@%s:%s" $password $host $port | b64enc | quote }} - {{- else }} - uri: {{ printf "redis://%s:%s" $host $port | b64enc | quote }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/secret.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/secret.yaml deleted file mode 100644 index 003a2768c..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/secret.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.auth.enabled (not .Values.auth.existingSecret) -}} -apiVersion: v1 -kind: Secret -metadata: - name: {{ template "common.names.fullname" . }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if or .Values.secretAnnotations .Values.commonAnnotations }} - annotations: - {{- if .Values.secretAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.secretAnnotations "context" $ ) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} - {{- end }} -type: Opaque -data: - redis-password: {{ include "redis.password" . | b64enc | quote }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/hpa.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/hpa.yaml deleted file mode 100644 index f8bd35617..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/hpa.yaml +++ /dev/null @@ -1,49 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.replica.autoscaling.enabled .Values.sentinel.enabled }} -apiVersion: {{ include "common.capabilities.hpa.apiVersion" ( dict "context" $ ) }} -kind: HorizontalPodAutoscaler -metadata: - name: {{ printf "%s-node" (include "common.names.fullname" .) }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: replica - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - scaleTargetRef: - apiVersion: {{ include "common.capabilities.deployment.apiVersion" . }} - kind: StatefulSet - name: {{ printf "%s-node" (include "common.names.fullname" .) }} - minReplicas: {{ .Values.replica.autoscaling.minReplicas }} - maxReplicas: {{ .Values.replica.autoscaling.maxReplicas }} - metrics: - {{- if .Values.replica.autoscaling.targetMemory }} - - type: Resource - resource: - name: memory - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.replica.autoscaling.targetMemory }} - {{- else }} - target: - type: Utilization - averageUtilization: {{ .Values.replica.autoscaling.targetMemory }} - {{- end }} - {{- end }} - {{- if .Values.replica.autoscaling.targetCPU }} - - type: Resource - resource: - name: cpu - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.replica.autoscaling.targetCPU }} - {{- else }} - target: - type: Utilization - averageUtilization: {{ .Values.replica.autoscaling.targetCPU }} - {{- end }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/node-services.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/node-services.yaml deleted file mode 100644 index 672de5cd2..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/node-services.yaml +++ /dev/null @@ -1,67 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and (eq .Values.architecture "replication") .Values.sentinel.enabled (eq .Values.sentinel.service.type "NodePort") (or .Release.IsUpgrade .Values.sentinel.service.nodePorts.redis ) }} - -{{- range $i := until (int .Values.replica.replicaCount) }} - -{{ $portsmap := (lookup "v1" "ConfigMap" (include "common.names.namespace" $) (printf "%s-%s" ( include "common.names.fullname" $ ) "ports-configmap")).data }} - -{{ $sentinelport := 0}} -{{ $redisport := 0}} -{{- if $portsmap }} -{{ $sentinelport = index $portsmap (printf "%s-node-%s-%s" (include "common.names.fullname" $) (toString $i) "sentinel") }} -{{ $redisport = index $portsmap (printf "%s-node-%s-%s" (include "common.names.fullname" $) (toString $i) "redis") }} -{{- else }} -{{- end }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "common.names.fullname" $ }}-node-{{ $i }} - namespace: {{ include "common.names.namespace" $ | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" $.Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: node - {{- if or $.Values.commonAnnotations $.Values.sentinel.service.annotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list $.Values.sentinel.service.annotations $.Values.commonAnnotations ) "context" $ ) }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} -spec: - type: NodePort - ports: - - name: sentinel - {{- if $.Values.sentinel.service.nodePorts.sentinel }} - nodePort: {{ (add $.Values.sentinel.service.nodePorts.sentinel $i 1) }} - port: {{ (add $.Values.sentinel.service.nodePorts.sentinel $i 1) }} - {{- else }} - nodePort: {{ $sentinelport }} - port: {{ $sentinelport }} - {{- end }} - protocol: TCP - targetPort: {{ $.Values.sentinel.containerPorts.sentinel }} - - name: redis - {{- if $.Values.sentinel.service.nodePorts.redis }} - nodePort: {{ (add $.Values.sentinel.service.nodePorts.redis $i 1) }} - port: {{ (add $.Values.sentinel.service.nodePorts.redis $i 1) }} - {{- else }} - nodePort: {{ $redisport }} - port: {{ $redisport }} - {{- end }} - protocol: TCP - targetPort: {{ $.Values.replica.containerPorts.redis }} - - name: sentinel-internal - nodePort: null - port: {{ $.Values.sentinel.containerPorts.sentinel }} - protocol: TCP - targetPort: {{ $.Values.sentinel.containerPorts.sentinel }} - - name: redis-internal - nodePort: null - port: {{ $.Values.replica.containerPorts.redis }} - protocol: TCP - targetPort: {{ $.Values.replica.containerPorts.redis }} - selector: - statefulset.kubernetes.io/pod-name: {{ template "common.names.fullname" $ }}-node-{{ $i }} ---- -{{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/ports-configmap.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/ports-configmap.yaml deleted file mode 100644 index 3efed7433..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/ports-configmap.yaml +++ /dev/null @@ -1,102 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and (eq .Values.architecture "replication") .Values.sentinel.enabled (eq .Values.sentinel.service.type "NodePort") (not .Values.sentinel.service.nodePorts.redis ) }} -{{- /* create a list to keep track of ports we choose to use */}} -{{ $chosenports := (list ) }} - -{{- /* Get list of all used nodeports */}} -{{ $usedports := (list ) }} -{{- range $index, $service := (lookup "v1" "Service" "" "").items }} - {{- range.spec.ports }} - {{- if .nodePort }} - {{- $usedports = (append $usedports .nodePort) }} - {{- end }} - {{- end }} -{{- end }} - -{{- /* -comments that start with # are rendered in the output when you debug, so you can less and search for them -Vars in the comment will be rendered out, so you can check their value this way. -https://helm.sh/docs/chart_best_practices/templates/#comments-yaml-comments-vs-template-comments - -remove the template comments and leave the yaml comments to help debug -*/}} - -{{- /* Sort the list */}} -{{ $usedports = $usedports | sortAlpha }} -#usedports {{ $usedports }} - -{{- /* How many nodeports per service do we want to create, except for the main service which is always two */}} -{{ $numberofPortsPerNodeService := 2 }} - -{{- /* for every nodeport we want, loop though the used ports to get an unused port */}} -{{- range $j := until (int (add (mul (int .Values.replica.replicaCount) $numberofPortsPerNodeService) 2)) }} - {{- /* #j={{ $j }} */}} - {{- $nodeport := (add $j 30000) }} - {{- $nodeportfound := false }} - {{- range $i := $usedports }} - {{- /* #i={{ $i }} - #nodeport={{ $nodeport }} - #usedports={{ $usedports }} */}} - {{- if and (has (toString $nodeport) $usedports) (eq $nodeportfound false) }} - {{- /* nodeport conflicts with in use */}} - {{- $nodeport = (add $nodeport 1) }} - {{- else if and ( has $nodeport $chosenports) (eq $nodeportfound false) }} - {{- /* nodeport already chosen, try another */}} - {{- $nodeport = (add $nodeport 1) }} - {{- else if (eq $nodeportfound false) }} - {{- /* nodeport free to use: not already claimed and not in use */}} - {{- /* select nodeport, and place into usedports */}} - {{- $chosenports = (append $chosenports $nodeport) }} - {{- $nodeportfound = true }} - {{- else }} - {{- /* nodeport has already been chosen and locked in, just work through the rest of the list to get to the next nodeport selection */}} - {{- end }} - {{- end }} - {{- if (eq $nodeportfound false) }} - {{- $chosenports = (append $chosenports $nodeport) }} - {{- end }} - -{{- end }} - -{{- /* print the usedports and chosenports for debugging */}} -#usedports {{ $usedports }} -#chosenports {{ $chosenports }}}} - ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "common.names.fullname" . }}-ports-configmap - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: - {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -data: -{{ $portsmap := (lookup "v1" "ConfigMap" (include "common.names.namespace" .) (printf "%s-%s" ( include "common.names.fullname" . ) "ports-configmap")).data }} -{{- if $portsmap }} -{{- /* configmap already exists, do not install again */ -}} - {{- range $name, $value := $portsmap }} - "{{ $name }}": "{{ $value }}" - {{- end }} -{{- else }} -{{- /* configmap being set for first time */ -}} - {{- range $index, $port := $chosenports }} - {{- $nodenumber := (floor (div $index 2)) }} - {{- if (eq $index 0) }} - "{{ template "common.names.fullname" $ }}-sentinel": "{{ $port }}" - {{- else if (eq $index 1) }} - "{{ template "common.names.fullname" $ }}-redis": "{{ $port }}" - {{- else if (eq (mod $index 2) 0) }} - "{{ template "common.names.fullname" $ }}-node-{{ (sub $nodenumber 1) }}-sentinel": "{{ $port }}" - {{- else if (eq (mod $index 2) 1) }} - "{{ template "common.names.fullname" $ }}-node-{{ (sub $nodenumber 1) }}-redis": "{{ $port }}" - {{- end }} - {{- end }} -{{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/service.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/service.yaml deleted file mode 100644 index f80e6442a..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/service.yaml +++ /dev/null @@ -1,104 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if or .Release.IsUpgrade (ne .Values.sentinel.service.type "NodePort") .Values.sentinel.service.nodePorts.redis -}} -{{- if and (eq .Values.architecture "replication") .Values.sentinel.enabled }} -{{ $portsmap := (lookup "v1" "ConfigMap" (include "common.names.namespace" .) (printf "%s-%s" ( include "common.names.fullname" . ) "ports-configmap")).data }} - -{{ $sentinelport := 0}} -{{ $redisport := 0}} -{{- if $portsmap }} -{{ $sentinelport = index $portsmap (printf "%s-%s" (include "common.names.fullname" $) "sentinel") }} -{{ $redisport = index $portsmap (printf "%s-%s" (include "common.names.fullname" $) "redis") }} -{{- else }} -{{- end }} - -apiVersion: v1 -kind: Service -metadata: - name: {{ template "common.names.fullname" . }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: node - {{- if or .Values.sentinel.service.annotations .Values.commonAnnotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.sentinel.service.annotations .Values.commonAnnotations ) "context" . ) }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} -spec: - type: {{ .Values.sentinel.service.type }} - {{- if or (eq .Values.sentinel.service.type "LoadBalancer") (eq .Values.sentinel.service.type "NodePort") }} - externalTrafficPolicy: {{ .Values.sentinel.service.externalTrafficPolicy | quote }} - {{- end }} - {{- if and (eq .Values.sentinel.service.type "LoadBalancer") (not (empty .Values.sentinel.service.loadBalancerIP)) }} - loadBalancerIP: {{ .Values.sentinel.service.loadBalancerIP }} - {{- end }} - {{- if and (eq .Values.sentinel.service.type "LoadBalancer") .Values.sentinel.service.loadBalancerClass }} - loadBalancerClass: {{ .Values.sentinel.service.loadBalancerClass }} - {{- end }} - {{- if and (eq .Values.sentinel.service.type "LoadBalancer") (not (empty .Values.sentinel.service.loadBalancerSourceRanges)) }} - loadBalancerSourceRanges: {{ toYaml .Values.sentinel.service.loadBalancerSourceRanges | nindent 4 }} - {{- end }} - {{- if and .Values.sentinel.service.clusterIP (eq .Values.sentinel.service.type "ClusterIP") }} - clusterIP: {{ .Values.sentinel.service.clusterIP }} - {{- end }} - {{- if .Values.sentinel.service.sessionAffinity }} - sessionAffinity: {{ .Values.sentinel.service.sessionAffinity }} - {{- end }} - {{- if .Values.sentinel.service.sessionAffinityConfig }} - sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.sentinel.service.sessionAffinityConfig "context" $) | nindent 4 }} - {{- end }} - ports: - - name: tcp-redis - {{- if and (or (eq .Values.sentinel.service.type "NodePort") (eq .Values.sentinel.service.type "LoadBalancer")) .Values.sentinel.service.nodePorts.redis }} - port: {{ .Values.sentinel.service.nodePorts.redis }} - {{- else if eq .Values.sentinel.service.type "NodePort" }} - port: {{ $redisport }} - {{- else}} - port: {{ .Values.sentinel.service.ports.redis }} - {{- end }} - targetPort: {{ .Values.replica.containerPorts.redis }} - {{- if and (or (eq .Values.sentinel.service.type "NodePort") (eq .Values.sentinel.service.type "LoadBalancer")) .Values.sentinel.service.nodePorts.redis }} - nodePort: {{ .Values.sentinel.service.nodePorts.redis }} - {{- else if eq .Values.sentinel.service.type "ClusterIP" }} - nodePort: null - {{- else if eq .Values.sentinel.service.type "NodePort" }} - nodePort: {{ $redisport }} - {{- end }} - - name: tcp-sentinel - {{- if and (or (eq .Values.sentinel.service.type "NodePort") (eq .Values.sentinel.service.type "LoadBalancer")) .Values.sentinel.service.nodePorts.sentinel }} - port: {{ .Values.sentinel.service.nodePorts.sentinel }} - {{- else if eq .Values.sentinel.service.type "NodePort" }} - port: {{ $sentinelport }} - {{- else }} - port: {{ .Values.sentinel.service.ports.sentinel }} - {{- end }} - targetPort: {{ .Values.sentinel.containerPorts.sentinel }} - {{- if and (or (eq .Values.sentinel.service.type "NodePort") (eq .Values.sentinel.service.type "LoadBalancer")) .Values.sentinel.service.nodePorts.sentinel }} - nodePort: {{ .Values.sentinel.service.nodePorts.sentinel }} - {{- else if eq .Values.sentinel.service.type "ClusterIP" }} - nodePort: null - {{- else if eq .Values.sentinel.service.type "NodePort" }} - nodePort: {{ $sentinelport }} - {{- end }} - {{- if eq .Values.sentinel.service.type "NodePort" }} - - name: sentinel-internal - nodePort: null - port: {{ .Values.sentinel.containerPorts.sentinel }} - protocol: TCP - targetPort: {{ .Values.sentinel.containerPorts.sentinel }} - - name: redis-internal - nodePort: null - port: {{ .Values.replica.containerPorts.redis }} - protocol: TCP - targetPort: {{ .Values.replica.containerPorts.redis }} - {{- end }} - {{- if .Values.sentinel.service.extraPorts }} - {{- include "common.tplvalues.render" (dict "value" .Values.sentinel.service.extraPorts "context" $) | nindent 4 }} - {{- end }} - {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.replica.podLabels .Values.commonLabels ) "context" . ) }} - selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: node -{{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/statefulset.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/statefulset.yaml deleted file mode 100644 index 73950ac35..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/sentinel/statefulset.yaml +++ /dev/null @@ -1,785 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if or .Release.IsUpgrade (ne .Values.sentinel.service.type "NodePort") .Values.sentinel.service.nodePorts.redis -}} -{{- if and (eq .Values.architecture "replication") .Values.sentinel.enabled }} -apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }} -kind: StatefulSet -metadata: - name: {{ printf "%s-node" (include "common.names.fullname" .) }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - app.kubernetes.io/component: node - {{- if or .Values.commonAnnotations .Values.sentinel.annotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.sentinel.annotations .Values.commonAnnotations ) "context" . ) }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.replica.replicaCount }} - {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.replica.podLabels .Values.commonLabels ) "context" . ) }} - selector: - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }} - app.kubernetes.io/component: node - serviceName: {{ printf "%s-headless" (include "common.names.fullname" .) }} - {{- if .Values.replica.updateStrategy }} - updateStrategy: {{- toYaml .Values.replica.updateStrategy | nindent 4 }} - {{- end }} - {{- if and .Values.replica.minReadySeconds (semverCompare ">= 1.23-0" (include "common.capabilities.kubeVersion" .)) }} - minReadySeconds: {{ .Values.replica.minReadySeconds }} - {{- end }} - {{- if .Values.replica.podManagementPolicy }} - podManagementPolicy: {{ .Values.replica.podManagementPolicy | quote }} - {{- end }} - template: - metadata: - labels: {{- include "common.labels.standard" ( dict "customLabels" $podLabels "context" $ ) | nindent 8 }} - app.kubernetes.io/component: node - {{- if and .Values.metrics.enabled .Values.metrics.podLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.podLabels "context" $ ) | nindent 8 }} - {{- end }} - annotations: - {{- if (include "redis.createConfigmap" .) }} - checksum/configmap: {{ pick ( include (print $.Template.BasePath "/configmap.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} - {{- end }} - checksum/health: {{ pick ( include (print $.Template.BasePath "/health-configmap.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} - checksum/scripts: {{ pick ( include (print $.Template.BasePath "/scripts-configmap.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} - checksum/secret: {{ pick ( include (print $.Template.BasePath "/secret.yaml") . | fromYaml ) "data" | toYaml | sha256sum }} - {{- if .Values.replica.podAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.replica.podAnnotations "context" $ ) | nindent 8 }} - {{- end }} - {{- if and .Values.metrics.enabled .Values.metrics.podAnnotations }} - {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.podAnnotations "context" $ ) | nindent 8 }} - {{- end }} - spec: - {{- include "redis.imagePullSecrets" . | nindent 6 }} - automountServiceAccountToken: {{ .Values.replica.automountServiceAccountToken }} - {{- if .Values.replica.hostAliases }} - hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.replica.hostAliases "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.replica.podSecurityContext.enabled }} - securityContext: {{- omit .Values.replica.podSecurityContext "enabled" | toYaml | nindent 8 }} - {{- end }} - serviceAccountName: {{ template "redis.serviceAccountName" . }} - {{- if .Values.replica.priorityClassName }} - priorityClassName: {{ .Values.replica.priorityClassName | quote }} - {{- end }} - {{- if .Values.replica.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.replica.affinity "context" $) | nindent 8 }} - {{- else }} - affinity: - podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.replica.podAffinityPreset "component" "node" "customLabels" $podLabels "context" $) | nindent 10 }} - podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.replica.podAntiAffinityPreset "component" "node" "customLabels" $podLabels "context" $) | nindent 10 }} - nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.replica.nodeAffinityPreset.type "key" .Values.replica.nodeAffinityPreset.key "values" .Values.replica.nodeAffinityPreset.values) | nindent 10 }} - {{- end }} - {{- if .Values.replica.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.replica.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.replica.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.replica.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.replica.topologySpreadConstraints }} - topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.replica.topologySpreadConstraints "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.replica.shareProcessNamespace }} - shareProcessNamespace: {{ .Values.replica.shareProcessNamespace }} - {{- end }} - {{- if .Values.replica.schedulerName }} - schedulerName: {{ .Values.replica.schedulerName | quote }} - {{- end }} - {{- if .Values.replica.dnsPolicy }} - dnsPolicy: {{ .Values.replica.dnsPolicy }} - {{- end }} - {{- if .Values.replica.dnsConfig }} - dnsConfig: {{- include "common.tplvalues.render" (dict "value" .Values.replica.dnsConfig "context" $) | nindent 8 }} - {{- end }} - enableServiceLinks: {{ .Values.sentinel.enableServiceLinks }} - terminationGracePeriodSeconds: {{ .Values.sentinel.terminationGracePeriodSeconds }} - containers: - - name: redis - image: {{ template "redis.image" . }} - imagePullPolicy: {{ .Values.image.pullPolicy | quote }} - {{- if not .Values.diagnosticMode.enabled }} - {{- if .Values.replica.lifecycleHooks }} - lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.replica.lifecycleHooks "context" $) | nindent 12 }} - {{- else }} - lifecycle: - preStop: - exec: - command: - - /bin/bash - - -c - - /opt/bitnami/scripts/start-scripts/prestop-redis.sh - {{- end }} - {{- end }} - {{- if .Values.replica.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.replica.containerSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} - {{- else if .Values.replica.command }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.replica.command "context" $) | nindent 12 }} - {{- else }} - command: - - /bin/bash - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} - {{- else if .Values.replica.args }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.replica.args "context" $) | nindent 12 }} - {{- else }} - args: - - -c - - /opt/bitnami/scripts/start-scripts/start-node.sh - {{- end }} - env: - - name: BITNAMI_DEBUG - value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }} - - name: REDIS_MASTER_PORT_NUMBER - value: {{ .Values.replica.containerPorts.redis | quote }} - - name: ALLOW_EMPTY_PASSWORD - value: {{ ternary "no" "yes" .Values.auth.enabled | quote }} - {{- if .Values.auth.enabled }} - {{- if .Values.auth.usePasswordFiles }} - - name: REDIS_PASSWORD_FILE - value: "/opt/bitnami/redis/secrets/redis-password" - - name: REDIS_MASTER_PASSWORD_FILE - value: "/opt/bitnami/redis/secrets/redis-password" - {{- else }} - - name: REDIS_PASSWORD - valueFrom: - secretKeyRef: - name: {{ template "redis.secretName" . }} - key: {{ template "redis.secretPasswordKey" . }} - - name: REDIS_MASTER_PASSWORD - valueFrom: - secretKeyRef: - name: {{ template "redis.secretName" . }} - key: {{ template "redis.secretPasswordKey" . }} - {{- end }} - {{- end }} - - name: REDIS_TLS_ENABLED - value: {{ ternary "yes" "no" .Values.tls.enabled | quote }} - {{- if .Values.tls.enabled }} - - name: REDIS_TLS_PORT - value: {{ .Values.replica.containerPorts.redis | quote }} - - name: REDIS_TLS_AUTH_CLIENTS - value: {{ ternary "yes" "no" .Values.tls.authClients | quote }} - - name: REDIS_TLS_CERT_FILE - value: {{ template "redis.tlsCert" . }} - - name: REDIS_TLS_KEY_FILE - value: {{ template "redis.tlsCertKey" . }} - - name: REDIS_TLS_CA_FILE - value: {{ template "redis.tlsCACert" . }} - {{- if .Values.tls.dhParamsFilename }} - - name: REDIS_TLS_DH_PARAMS_FILE - value: {{ template "redis.tlsDHParams" . }} - {{- end }} - {{- else }} - - name: REDIS_PORT - value: {{ .Values.replica.containerPorts.redis | quote }} - {{- end }} - - name: REDIS_SENTINEL_TLS_ENABLED - value: {{ ternary "yes" "no" .Values.tls.enabled | quote }} - {{- if .Values.tls.enabled }} - - name: REDIS_SENTINEL_TLS_PORT_NUMBER - value: {{ .Values.sentinel.containerPorts.sentinel | quote }} - - name: REDIS_SENTINEL_TLS_AUTH_CLIENTS - value: {{ ternary "yes" "no" .Values.tls.authClients | quote }} - - name: REDIS_SENTINEL_TLS_CERT_FILE - value: {{ template "redis.tlsCert" . }} - - name: REDIS_SENTINEL_TLS_KEY_FILE - value: {{ template "redis.tlsCertKey" . }} - - name: REDIS_SENTINEL_TLS_CA_FILE - value: {{ template "redis.tlsCACert" . }} - {{- if .Values.tls.dhParamsFilename }} - - name: REDIS_SENTINEL_TLS_DH_PARAMS_FILE - value: {{ template "redis.tlsDHParams" . }} - {{- end }} - {{- else }} - - name: REDIS_SENTINEL_PORT - value: {{ .Values.sentinel.containerPorts.sentinel | quote }} - {{- end }} - - name: REDIS_DATA_DIR - value: {{ .Values.replica.persistence.path }} - {{- if .Values.replica.externalMaster.enabled }} - - name: REDIS_EXTERNAL_MASTER_HOST - value: {{ .Values.replica.externalMaster.host | quote }} - - name: REDIS_EXTERNAL_MASTER_PORT - value: {{ .Values.replica.externalMaster.port | quote }} - {{- end }} - {{- if .Values.replica.extraEnvVars }} - {{- include "common.tplvalues.render" ( dict "value" .Values.replica.extraEnvVars "context" $ ) | nindent 12 }} - {{- end }} - {{- if or .Values.replica.extraEnvVarsCM .Values.replica.extraEnvVarsSecret }} - envFrom: - {{- if .Values.replica.extraEnvVarsCM }} - - configMapRef: - name: {{ .Values.replica.extraEnvVarsCM }} - {{- end }} - {{- if .Values.replica.extraEnvVarsSecret }} - - secretRef: - name: {{ .Values.replica.extraEnvVarsSecret }} - {{- end }} - {{- end }} - ports: - - name: redis - containerPort: {{ .Values.replica.containerPorts.redis }} - {{- if not .Values.diagnosticMode.enabled }} - {{- if .Values.replica.customStartupProbe }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.replica.customStartupProbe "context" $) | nindent 12 }} - {{- else if .Values.replica.startupProbe.enabled }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.replica.startupProbe "enabled") "context" $) | nindent 12 }} - exec: - command: - - sh - - -c - - /health/ping_liveness_local.sh {{ .Values.replica.livenessProbe.timeoutSeconds }} - {{- end }} - {{- if .Values.replica.customLivenessProbe }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.replica.customLivenessProbe "context" $) | nindent 12 }} - {{- else if .Values.replica.livenessProbe.enabled }} - livenessProbe: - initialDelaySeconds: {{ .Values.replica.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.replica.livenessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.replica.livenessProbe.timeoutSeconds }} - successThreshold: {{ .Values.replica.livenessProbe.successThreshold }} - failureThreshold: {{ .Values.replica.livenessProbe.failureThreshold }} - exec: - command: - - sh - - -c - - /health/ping_liveness_local.sh {{ .Values.replica.livenessProbe.timeoutSeconds }} - {{- end }} - {{- if .Values.replica.customReadinessProbe }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.replica.customReadinessProbe "context" $) | nindent 12 }} - {{- else if .Values.replica.readinessProbe.enabled }} - readinessProbe: - initialDelaySeconds: {{ .Values.replica.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.replica.readinessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.replica.readinessProbe.timeoutSeconds }} - successThreshold: {{ .Values.replica.readinessProbe.successThreshold }} - failureThreshold: {{ .Values.replica.readinessProbe.failureThreshold }} - exec: - command: - - sh - - -c - - /health/ping_readiness_local.sh {{ .Values.replica.readinessProbe.timeoutSeconds }} - {{- end }} - {{- end }} - {{- if .Values.replica.resources }} - resources: {{- toYaml .Values.replica.resources | nindent 12 }} - {{- end }} - volumeMounts: - - name: start-scripts - mountPath: /opt/bitnami/scripts/start-scripts - - name: health - mountPath: /health - {{- if .Values.sentinel.persistence.enabled }} - - name: sentinel-data - mountPath: /opt/bitnami/redis-sentinel/etc - {{- end }} - {{- if .Values.auth.usePasswordFiles }} - - name: redis-password - mountPath: /opt/bitnami/redis/secrets/ - {{- end }} - - name: redis-data - mountPath: {{ .Values.replica.persistence.path }} - {{- if .Values.replica.persistence.subPath }} - subPath: {{ .Values.replica.persistence.subPath }} - {{- else if .Values.replica.persistence.subPathExpr }} - subPathExpr: {{ .Values.replica.persistence.subPathExpr }} - {{- end }} - - name: config - mountPath: /opt/bitnami/redis/mounted-etc - - name: redis-tmp-conf - mountPath: /opt/bitnami/redis/etc - - name: tmp - mountPath: /tmp - {{- if .Values.tls.enabled }} - - name: redis-certificates - mountPath: /opt/bitnami/redis/certs - readOnly: true - {{- end }} - {{- if .Values.replica.extraVolumeMounts }} - {{- include "common.tplvalues.render" ( dict "value" .Values.replica.extraVolumeMounts "context" $ ) | nindent 12 }} - {{- end }} - - name: sentinel - image: {{ template "redis.sentinel.image" . }} - imagePullPolicy: {{ .Values.sentinel.image.pullPolicy | quote }} - {{- if not .Values.diagnosticMode.enabled }} - {{- if .Values.sentinel.lifecycleHooks }} - lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.sentinel.lifecycleHooks "context" $) | nindent 12 }} - {{- else }} - lifecycle: - preStop: - exec: - command: - - /bin/bash - - -c - - /opt/bitnami/scripts/start-scripts/prestop-sentinel.sh - {{- end }} - {{- end }} - {{- if .Values.sentinel.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.sentinel.containerSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} - {{- else if .Values.sentinel.command }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.sentinel.command "context" $) | nindent 12 }} - {{- else }} - command: - - /bin/bash - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} - {{- else if .Values.sentinel.args }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.sentinel.args "context" $) | nindent 12 }} - {{- else }} - args: - - -c - - /opt/bitnami/scripts/start-scripts/start-sentinel.sh - {{- end }} - env: - - name: BITNAMI_DEBUG - value: {{ ternary "true" "false" (or .Values.sentinel.image.debug .Values.diagnosticMode.enabled) | quote }} - {{- if .Values.auth.enabled }} - {{- if .Values.auth.usePasswordFiles }} - - name: REDIS_PASSWORD_FILE - value: "/opt/bitnami/redis/secrets/redis-password" - {{- else }} - - name: REDIS_PASSWORD - valueFrom: - secretKeyRef: - name: {{ template "redis.secretName" . }} - key: {{ template "redis.secretPasswordKey" . }} - {{- end }} - {{- else }} - - name: ALLOW_EMPTY_PASSWORD - value: "yes" - {{- end }} - - name: REDIS_SENTINEL_TLS_ENABLED - value: {{ ternary "yes" "no" .Values.tls.enabled | quote }} - {{- if .Values.tls.enabled }} - - name: REDIS_SENTINEL_TLS_PORT_NUMBER - value: {{ .Values.sentinel.containerPorts.sentinel | quote }} - - name: REDIS_SENTINEL_TLS_AUTH_CLIENTS - value: {{ ternary "yes" "no" .Values.tls.authClients | quote }} - - name: REDIS_SENTINEL_TLS_CERT_FILE - value: {{ template "redis.tlsCert" . }} - - name: REDIS_SENTINEL_TLS_KEY_FILE - value: {{ template "redis.tlsCertKey" . }} - - name: REDIS_SENTINEL_TLS_CA_FILE - value: {{ template "redis.tlsCACert" . }} - {{- if .Values.tls.dhParamsFilename }} - - name: REDIS_SENTINEL_TLS_DH_PARAMS_FILE - value: {{ template "redis.tlsDHParams" . }} - {{- end }} - {{- else }} - - name: REDIS_SENTINEL_PORT - value: {{ .Values.sentinel.containerPorts.sentinel | quote }} - {{- end }} - {{- if .Values.sentinel.externalMaster.enabled }} - - name: REDIS_EXTERNAL_MASTER_HOST - value: {{ .Values.sentinel.externalMaster.host | quote }} - - name: REDIS_EXTERNAL_MASTER_PORT - value: {{ .Values.sentinel.externalMaster.port | quote }} - {{- end }} - {{- if .Values.sentinel.extraEnvVars }} - {{- include "common.tplvalues.render" ( dict "value" .Values.sentinel.extraEnvVars "context" $ ) | nindent 12 }} - {{- end }} - {{- if or .Values.sentinel.extraEnvVarsCM .Values.sentinel.extraEnvVarsSecret }} - envFrom: - {{- if .Values.sentinel.extraEnvVarsCM }} - - configMapRef: - name: {{ .Values.sentinel.extraEnvVarsCM }} - {{- end }} - {{- if .Values.sentinel.extraEnvVarsSecret }} - - secretRef: - name: {{ .Values.sentinel.extraEnvVarsSecret }} - {{- end }} - {{- end }} - ports: - - name: redis-sentinel - containerPort: {{ .Values.sentinel.containerPorts.sentinel }} - {{- if not .Values.diagnosticMode.enabled }} - {{- if .Values.sentinel.customStartupProbe }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.sentinel.customStartupProbe "context" $) | nindent 12 }} - {{- else if .Values.sentinel.startupProbe.enabled }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.sentinel.startupProbe "enabled") "context" $) | nindent 12 }} - exec: - command: - - sh - - -c - - /health/ping_sentinel.sh {{ .Values.sentinel.livenessProbe.timeoutSeconds }} - {{- end }} - {{- if .Values.sentinel.customLivenessProbe }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.sentinel.customLivenessProbe "context" $) | nindent 12 }} - {{- else if .Values.sentinel.livenessProbe.enabled }} - livenessProbe: - initialDelaySeconds: {{ .Values.sentinel.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.sentinel.livenessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.sentinel.livenessProbe.timeoutSeconds }} - successThreshold: {{ .Values.sentinel.livenessProbe.successThreshold }} - failureThreshold: {{ .Values.sentinel.livenessProbe.failureThreshold }} - exec: - command: - - sh - - -c - - /health/ping_sentinel.sh {{ .Values.sentinel.livenessProbe.timeoutSeconds }} - {{- end }} - {{- end }} - {{- if not .Values.diagnosticMode.enabled }} - {{- if .Values.sentinel.customReadinessProbe }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.sentinel.customReadinessProbe "context" $) | nindent 12 }} - {{- else if .Values.sentinel.readinessProbe.enabled }} - readinessProbe: - initialDelaySeconds: {{ .Values.sentinel.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.sentinel.readinessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.sentinel.readinessProbe.timeoutSeconds }} - successThreshold: {{ .Values.sentinel.readinessProbe.successThreshold }} - failureThreshold: {{ .Values.sentinel.readinessProbe.failureThreshold }} - exec: - command: - - sh - - -c - - /health/ping_sentinel.sh {{ .Values.sentinel.readinessProbe.timeoutSeconds }} - {{- end }} - {{- end }} - {{- if .Values.sentinel.resources }} - resources: {{- toYaml .Values.sentinel.resources | nindent 12 }} - {{- end }} - volumeMounts: - - name: start-scripts - mountPath: /opt/bitnami/scripts/start-scripts - - name: health - mountPath: /health - - name: sentinel-data - mountPath: /opt/bitnami/redis-sentinel/etc - {{- if .Values.auth.usePasswordFiles }} - - name: redis-password - mountPath: /opt/bitnami/redis/secrets/ - {{- end }} - - name: redis-data - mountPath: {{ .Values.replica.persistence.path }} - {{- if .Values.replica.persistence.subPath }} - subPath: {{ .Values.replica.persistence.subPath }} - {{- else if .Values.replica.persistence.subPathExpr }} - subPathExpr: {{ .Values.replica.persistence.subPathExpr }} - {{- end }} - - name: config - mountPath: /opt/bitnami/redis-sentinel/mounted-etc - {{- if .Values.tls.enabled }} - - name: redis-certificates - mountPath: /opt/bitnami/redis/certs - readOnly: true - {{- end }} - {{- if .Values.sentinel.extraVolumeMounts }} - {{- include "common.tplvalues.render" ( dict "value" .Values.sentinel.extraVolumeMounts "context" $ ) | nindent 12 }} - {{- end }} - {{- if .Values.metrics.enabled }} - - name: metrics - image: {{ template "redis.metrics.image" . }} - imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }} - {{- if .Values.metrics.containerSecurityContext.enabled }} - securityContext: {{- omit .Values.metrics.containerSecurityContext "enabled" | toYaml | nindent 12 }} - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} - {{- else }} - command: - - /bin/bash - - -c - - | - if [[ -f '/secrets/redis-password' ]]; then - export REDIS_PASSWORD=$(cat /secrets/redis-password) - fi - redis_exporter{{- range $key, $value := .Values.metrics.extraArgs }} --{{ $key }}={{ $value }}{{- end }} - {{- end }} - {{- if .Values.diagnosticMode.enabled }} - args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} - {{- end }} - env: - - name: REDIS_ALIAS - value: {{ template "common.names.fullname" . }} - {{- if .Values.auth.enabled }} - - name: REDIS_USER - value: default - {{- if (not .Values.auth.usePasswordFiles) }} - - name: REDIS_PASSWORD - valueFrom: - secretKeyRef: - name: {{ template "redis.secretName" . }} - key: {{ template "redis.secretPasswordKey" . }} - {{- end }} - {{- end }} - {{- if .Values.tls.enabled }} - - name: REDIS_ADDR - value: rediss://{{ .Values.metrics.redisTargetHost }}:{{ .Values.replica.containerPorts.redis }} - {{- if .Values.tls.authClients }} - - name: REDIS_EXPORTER_TLS_CLIENT_KEY_FILE - value: {{ template "redis.tlsCertKey" . }} - - name: REDIS_EXPORTER_TLS_CLIENT_CERT_FILE - value: {{ template "redis.tlsCert" . }} - {{- end }} - - name: REDIS_EXPORTER_TLS_CA_CERT_FILE - value: {{ template "redis.tlsCACert" . }} - {{- end }} - {{- if .Values.metrics.extraEnvVars }} - {{- include "common.tplvalues.render" (dict "value" .Values.metrics.extraEnvVars "context" $) | nindent 12 }} - {{- end }} - ports: - - name: metrics - containerPort: 9121 - {{- if not .Values.diagnosticMode.enabled }} - {{- if .Values.metrics.customStartupProbe }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customStartupProbe "context" $) | nindent 12 }} - {{- else if .Values.metrics.startupProbe.enabled }} - startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.startupProbe "enabled") "context" $) | nindent 12 }} - tcpSocket: - port: metrics - {{- end }} - {{- if .Values.metrics.customLivenessProbe }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customLivenessProbe "context" $) | nindent 12 }} - {{- else if .Values.metrics.livenessProbe.enabled }} - livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.livenessProbe "enabled") "context" $) | nindent 12 }} - tcpSocket: - port: metrics - {{- end }} - {{- if .Values.metrics.customReadinessProbe }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customReadinessProbe "context" $) | nindent 12 }} - {{- else if .Values.metrics.readinessProbe.enabled }} - readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.readinessProbe "enabled") "context" $) | nindent 12 }} - httpGet: - path: / - port: metrics - {{- end }} - {{- end }} - {{- if .Values.metrics.resources }} - resources: {{- toYaml .Values.metrics.resources | nindent 12 }} - {{- end }} - volumeMounts: - {{- if .Values.auth.usePasswordFiles }} - - name: redis-password - mountPath: /secrets/ - {{- end }} - {{- if .Values.tls.enabled }} - - name: redis-certificates - mountPath: /opt/bitnami/redis/certs - readOnly: true - {{- end }} - {{- if .Values.metrics.extraVolumeMounts }} - {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.extraVolumeMounts "context" $ ) | nindent 12 }} - {{- end }} - {{- end }} - {{- if .Values.replica.sidecars }} - {{- include "common.tplvalues.render" (dict "value" .Values.replica.sidecars "context" $) | nindent 8 }} - {{- end }} - {{- $needsVolumePermissions := and .Values.volumePermissions.enabled .Values.replica.persistence.enabled .Values.replica.podSecurityContext.enabled .Values.replica.containerSecurityContext.enabled }} - {{- if or .Values.replica.initContainers $needsVolumePermissions .Values.sysctl.enabled }} - initContainers: - {{- if .Values.replica.initContainers }} - {{- include "common.tplvalues.render" (dict "value" .Values.replica.initContainers "context" $) | nindent 8 }} - {{- end }} - {{- if $needsVolumePermissions }} - - name: volume-permissions - image: {{ include "redis.volumePermissions.image" . }} - imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }} - command: - - /bin/bash - - -ec - - | - {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} - chown -R `id -u`:`id -G | cut -d " " -f2` {{ .Values.replica.persistence.path }} - {{- else }} - chown -R {{ .Values.replica.containerSecurityContext.runAsUser }}:{{ .Values.replica.podSecurityContext.fsGroup }} {{ .Values.replica.persistence.path }} - {{- end }} - {{- if eq ( toString ( .Values.volumePermissions.containerSecurityContext.runAsUser )) "auto" }} - securityContext: {{- omit .Values.volumePermissions.containerSecurityContext "runAsUser" | toYaml | nindent 12 }} - {{- else }} - securityContext: {{- .Values.volumePermissions.containerSecurityContext | toYaml | nindent 12 }} - {{- end }} - {{- if .Values.volumePermissions.resources }} - resources: {{- toYaml .Values.volumePermissions.resources | nindent 12 }} - {{- end }} - volumeMounts: - - name: redis-data - mountPath: {{ .Values.replica.persistence.path }} - {{- if .Values.replica.persistence.subPath }} - subPath: {{ .Values.replica.persistence.subPath }} - {{- else if .Values.replica.persistence.subPathExpr }} - subPathExpr: {{ .Values.replica.persistence.subPathExpr }} - {{- end }} - {{- end }} - {{- if .Values.sysctl.enabled }} - - name: init-sysctl - image: {{ include "redis.sysctl.image" . }} - imagePullPolicy: {{ default "" .Values.sysctl.image.pullPolicy | quote }} - securityContext: - privileged: true - runAsUser: 0 - {{- if .Values.sysctl.command }} - command: {{- include "common.tplvalues.render" (dict "value" .Values.sysctl.command "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.sysctl.resources }} - resources: {{- toYaml .Values.sysctl.resources | nindent 12 }} - {{- end }} - {{- if .Values.sysctl.mountHostSys }} - volumeMounts: - - name: host-sys - mountPath: /host-sys - {{- end }} - {{- end }} - {{- end }} - volumes: - - name: start-scripts - configMap: - name: {{ printf "%s-scripts" (include "common.names.fullname" .) }} - defaultMode: 0755 - - name: health - configMap: - name: {{ printf "%s-health" (include "common.names.fullname" .) }} - defaultMode: 0755 - {{- if .Values.auth.usePasswordFiles }} - - name: redis-password - secret: - secretName: {{ template "redis.secretName" . }} - items: - - key: {{ template "redis.secretPasswordKey" . }} - path: redis-password - {{- end }} - - name: config - configMap: - name: {{ include "redis.configmapName" . }} - {{- if .Values.sysctl.mountHostSys }} - - name: host-sys - hostPath: - path: /sys - {{- end }} - {{- if not .Values.sentinel.persistence.enabled }} - - name: sentinel-data - {{- if or .Values.sentinel.persistence.medium .Values.sentinel.persistence.sizeLimit }} - emptyDir: - {{- if .Values.sentinel.persistence.medium }} - medium: {{ .Values.sentinel.persistence.medium | quote }} - {{- end }} - {{- if .Values.sentinel.persistence.sizeLimit }} - sizeLimit: {{ .Values.sentinel.persistence.sizeLimit | quote }} - {{- end }} - {{- else }} - emptyDir: {} - {{- end }} - {{- end }} - - name: redis-tmp-conf - {{- if or .Values.sentinel.persistence.medium .Values.sentinel.persistence.sizeLimit }} - emptyDir: - {{- if .Values.sentinel.persistence.medium }} - medium: {{ .Values.sentinel.persistence.medium | quote }} - {{- end }} - {{- if .Values.sentinel.persistence.sizeLimit }} - sizeLimit: {{ .Values.sentinel.persistence.sizeLimit | quote }} - {{- end }} - {{- else }} - emptyDir: {} - {{- end }} - - name: tmp - {{- if or .Values.sentinel.persistence.medium .Values.sentinel.persistence.sizeLimit }} - emptyDir: - {{- if .Values.sentinel.persistence.medium }} - medium: {{ .Values.sentinel.persistence.medium | quote }} - {{- end }} - {{- if .Values.sentinel.persistence.sizeLimit }} - sizeLimit: {{ .Values.sentinel.persistence.sizeLimit | quote }} - {{- end }} - {{- else }} - emptyDir: {} - {{- end }} - {{- if .Values.replica.extraVolumes }} - {{- include "common.tplvalues.render" ( dict "value" .Values.replica.extraVolumes "context" $ ) | nindent 8 }} - {{- end }} - {{- if .Values.metrics.extraVolumes }} - {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.extraVolumes "context" $ ) | nindent 8 }} - {{- end }} - {{- if .Values.sentinel.extraVolumes }} - {{- include "common.tplvalues.render" ( dict "value" .Values.sentinel.extraVolumes "context" $ ) | nindent 8 }} - {{- end }} - {{- if .Values.tls.enabled }} - - name: redis-certificates - secret: - secretName: {{ include "redis.tlsSecretName" . }} - defaultMode: 256 - {{- end }} - {{- if not .Values.replica.persistence.enabled }} - - name: redis-data - {{- if or .Values.replica.persistence.medium .Values.replica.persistence.sizeLimit }} - emptyDir: - {{- if .Values.replica.persistence.medium }} - medium: {{ .Values.replica.persistence.medium | quote }} - {{- end }} - {{- if .Values.replica.persistence.sizeLimit }} - sizeLimit: {{ .Values.replica.persistence.sizeLimit | quote }} - {{- end }} - {{- else }} - emptyDir: {} - {{- end }} - {{- else if .Values.replica.persistence.existingClaim }} - - name: redis-data - persistentVolumeClaim: - claimName: {{ printf "%s" (tpl .Values.replica.persistence.existingClaim .) }} - {{- else }} - {{- if .Values.sentinel.persistentVolumeClaimRetentionPolicy.enabled }} - persistentVolumeClaimRetentionPolicy: - whenDeleted: {{ .Values.sentinel.persistentVolumeClaimRetentionPolicy.whenDeleted }} - whenScaled: {{ .Values.sentinel.persistentVolumeClaimRetentionPolicy.whenScaled }} - {{- end }} - volumeClaimTemplates: - - apiVersion: v1 - kind: PersistentVolumeClaim - metadata: - name: redis-data - labels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 10 }} - app.kubernetes.io/component: node - {{- if .Values.replica.persistence.annotations }} - annotations: {{- toYaml .Values.replica.persistence.annotations | nindent 10 }} - {{- end }} - spec: - accessModes: - {{- range .Values.replica.persistence.accessModes }} - - {{ . | quote }} - {{- end }} - resources: - requests: - storage: {{ .Values.replica.persistence.size | quote }} - {{- if .Values.replica.persistence.selector }} - selector: {{- include "common.tplvalues.render" ( dict "value" .Values.replica.persistence.selector "context" $) | nindent 10 }} - {{- end }} - {{- include "common.storage.class" (dict "persistence" .Values.replica.persistence "global" .Values.global) | nindent 8 }} - {{- if .Values.sentinel.persistence.enabled }} - - metadata: - name: sentinel-data - {{- $claimLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.sentinel.persistence.labels .Values.commonLabels ) "context" . ) }} - labels: {{- include "common.labels.matchLabels" ( dict "customLabels" $claimLabels "context" $ ) | nindent 10 }} - app.kubernetes.io/component: node - {{- if .Values.sentinel.persistence.annotations }} - annotations: {{- toYaml .Values.sentinel.persistence.annotations | nindent 10 }} - {{- end }} - spec: - accessModes: - {{- range .Values.sentinel.persistence.accessModes }} - - {{ . | quote }} - {{- end }} - resources: - requests: - storage: {{ .Values.sentinel.persistence.size | quote }} - {{- if .Values.sentinel.persistence.selector }} - selector: {{- include "common.tplvalues.render" ( dict "value" .Values.sentinel.persistence.selector "context" $) | nindent 10 }} - {{- end }} - {{- if .Values.sentinel.persistence.dataSource }} - dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.sentinel.persistence.dataSource "context" $) | nindent 10 }} - {{- end }} - {{- include "common.storage.class" (dict "persistence" .Values.sentinel.persistence "global" .Values.global) | nindent 8 }} - {{- end }} - {{- end }} -{{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/serviceaccount.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/serviceaccount.yaml deleted file mode 100644 index ac343a8fb..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/serviceaccount.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.serviceAccount.create .Values.sentinel.enabled }} -apiVersion: v1 -kind: ServiceAccount -automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} -metadata: - name: {{ template "redis.serviceAccountName" . }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if or .Values.commonAnnotations .Values.serviceAccount.annotations }} - {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.serviceAccount.annotations .Values.commonAnnotations ) "context" . ) }} - annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/servicemonitor.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/servicemonitor.yaml deleted file mode 100644 index 757c87001..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/servicemonitor.yaml +++ /dev/null @@ -1,70 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "common.names.fullname" . }} - namespace: {{ default (include "common.names.namespace" .) .Values.metrics.serviceMonitor.namespace | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.metrics.serviceMonitor.additionalLabels }} - {{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.additionalLabels "context" $) | nindent 4 }} - {{- end }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -spec: - endpoints: - - port: http-metrics - {{- if .Values.metrics.serviceMonitor.interval }} - interval: {{ .Values.metrics.serviceMonitor.interval }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.honorLabels }} - honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.relabellings }} - relabelings: {{- toYaml .Values.metrics.serviceMonitor.relabellings | nindent 6 }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.metricRelabelings }} - metricRelabelings: {{- toYaml .Values.metrics.serviceMonitor.metricRelabelings | nindent 6 }} - {{- end }} - {{- range .Values.metrics.serviceMonitor.additionalEndpoints }} - - port: {{ .port }} - {{- if .interval }} - interval: {{ .interval }} - {{- end }} - {{- if .path }} - path: {{ .path }} - {{- end }} - {{- if .params }} - params: - {{- range $key, $value := .params }} - {{ $key }}: - {{- range $value }} - - {{ . | quote }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.metrics.serviceMonitor.podTargetLabels }} - podTargetLabels: {{- toYaml .Values.metrics.serviceMonitor.podTargetLabels | nindent 4 }} - {{- end }} - {{- with .Values.metrics.serviceMonitor.sampleLimit }} - sampleLimit: {{ . }} - {{- end }} - {{- with .Values.metrics.serviceMonitor.targetLimit }} - targetLimit: {{ . }} - {{- end }} - namespaceSelector: - matchNames: - - {{ include "common.names.namespace" . | quote }} - selector: - matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 6 }} - app.kubernetes.io/component: metrics -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/templates/tls-secret.yaml b/thunder_deployment/infra/beta9/charts/redis/templates/tls-secret.yaml deleted file mode 100644 index 8498394fe..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/templates/tls-secret.yaml +++ /dev/null @@ -1,31 +0,0 @@ -{{- /* -Copyright VMware, Inc. -SPDX-License-Identifier: APACHE-2.0 -*/}} - -{{- if (include "redis.createTlsSecret" .) }} -{{- $secretName := printf "%s-crt" (include "common.names.fullname" .) }} -{{- $ca := genCA "redis-ca" 365 }} -{{- $releaseNamespace := (include "common.names.namespace" .) }} -{{- $clusterDomain := .Values.clusterDomain }} -{{- $fullname := include "common.names.fullname" . }} -{{- $serviceName := include "common.names.fullname" . }} -{{- $headlessServiceName := printf "%s-headless" (include "common.names.fullname" .) }} -{{- $masterServiceName := printf "%s-master" (include "common.names.fullname" .) }} -{{- $altNames := list (printf "*.%s.%s.svc.%s" $serviceName $releaseNamespace $clusterDomain) (printf "%s.%s.svc.%s" $masterServiceName $releaseNamespace $clusterDomain) (printf "*.%s.%s.svc.%s" $masterServiceName $releaseNamespace $clusterDomain) (printf "*.%s.%s.svc.%s" $headlessServiceName $releaseNamespace $clusterDomain) (printf "%s.%s.svc.%s" $headlessServiceName $releaseNamespace $clusterDomain) "127.0.0.1" "localhost" $fullname }} -{{- $cert := genSignedCert $fullname nil $altNames 365 $ca }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ $secretName }} - namespace: {{ include "common.names.namespace" . | quote }} - labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -type: kubernetes.io/tls -data: - tls.crt: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "tls.crt" "defaultValue" $cert.Cert "context" $) }} - tls.key: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "tls.key" "defaultValue" $cert.Key "context" $) }} - ca.crt: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "ca.crt" "defaultValue" $ca.Cert "context" $) }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/redis/values.schema.json b/thunder_deployment/infra/beta9/charts/redis/values.schema.json deleted file mode 100644 index e9feba6ad..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/values.schema.json +++ /dev/null @@ -1,163 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema#", - "type": "object", - "properties": { - "architecture": { - "type": "string", - "title": "Redis architecture", - "form": true, - "description": "Allowed values: `standalone` or `replication`", - "enum": ["standalone", "replication"] - }, - "auth": { - "type": "object", - "title": "Authentication configuration", - "form": true, - "properties": { - "enabled": { - "type": "boolean", - "form": true, - "title": "Use password authentication" - }, - "password": { - "type": "string", - "title": "Redis password", - "form": true, - "description": "Defaults to a random 10-character alphanumeric string if not set", - "hidden": { - "value": false, - "path": "auth/enabled" - } - } - } - }, - "master": { - "type": "object", - "title": "Master replicas settings", - "form": true, - "properties": { - "kind": { - "type": "string", - "title": "Workload Kind", - "form": true, - "description": "Allowed values: `Deployment`, `StatefulSet` or `DaemonSet`", - "enum": ["Deployment", "StatefulSet", "DaemonSet"] - }, - "persistence": { - "type": "object", - "title": "Persistence for master replicas", - "form": true, - "properties": { - "enabled": { - "type": "boolean", - "form": true, - "title": "Enable persistence", - "description": "Enable persistence using Persistent Volume Claims" - }, - "size": { - "type": "string", - "title": "Persistent Volume Size", - "form": true, - "render": "slider", - "sliderMin": 1, - "sliderMax": 100, - "sliderUnit": "Gi", - "hidden": { - "value": false, - "path": "master/persistence/enabled" - } - } - } - } - } - }, - "replica": { - "type": "object", - "title": "Redis replicas settings", - "form": true, - "hidden": { - "value": "standalone", - "path": "architecture" - }, - "properties": { - "kind": { - "type": "string", - "title": "Workload Kind", - "form": true, - "description": "Allowed values: `DaemonSet` or `StatefulSet`", - "enum": ["DaemonSet", "StatefulSet"] - }, - "replicaCount": { - "type": "integer", - "form": true, - "title": "Number of Redis replicas" - }, - "persistence": { - "type": "object", - "title": "Persistence for Redis replicas", - "form": true, - "properties": { - "enabled": { - "type": "boolean", - "form": true, - "title": "Enable persistence", - "description": "Enable persistence using Persistent Volume Claims" - }, - "size": { - "type": "string", - "title": "Persistent Volume Size", - "form": true, - "render": "slider", - "sliderMin": 1, - "sliderMax": 100, - "sliderUnit": "Gi", - "hidden": { - "value": false, - "path": "replica/persistence/enabled" - } - } - } - } - } - }, - "volumePermissions": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "form": true, - "title": "Enable Init Containers", - "description": "Use an init container to set required folder permissions on the data volume before mounting it in the final destination" - } - } - }, - "metrics": { - "type": "object", - "form": true, - "title": "Prometheus metrics details", - "properties": { - "enabled": { - "type": "boolean", - "title": "Create Prometheus metrics exporter", - "description": "Create a side-car container to expose Prometheus metrics", - "form": true - }, - "serviceMonitor": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "title": "Create Prometheus Operator ServiceMonitor", - "description": "Create a ServiceMonitor to track metrics using Prometheus Operator", - "form": true, - "hidden": { - "value": false, - "path": "metrics/enabled" - } - } - } - } - } - } - } -} diff --git a/thunder_deployment/infra/beta9/charts/redis/values.yaml b/thunder_deployment/infra/beta9/charts/redis/values.yaml deleted file mode 100644 index 4183f460b..000000000 --- a/thunder_deployment/infra/beta9/charts/redis/values.yaml +++ /dev/null @@ -1,2006 +0,0 @@ -# Copyright VMware, Inc. -# SPDX-License-Identifier: APACHE-2.0 - -## @section Global parameters -## Global Docker image parameters -## Please, note that this will override the image parameters, including dependencies, configured to use the global value -## Current available global Docker image parameters: imageRegistry, imagePullSecrets and storageClass -## - -## @param global.imageRegistry Global Docker image registry -## @param global.imagePullSecrets Global Docker registry secret names as an array -## @param global.storageClass Global StorageClass for Persistent Volume(s) -## @param global.redis.password Global Redis® password (overrides `auth.password`) -## -global: - imageRegistry: "" - ## E.g. - ## imagePullSecrets: - ## - myRegistryKeySecretName - ## - imagePullSecrets: [] - storageClass: "" - redis: - password: "" - -## @section Common parameters -## - -## @param kubeVersion Override Kubernetes version -## -kubeVersion: "" -## @param nameOverride String to partially override common.names.fullname -## -nameOverride: "" -## @param fullnameOverride String to fully override common.names.fullname -## -fullnameOverride: "" -## @param namespaceOverride String to fully override common.names.namespace -## -namespaceOverride: "" -## @param commonLabels Labels to add to all deployed objects -## -commonLabels: {} -## @param commonAnnotations Annotations to add to all deployed objects -## -commonAnnotations: {} -## @param secretAnnotations Annotations to add to secret -## -secretAnnotations: {} -## @param clusterDomain Kubernetes cluster domain name -## -clusterDomain: cluster.local -## @param extraDeploy Array of extra objects to deploy with the release -## -extraDeploy: [] -## @param useHostnames Use hostnames internally when announcing replication. If false, the hostname will be resolved to an IP address -## -useHostnames: true -## @param nameResolutionThreshold Failure threshold for internal hostnames resolution -## -nameResolutionThreshold: 5 -## @param nameResolutionTimeout Timeout seconds between probes for internal hostnames resolution -## -nameResolutionTimeout: 5 - -## Enable diagnostic mode in the deployment -## -diagnosticMode: - ## @param diagnosticMode.enabled Enable diagnostic mode (all probes will be disabled and the command will be overridden) - ## - enabled: false - ## @param diagnosticMode.command Command to override all containers in the deployment - ## - command: - - sleep - ## @param diagnosticMode.args Args to override all containers in the deployment - ## - args: - - infinity - -## @section Redis® Image parameters -## - -## Bitnami Redis® image -## ref: https://hub.docker.com/r/bitnami/redis/tags/ -## @param image.registry [default: REGISTRY_NAME] Redis® image registry -## @param image.repository [default: REPOSITORY_NAME/redis] Redis® image repository -## @skip image.tag Redis® image tag (immutable tags are recommended) -## @param image.digest Redis® image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag -## @param image.pullPolicy Redis® image pull policy -## @param image.pullSecrets Redis® image pull secrets -## @param image.debug Enable image debug mode -## -image: - registry: docker.io - repository: bitnami/redis - tag: 7.2.4-debian-11-r2 - digest: "" - ## Specify a imagePullPolicy - ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' - ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images - ## - pullPolicy: IfNotPresent - ## Optionally specify an array of imagePullSecrets. - ## Secrets must be manually created in the namespace. - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - ## e.g: - ## pullSecrets: - ## - myRegistryKeySecretName - ## - pullSecrets: [] - ## Enable debug mode - ## - debug: false - -## @section Redis® common configuration parameters -## https://github.com/bitnami/containers/tree/main/bitnami/redis#configuration -## - -## @param architecture Redis® architecture. Allowed values: `standalone` or `replication` -## -architecture: replication -## Redis® Authentication parameters -## ref: https://github.com/bitnami/containers/tree/main/bitnami/redis#setting-the-server-password-on-first-run -## -auth: - ## @param auth.enabled Enable password authentication - ## - enabled: true - ## @param auth.sentinel Enable password authentication on sentinels too - ## - sentinel: true - ## @param auth.password Redis® password - ## Defaults to a random 10-character alphanumeric string if not set - ## - password: "" - ## @param auth.existingSecret The name of an existing secret with Redis® credentials - ## NOTE: When it's set, the previous `auth.password` parameter is ignored - ## - existingSecret: "" - ## @param auth.existingSecretPasswordKey Password key to be retrieved from existing secret - ## NOTE: ignored unless `auth.existingSecret` parameter is set - ## - existingSecretPasswordKey: "" - ## @param auth.usePasswordFiles Mount credentials as files instead of using an environment variable - ## - usePasswordFiles: false - -## @param commonConfiguration [string] Common configuration to be added into the ConfigMap -## ref: https://redis.io/topics/config -## -commonConfiguration: |- - # Enable AOF https://redis.io/topics/persistence#append-only-file - appendonly yes - # Disable RDB persistence, AOF persistence already enabled. - save "" -## @param existingConfigmap The name of an existing ConfigMap with your custom configuration for Redis® nodes -## -existingConfigmap: "" - -## @section Redis® master configuration parameters -## - -master: - ## @param master.count Number of Redis® master instances to deploy (experimental, requires additional configuration) - ## - count: 1 - ## @param master.configuration Configuration for Redis® master nodes - ## ref: https://redis.io/topics/config - ## - configuration: "" - ## @param master.disableCommands Array with Redis® commands to disable on master nodes - ## Commands will be completely disabled by renaming each to an empty string. - ## ref: https://redis.io/topics/security#disabling-of-specific-commands - ## - disableCommands: - - FLUSHDB - - FLUSHALL - ## @param master.command Override default container command (useful when using custom images) - ## - command: [] - ## @param master.args Override default container args (useful when using custom images) - ## - args: [] - ## @param master.enableServiceLinks Whether information about services should be injected into pod's environment variable - ## - enableServiceLinks: true - ## @param master.preExecCmds Additional commands to run prior to starting Redis® master - ## - preExecCmds: [] - ## @param master.extraFlags Array with additional command line flags for Redis® master - ## e.g: - ## extraFlags: - ## - "--maxmemory-policy volatile-ttl" - ## - "--repl-backlog-size 1024mb" - ## - extraFlags: [] - ## @param master.extraEnvVars Array with extra environment variables to add to Redis® master nodes - ## e.g: - ## extraEnvVars: - ## - name: FOO - ## value: "bar" - ## - extraEnvVars: [] - ## @param master.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for Redis® master nodes - ## - extraEnvVarsCM: "" - ## @param master.extraEnvVarsSecret Name of existing Secret containing extra env vars for Redis® master nodes - ## - extraEnvVarsSecret: "" - ## @param master.containerPorts.redis Container port to open on Redis® master nodes - ## - containerPorts: - redis: 6379 - ## Configure extra options for Redis® containers' liveness and readiness probes - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes - ## @param master.startupProbe.enabled Enable startupProbe on Redis® master nodes - ## @param master.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe - ## @param master.startupProbe.periodSeconds Period seconds for startupProbe - ## @param master.startupProbe.timeoutSeconds Timeout seconds for startupProbe - ## @param master.startupProbe.failureThreshold Failure threshold for startupProbe - ## @param master.startupProbe.successThreshold Success threshold for startupProbe - ## - startupProbe: - enabled: false - initialDelaySeconds: 20 - periodSeconds: 5 - timeoutSeconds: 5 - successThreshold: 1 - failureThreshold: 5 - ## @param master.livenessProbe.enabled Enable livenessProbe on Redis® master nodes - ## @param master.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe - ## @param master.livenessProbe.periodSeconds Period seconds for livenessProbe - ## @param master.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe - ## @param master.livenessProbe.failureThreshold Failure threshold for livenessProbe - ## @param master.livenessProbe.successThreshold Success threshold for livenessProbe - ## - livenessProbe: - enabled: true - initialDelaySeconds: 20 - periodSeconds: 5 - timeoutSeconds: 5 - successThreshold: 1 - failureThreshold: 5 - ## @param master.readinessProbe.enabled Enable readinessProbe on Redis® master nodes - ## @param master.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe - ## @param master.readinessProbe.periodSeconds Period seconds for readinessProbe - ## @param master.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe - ## @param master.readinessProbe.failureThreshold Failure threshold for readinessProbe - ## @param master.readinessProbe.successThreshold Success threshold for readinessProbe - ## - readinessProbe: - enabled: true - initialDelaySeconds: 20 - periodSeconds: 5 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 5 - ## @param master.customStartupProbe Custom startupProbe that overrides the default one - ## - customStartupProbe: {} - ## @param master.customLivenessProbe Custom livenessProbe that overrides the default one - ## - customLivenessProbe: {} - ## @param master.customReadinessProbe Custom readinessProbe that overrides the default one - ## - customReadinessProbe: {} - ## Redis® master resource requests and limits - ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ - ## @param master.resources.limits The resources limits for the Redis® master containers - ## @param master.resources.requests The requested resources for the Redis® master containers - ## - resources: - limits: {} - requests: {} - ## Configure Pods Security Context - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod - ## @param master.podSecurityContext.enabled Enabled Redis® master pods' Security Context - ## @param master.podSecurityContext.fsGroupChangePolicy Set filesystem group change policy - ## @param master.podSecurityContext.sysctls Set kernel settings using the sysctl interface - ## @param master.podSecurityContext.supplementalGroups Set filesystem extra groups - ## @param master.podSecurityContext.fsGroup Set Redis® master pod's Security Context fsGroup - ## - podSecurityContext: - enabled: true - fsGroupChangePolicy: Always - sysctls: [] - supplementalGroups: [] - fsGroup: 1001 - ## Configure Container Security Context - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod - ## @param master.containerSecurityContext.enabled Enabled Redis® master containers' Security Context - ## @param master.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container - ## @param master.containerSecurityContext.runAsUser Set Redis® master containers' Security Context runAsUser - ## @param master.containerSecurityContext.runAsGroup Set Redis® master containers' Security Context runAsGroup - ## @param master.containerSecurityContext.runAsNonRoot Set Redis® master containers' Security Context runAsNonRoot - ## @param master.containerSecurityContext.allowPrivilegeEscalation Is it possible to escalate Redis® pod(s) privileges - ## @param master.containerSecurityContext.seccompProfile.type Set Redis® master containers' Security Context seccompProfile - ## @param master.containerSecurityContext.capabilities.drop Set Redis® master containers' Security Context capabilities to drop - ## - containerSecurityContext: - enabled: true - seLinuxOptions: null - runAsUser: 1001 - runAsGroup: 0 - runAsNonRoot: true - allowPrivilegeEscalation: false - seccompProfile: - type: RuntimeDefault - capabilities: - drop: - - ALL - ## @param master.kind Use either Deployment, StatefulSet (default) or DaemonSet - ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/ - ## - kind: StatefulSet - ## @param master.schedulerName Alternate scheduler for Redis® master pods - ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ - ## - schedulerName: "" - ## @param master.updateStrategy.type Redis® master statefulset strategy type - ## @skip master.updateStrategy.rollingUpdate - ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies - ## - updateStrategy: - ## StrategyType - ## Can be set to RollingUpdate, OnDelete (statefulset), Recreate (deployment) - ## - type: RollingUpdate - ## @param master.minReadySeconds How many seconds a pod needs to be ready before killing the next, during update - ## - minReadySeconds: 0 - ## @param master.priorityClassName Redis® master pods' priorityClassName - ## - priorityClassName: "" - ## @param master.automountServiceAccountToken Mount Service Account token in pod - ## - automountServiceAccountToken: false - ## @param master.hostAliases Redis® master pods host aliases - ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ - ## - hostAliases: [] - ## @param master.podLabels Extra labels for Redis® master pods - ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ - ## - podLabels: {} - ## @param master.podAnnotations Annotations for Redis® master pods - ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ - ## - podAnnotations: {} - ## @param master.shareProcessNamespace Share a single process namespace between all of the containers in Redis® master pods - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/ - ## - shareProcessNamespace: false - ## @param master.podAffinityPreset Pod affinity preset. Ignored if `master.affinity` is set. Allowed values: `soft` or `hard` - ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity - ## - podAffinityPreset: "" - ## @param master.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `master.affinity` is set. Allowed values: `soft` or `hard` - ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity - ## - podAntiAffinityPreset: soft - ## Node master.affinity preset - ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity - ## - nodeAffinityPreset: - ## @param master.nodeAffinityPreset.type Node affinity preset type. Ignored if `master.affinity` is set. Allowed values: `soft` or `hard` - ## - type: "" - ## @param master.nodeAffinityPreset.key Node label key to match. Ignored if `master.affinity` is set - ## - key: "" - ## @param master.nodeAffinityPreset.values Node label values to match. Ignored if `master.affinity` is set - ## E.g. - ## values: - ## - e2e-az1 - ## - e2e-az2 - ## - values: [] - ## @param master.affinity Affinity for Redis® master pods assignment - ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity - ## NOTE: `master.podAffinityPreset`, `master.podAntiAffinityPreset`, and `master.nodeAffinityPreset` will be ignored when it's set - ## - affinity: {} - ## @param master.nodeSelector Node labels for Redis® master pods assignment - ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ - ## - nodeSelector: {} - ## @param master.tolerations Tolerations for Redis® master pods assignment - ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - ## - tolerations: [] - ## @param master.topologySpreadConstraints Spread Constraints for Redis® master pod assignment - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ - ## E.g. - ## topologySpreadConstraints: - ## - maxSkew: 1 - ## topologyKey: node - ## whenUnsatisfiable: DoNotSchedule - ## - topologySpreadConstraints: [] - ## @param master.dnsPolicy DNS Policy for Redis® master pod - ## ref: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/ - ## E.g. - ## dnsPolicy: ClusterFirst - ## - dnsPolicy: "" - ## @param master.dnsConfig DNS Configuration for Redis® master pod - ## ref: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/ - ## E.g. - ## dnsConfig: - ## options: - ## - name: ndots - ## value: "4" - ## - name: single-request-reopen - ## - dnsConfig: {} - ## @param master.lifecycleHooks for the Redis® master container(s) to automate configuration before or after startup - ## - lifecycleHooks: {} - ## @param master.extraVolumes Optionally specify extra list of additional volumes for the Redis® master pod(s) - ## - extraVolumes: [] - ## @param master.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the Redis® master container(s) - ## - extraVolumeMounts: [] - ## @param master.sidecars Add additional sidecar containers to the Redis® master pod(s) - ## e.g: - ## sidecars: - ## - name: your-image-name - ## image: your-image - ## imagePullPolicy: Always - ## ports: - ## - name: portname - ## containerPort: 1234 - ## - sidecars: [] - ## @param master.initContainers Add additional init containers to the Redis® master pod(s) - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ - ## e.g: - ## initContainers: - ## - name: your-image-name - ## image: your-image - ## imagePullPolicy: Always - ## command: ['sh', '-c', 'echo "hello world"'] - ## - initContainers: [] - ## Persistence parameters - ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ - ## - persistence: - ## @param master.persistence.enabled Enable persistence on Redis® master nodes using Persistent Volume Claims - ## - enabled: true - ## @param master.persistence.medium Provide a medium for `emptyDir` volumes. - ## - medium: "" - ## @param master.persistence.sizeLimit Set this to enable a size limit for `emptyDir` volumes. - ## - sizeLimit: "" - ## @param master.persistence.path The path the volume will be mounted at on Redis® master containers - ## NOTE: Useful when using different Redis® images - ## - path: /data - ## @param master.persistence.subPath The subdirectory of the volume to mount on Redis® master containers - ## NOTE: Useful in dev environments - ## - subPath: "" - ## @param master.persistence.subPathExpr Used to construct the subPath subdirectory of the volume to mount on Redis® master containers - ## - subPathExpr: "" - ## @param master.persistence.storageClass Persistent Volume storage class - ## If defined, storageClassName: - ## If set to "-", storageClassName: "", which disables dynamic provisioning - ## If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner - ## - storageClass: "" - ## @param master.persistence.accessModes Persistent Volume access modes - ## - accessModes: - - ReadWriteOnce - ## @param master.persistence.size Persistent Volume size - ## - size: 8Gi - ## @param master.persistence.annotations Additional custom annotations for the PVC - ## - annotations: {} - ## @param master.persistence.labels Additional custom labels for the PVC - ## - labels: {} - ## @param master.persistence.selector Additional labels to match for the PVC - ## e.g: - ## selector: - ## matchLabels: - ## app: my-app - ## - selector: {} - ## @param master.persistence.dataSource Custom PVC data source - ## - dataSource: {} - ## @param master.persistence.existingClaim Use a existing PVC which must be created manually before bound - ## NOTE: requires master.persistence.enabled: true - ## - existingClaim: "" - ## persistentVolumeClaimRetentionPolicy - ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention - ## @param master.persistentVolumeClaimRetentionPolicy.enabled Controls if and how PVCs are deleted during the lifecycle of a StatefulSet - ## @param master.persistentVolumeClaimRetentionPolicy.whenScaled Volume retention behavior when the replica count of the StatefulSet is reduced - ## @param master.persistentVolumeClaimRetentionPolicy.whenDeleted Volume retention behavior that applies when the StatefulSet is deleted - ## - persistentVolumeClaimRetentionPolicy: - enabled: false - whenScaled: Retain - whenDeleted: Retain - ## Redis® master service parameters - ## - service: - ## @param master.service.type Redis® master service type - ## - type: ClusterIP - ## @param master.service.ports.redis Redis® master service port - ## - ports: - redis: 6379 - ## @param master.service.nodePorts.redis Node port for Redis® master - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport - ## NOTE: choose port between <30000-32767> - ## - nodePorts: - redis: "" - ## @param master.service.externalTrafficPolicy Redis® master service external traffic policy - ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip - ## - externalTrafficPolicy: Cluster - ## @param master.service.extraPorts Extra ports to expose (normally used with the `sidecar` value) - ## - extraPorts: [] - ## @param master.service.internalTrafficPolicy Redis® master service internal traffic policy (requires Kubernetes v1.22 or greater to be usable) - ## ref: https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/ - ## - internalTrafficPolicy: Cluster - ## @param master.service.clusterIP Redis® master service Cluster IP - ## - clusterIP: "" - ## @param master.service.loadBalancerIP Redis® master service Load Balancer IP - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer - ## - loadBalancerIP: "" - ## @param master.service.loadBalancerClass master service Load Balancer class if service type is `LoadBalancer` (optional, cloud specific) - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer - ## - loadBalancerClass: "" - ## @param master.service.loadBalancerSourceRanges Redis® master service Load Balancer sources - ## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service - ## e.g. - ## loadBalancerSourceRanges: - ## - 10.10.10.0/24 - ## - loadBalancerSourceRanges: [] - ## @param master.service.externalIPs Redis® master service External IPs - ## https://kubernetes.io/docs/concepts/services-networking/service/#external-ips - ## e.g. - ## externalIPs: - ## - 10.10.10.1 - ## - 201.22.30.1 - ## - externalIPs: [] - ## @param master.service.annotations Additional custom annotations for Redis® master service - ## - annotations: {} - ## @param master.service.sessionAffinity Session Affinity for Kubernetes service, can be "None" or "ClientIP" - ## If "ClientIP", consecutive client requests will be directed to the same Pod - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies - ## - sessionAffinity: None - ## @param master.service.sessionAffinityConfig Additional settings for the sessionAffinity - ## sessionAffinityConfig: - ## clientIP: - ## timeoutSeconds: 300 - ## - sessionAffinityConfig: {} - ## @param master.terminationGracePeriodSeconds Integer setting the termination grace period for the redis-master pods - ## - terminationGracePeriodSeconds: 30 - ## ServiceAccount configuration - ## - serviceAccount: - ## @param master.serviceAccount.create Specifies whether a ServiceAccount should be created - ## - create: true - ## @param master.serviceAccount.name The name of the ServiceAccount to use. - ## If not set and create is true, a name is generated using the common.names.fullname template - ## - name: "" - ## @param master.serviceAccount.automountServiceAccountToken Whether to auto mount the service account token - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server - ## - automountServiceAccountToken: false - ## @param master.serviceAccount.annotations Additional custom annotations for the ServiceAccount - ## - annotations: {} - -## @section Redis® replicas configuration parameters -## - -replica: - ## @param replica.kind Use either DaemonSet or StatefulSet (default) - ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/ - ## - kind: StatefulSet - ## @param replica.replicaCount Number of Redis® replicas to deploy - ## - replicaCount: 3 - ## @param replica.configuration Configuration for Redis® replicas nodes - ## ref: https://redis.io/topics/config - ## - configuration: "" - ## @param replica.disableCommands Array with Redis® commands to disable on replicas nodes - ## Commands will be completely disabled by renaming each to an empty string. - ## ref: https://redis.io/topics/security#disabling-of-specific-commands - ## - disableCommands: - - FLUSHDB - - FLUSHALL - ## @param replica.command Override default container command (useful when using custom images) - ## - command: [] - ## @param replica.args Override default container args (useful when using custom images) - ## - args: [] - ## @param replica.enableServiceLinks Whether information about services should be injected into pod's environment variable - ## - enableServiceLinks: true - ## @param replica.preExecCmds Additional commands to run prior to starting Redis® replicas - ## - preExecCmds: [] - ## @param replica.extraFlags Array with additional command line flags for Redis® replicas - ## e.g: - ## extraFlags: - ## - "--maxmemory-policy volatile-ttl" - ## - "--repl-backlog-size 1024mb" - ## - extraFlags: [] - ## @param replica.extraEnvVars Array with extra environment variables to add to Redis® replicas nodes - ## e.g: - ## extraEnvVars: - ## - name: FOO - ## value: "bar" - ## - extraEnvVars: [] - ## @param replica.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for Redis® replicas nodes - ## - extraEnvVarsCM: "" - ## @param replica.extraEnvVarsSecret Name of existing Secret containing extra env vars for Redis® replicas nodes - ## - extraEnvVarsSecret: "" - ## @param replica.externalMaster.enabled Use external master for bootstrapping - ## @param replica.externalMaster.host External master host to bootstrap from - ## @param replica.externalMaster.port Port for Redis service external master host - ## - externalMaster: - enabled: false - host: "" - port: 6379 - ## @param replica.containerPorts.redis Container port to open on Redis® replicas nodes - ## - containerPorts: - redis: 6379 - ## Configure extra options for Redis® containers' liveness and readiness probes - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes - ## @param replica.startupProbe.enabled Enable startupProbe on Redis® replicas nodes - ## @param replica.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe - ## @param replica.startupProbe.periodSeconds Period seconds for startupProbe - ## @param replica.startupProbe.timeoutSeconds Timeout seconds for startupProbe - ## @param replica.startupProbe.failureThreshold Failure threshold for startupProbe - ## @param replica.startupProbe.successThreshold Success threshold for startupProbe - ## - startupProbe: - enabled: true - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 5 - successThreshold: 1 - failureThreshold: 22 - ## @param replica.livenessProbe.enabled Enable livenessProbe on Redis® replicas nodes - ## @param replica.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe - ## @param replica.livenessProbe.periodSeconds Period seconds for livenessProbe - ## @param replica.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe - ## @param replica.livenessProbe.failureThreshold Failure threshold for livenessProbe - ## @param replica.livenessProbe.successThreshold Success threshold for livenessProbe - ## - livenessProbe: - enabled: true - initialDelaySeconds: 20 - periodSeconds: 5 - timeoutSeconds: 5 - successThreshold: 1 - failureThreshold: 5 - ## @param replica.readinessProbe.enabled Enable readinessProbe on Redis® replicas nodes - ## @param replica.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe - ## @param replica.readinessProbe.periodSeconds Period seconds for readinessProbe - ## @param replica.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe - ## @param replica.readinessProbe.failureThreshold Failure threshold for readinessProbe - ## @param replica.readinessProbe.successThreshold Success threshold for readinessProbe - ## - readinessProbe: - enabled: true - initialDelaySeconds: 20 - periodSeconds: 5 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 5 - ## @param replica.customStartupProbe Custom startupProbe that overrides the default one - ## - customStartupProbe: {} - ## @param replica.customLivenessProbe Custom livenessProbe that overrides the default one - ## - customLivenessProbe: {} - ## @param replica.customReadinessProbe Custom readinessProbe that overrides the default one - ## - customReadinessProbe: {} - ## Redis® replicas resource requests and limits - ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ - ## @param replica.resources.limits The resources limits for the Redis® replicas containers - ## @param replica.resources.requests The requested resources for the Redis® replicas containers - ## - resources: - # We usually recommend not to specify default resources and to leave this as a conscious - # choice for the user. This also increases chances charts run on environments with little - # resources, such as Minikube. If you do want to specify resources, uncomment the following - # lines, adjust them as necessary, and remove the curly braces after 'resources:'. - limits: {} - # cpu: 250m - # memory: 256Mi - requests: {} - # cpu: 250m - # memory: 256Mi - ## Configure Pods Security Context - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod - ## @param replica.podSecurityContext.enabled Enabled Redis® replicas pods' Security Context - ## @param replica.podSecurityContext.fsGroupChangePolicy Set filesystem group change policy - ## @param replica.podSecurityContext.sysctls Set kernel settings using the sysctl interface - ## @param replica.podSecurityContext.supplementalGroups Set filesystem extra groups - ## @param replica.podSecurityContext.fsGroup Set Redis® replicas pod's Security Context fsGroup - ## - podSecurityContext: - enabled: true - fsGroupChangePolicy: Always - sysctls: [] - supplementalGroups: [] - fsGroup: 1001 - ## Configure Container Security Context - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod - ## @param replica.containerSecurityContext.enabled Enabled Redis® replicas containers' Security Context - ## @param replica.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container - ## @param replica.containerSecurityContext.runAsUser Set Redis® replicas containers' Security Context runAsUser - ## @param replica.containerSecurityContext.runAsGroup Set Redis® replicas containers' Security Context runAsGroup - ## @param replica.containerSecurityContext.runAsNonRoot Set Redis® replicas containers' Security Context runAsNonRoot - ## @param replica.containerSecurityContext.allowPrivilegeEscalation Set Redis® replicas pod's Security Context allowPrivilegeEscalation - ## @param replica.containerSecurityContext.seccompProfile.type Set Redis® replicas containers' Security Context seccompProfile - ## @param replica.containerSecurityContext.capabilities.drop Set Redis® replicas containers' Security Context capabilities to drop - ## - containerSecurityContext: - enabled: true - seLinuxOptions: null - runAsUser: 1001 - runAsGroup: 0 - runAsNonRoot: true - allowPrivilegeEscalation: false - seccompProfile: - type: RuntimeDefault - capabilities: - drop: - - ALL - ## @param replica.schedulerName Alternate scheduler for Redis® replicas pods - ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ - ## - schedulerName: "" - ## @param replica.updateStrategy.type Redis® replicas statefulset strategy type - ## @skip replica.updateStrategy.rollingUpdate - ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies - ## - updateStrategy: - ## StrategyType - ## Can be set to RollingUpdate, OnDelete (statefulset), Recreate (deployment) - ## - type: RollingUpdate - ## @param replica.minReadySeconds How many seconds a pod needs to be ready before killing the next, during update - ## - minReadySeconds: 0 - ## @param replica.priorityClassName Redis® replicas pods' priorityClassName - ## - priorityClassName: "" - ## @param replica.podManagementPolicy podManagementPolicy to manage scaling operation of %%MAIN_CONTAINER_NAME%% pods - ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-management-policies - ## - podManagementPolicy: "" - ## @param replica.automountServiceAccountToken Mount Service Account token in pod - ## - automountServiceAccountToken: false - ## @param replica.hostAliases Redis® replicas pods host aliases - ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ - ## - hostAliases: [] - ## @param replica.podLabels Extra labels for Redis® replicas pods - ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ - ## - podLabels: {} - ## @param replica.podAnnotations Annotations for Redis® replicas pods - ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ - ## - podAnnotations: {} - ## @param replica.shareProcessNamespace Share a single process namespace between all of the containers in Redis® replicas pods - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/ - ## - shareProcessNamespace: false - ## @param replica.podAffinityPreset Pod affinity preset. Ignored if `replica.affinity` is set. Allowed values: `soft` or `hard` - ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity - ## - podAffinityPreset: "" - ## @param replica.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `replica.affinity` is set. Allowed values: `soft` or `hard` - ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity - ## - podAntiAffinityPreset: soft - ## Node affinity preset - ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity - ## - nodeAffinityPreset: - ## @param replica.nodeAffinityPreset.type Node affinity preset type. Ignored if `replica.affinity` is set. Allowed values: `soft` or `hard` - ## - type: "" - ## @param replica.nodeAffinityPreset.key Node label key to match. Ignored if `replica.affinity` is set - ## - key: "" - ## @param replica.nodeAffinityPreset.values Node label values to match. Ignored if `replica.affinity` is set - ## E.g. - ## values: - ## - e2e-az1 - ## - e2e-az2 - ## - values: [] - ## @param replica.affinity Affinity for Redis® replicas pods assignment - ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity - ## NOTE: `replica.podAffinityPreset`, `replica.podAntiAffinityPreset`, and `replica.nodeAffinityPreset` will be ignored when it's set - ## - affinity: {} - ## @param replica.nodeSelector Node labels for Redis® replicas pods assignment - ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ - ## - nodeSelector: {} - ## @param replica.tolerations Tolerations for Redis® replicas pods assignment - ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - ## - tolerations: [] - ## @param replica.topologySpreadConstraints Spread Constraints for Redis® replicas pod assignment - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ - ## E.g. - ## topologySpreadConstraints: - ## - maxSkew: 1 - ## topologyKey: node - ## whenUnsatisfiable: DoNotSchedule - ## - topologySpreadConstraints: [] - ## @param replica.dnsPolicy DNS Policy for Redis® replica pods - ## ref: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/ - ## E.g. - ## dnsPolicy: ClusterFirst - ## - dnsPolicy: "" - ## @param replica.dnsConfig DNS Configuration for Redis® replica pods - ## ref: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/ - ## E.g. - ## dnsConfig: - ## options: - ## - name: ndots - ## value: "4" - ## - name: single-request-reopen - ## - dnsConfig: {} - ## @param replica.lifecycleHooks for the Redis® replica container(s) to automate configuration before or after startup - ## - lifecycleHooks: {} - ## @param replica.extraVolumes Optionally specify extra list of additional volumes for the Redis® replicas pod(s) - ## - extraVolumes: [] - ## @param replica.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the Redis® replicas container(s) - ## - extraVolumeMounts: [] - ## @param replica.sidecars Add additional sidecar containers to the Redis® replicas pod(s) - ## e.g: - ## sidecars: - ## - name: your-image-name - ## image: your-image - ## imagePullPolicy: Always - ## ports: - ## - name: portname - ## containerPort: 1234 - ## - sidecars: [] - ## @param replica.initContainers Add additional init containers to the Redis® replicas pod(s) - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ - ## e.g: - ## initContainers: - ## - name: your-image-name - ## image: your-image - ## imagePullPolicy: Always - ## command: ['sh', '-c', 'echo "hello world"'] - ## - initContainers: [] - ## Persistence Parameters - ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ - ## - persistence: - ## @param replica.persistence.enabled Enable persistence on Redis® replicas nodes using Persistent Volume Claims - ## - enabled: true - ## @param replica.persistence.medium Provide a medium for `emptyDir` volumes. - ## - medium: "" - ## @param replica.persistence.sizeLimit Set this to enable a size limit for `emptyDir` volumes. - ## - sizeLimit: "" - ## @param replica.persistence.path The path the volume will be mounted at on Redis® replicas containers - ## NOTE: Useful when using different Redis® images - ## - path: /data - ## @param replica.persistence.subPath The subdirectory of the volume to mount on Redis® replicas containers - ## NOTE: Useful in dev environments - ## - subPath: "" - ## @param replica.persistence.subPathExpr Used to construct the subPath subdirectory of the volume to mount on Redis® replicas containers - ## - subPathExpr: "" - ## @param replica.persistence.storageClass Persistent Volume storage class - ## If defined, storageClassName: - ## If set to "-", storageClassName: "", which disables dynamic provisioning - ## If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner - ## - storageClass: "" - ## @param replica.persistence.accessModes Persistent Volume access modes - ## - accessModes: - - ReadWriteOnce - ## @param replica.persistence.size Persistent Volume size - ## - size: 8Gi - ## @param replica.persistence.annotations Additional custom annotations for the PVC - ## - annotations: {} - ## @param replica.persistence.labels Additional custom labels for the PVC - ## - labels: {} - ## @param replica.persistence.selector Additional labels to match for the PVC - ## e.g: - ## selector: - ## matchLabels: - ## app: my-app - ## - selector: {} - ## @param replica.persistence.dataSource Custom PVC data source - ## - dataSource: {} - ## @param replica.persistence.existingClaim Use a existing PVC which must be created manually before bound - ## NOTE: requires replica.persistence.enabled: true - ## - existingClaim: "" - ## persistentVolumeClaimRetentionPolicy - ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention - ## @param replica.persistentVolumeClaimRetentionPolicy.enabled Controls if and how PVCs are deleted during the lifecycle of a StatefulSet - ## @param replica.persistentVolumeClaimRetentionPolicy.whenScaled Volume retention behavior when the replica count of the StatefulSet is reduced - ## @param replica.persistentVolumeClaimRetentionPolicy.whenDeleted Volume retention behavior that applies when the StatefulSet is deleted - ## - persistentVolumeClaimRetentionPolicy: - enabled: false - whenScaled: Retain - whenDeleted: Retain - ## Redis® replicas service parameters - ## - service: - ## @param replica.service.type Redis® replicas service type - ## - type: ClusterIP - ## @param replica.service.ports.redis Redis® replicas service port - ## - ports: - redis: 6379 - ## @param replica.service.nodePorts.redis Node port for Redis® replicas - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport - ## NOTE: choose port between <30000-32767> - ## - nodePorts: - redis: "" - ## @param replica.service.externalTrafficPolicy Redis® replicas service external traffic policy - ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip - ## - externalTrafficPolicy: Cluster - ## @param replica.service.internalTrafficPolicy Redis® replicas service internal traffic policy (requires Kubernetes v1.22 or greater to be usable) - ## ref: https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/ - ## - internalTrafficPolicy: Cluster - ## @param replica.service.extraPorts Extra ports to expose (normally used with the `sidecar` value) - ## - extraPorts: [] - ## @param replica.service.clusterIP Redis® replicas service Cluster IP - ## - clusterIP: "" - ## @param replica.service.loadBalancerIP Redis® replicas service Load Balancer IP - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer - ## - loadBalancerIP: "" - ## @param replica.service.loadBalancerClass replicas service Load Balancer class if service type is `LoadBalancer` (optional, cloud specific) - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer - ## - loadBalancerClass: "" - ## @param replica.service.loadBalancerSourceRanges Redis® replicas service Load Balancer sources - ## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service - ## e.g. - ## loadBalancerSourceRanges: - ## - 10.10.10.0/24 - ## - loadBalancerSourceRanges: [] - ## @param replica.service.annotations Additional custom annotations for Redis® replicas service - ## - annotations: {} - ## @param replica.service.sessionAffinity Session Affinity for Kubernetes service, can be "None" or "ClientIP" - ## If "ClientIP", consecutive client requests will be directed to the same Pod - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies - ## - sessionAffinity: None - ## @param replica.service.sessionAffinityConfig Additional settings for the sessionAffinity - ## sessionAffinityConfig: - ## clientIP: - ## timeoutSeconds: 300 - ## - sessionAffinityConfig: {} - ## @param replica.terminationGracePeriodSeconds Integer setting the termination grace period for the redis-replicas pods - ## - terminationGracePeriodSeconds: 30 - ## Autoscaling configuration - ## - autoscaling: - ## @param replica.autoscaling.enabled Enable replica autoscaling settings - ## - enabled: false - ## @param replica.autoscaling.minReplicas Minimum replicas for the pod autoscaling - ## - minReplicas: 1 - ## @param replica.autoscaling.maxReplicas Maximum replicas for the pod autoscaling - ## - maxReplicas: 11 - ## @param replica.autoscaling.targetCPU Percentage of CPU to consider when autoscaling - ## - targetCPU: "" - ## @param replica.autoscaling.targetMemory Percentage of Memory to consider when autoscaling - ## - targetMemory: "" - ## ServiceAccount configuration - ## - serviceAccount: - ## @param replica.serviceAccount.create Specifies whether a ServiceAccount should be created - ## - create: true - ## @param replica.serviceAccount.name The name of the ServiceAccount to use. - ## If not set and create is true, a name is generated using the common.names.fullname template - ## - name: "" - ## @param replica.serviceAccount.automountServiceAccountToken Whether to auto mount the service account token - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server - ## - automountServiceAccountToken: false - ## @param replica.serviceAccount.annotations Additional custom annotations for the ServiceAccount - ## - annotations: {} -## @section Redis® Sentinel configuration parameters -## - -sentinel: - ## @param sentinel.enabled Use Redis® Sentinel on Redis® pods. - ## IMPORTANT: this will disable the master and replicas services and - ## create a single Redis® service exposing both the Redis and Sentinel ports - ## - enabled: false - ## Bitnami Redis® Sentinel image version - ## ref: https://hub.docker.com/r/bitnami/redis-sentinel/tags/ - ## @param sentinel.image.registry [default: REGISTRY_NAME] Redis® Sentinel image registry - ## @param sentinel.image.repository [default: REPOSITORY_NAME/redis-sentinel] Redis® Sentinel image repository - ## @skip sentinel.image.tag Redis® Sentinel image tag (immutable tags are recommended) - ## @param sentinel.image.digest Redis® Sentinel image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag - ## @param sentinel.image.pullPolicy Redis® Sentinel image pull policy - ## @param sentinel.image.pullSecrets Redis® Sentinel image pull secrets - ## @param sentinel.image.debug Enable image debug mode - ## - image: - registry: docker.io - repository: bitnami/redis-sentinel - tag: 7.2.4-debian-11-r3 - digest: "" - ## Specify a imagePullPolicy - ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' - ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images - ## - pullPolicy: IfNotPresent - ## Optionally specify an array of imagePullSecrets. - ## Secrets must be manually created in the namespace. - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - ## e.g: - ## pullSecrets: - ## - myRegistryKeySecretName - ## - pullSecrets: [] - ## Enable debug mode - ## - debug: false - ## @param sentinel.annotations Additional custom annotations for Redis® Sentinel resource - ## - annotations: {} - ## @param sentinel.masterSet Master set name - ## - masterSet: mymaster - ## @param sentinel.quorum Sentinel Quorum - ## - quorum: 2 - ## @param sentinel.getMasterTimeout Amount of time to allow before get_sentinel_master_info() times out. - ## - getMasterTimeout: 90 - ## @param sentinel.automateClusterRecovery Automate cluster recovery in cases where the last replica is not considered a good replica and Sentinel won't automatically failover to it. - ## This also prevents any new replica from starting until the last remaining replica is elected as master to guarantee that it is the one to be elected by Sentinel, and not a newly started replica with no data. - ## NOTE: This feature requires a "downAfterMilliseconds" value less or equal to 2000. - ## - automateClusterRecovery: false - ## @param sentinel.redisShutdownWaitFailover Whether the Redis® master container waits for the failover at shutdown (in addition to the Redis® Sentinel container). - ## - redisShutdownWaitFailover: true - ## Sentinel timing restrictions - ## @param sentinel.downAfterMilliseconds Timeout for detecting a Redis® node is down - ## @param sentinel.failoverTimeout Timeout for performing a election failover - ## - downAfterMilliseconds: 60000 - failoverTimeout: 180000 - ## @param sentinel.parallelSyncs Number of replicas that can be reconfigured in parallel to use the new master after a failover - ## - parallelSyncs: 1 - ## @param sentinel.configuration Configuration for Redis® Sentinel nodes - ## ref: https://redis.io/topics/sentinel - ## - configuration: "" - ## @param sentinel.command Override default container command (useful when using custom images) - ## - command: [] - ## @param sentinel.args Override default container args (useful when using custom images) - ## - args: [] - ## @param sentinel.enableServiceLinks Whether information about services should be injected into pod's environment variable - ## - enableServiceLinks: true - ## @param sentinel.preExecCmds Additional commands to run prior to starting Redis® Sentinel - ## - preExecCmds: [] - ## @param sentinel.extraEnvVars Array with extra environment variables to add to Redis® Sentinel nodes - ## e.g: - ## extraEnvVars: - ## - name: FOO - ## value: "bar" - ## - extraEnvVars: [] - ## @param sentinel.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for Redis® Sentinel nodes - ## - extraEnvVarsCM: "" - ## @param sentinel.extraEnvVarsSecret Name of existing Secret containing extra env vars for Redis® Sentinel nodes - ## - extraEnvVarsSecret: "" - ## @param sentinel.externalMaster.enabled Use external master for bootstrapping - ## @param sentinel.externalMaster.host External master host to bootstrap from - ## @param sentinel.externalMaster.port Port for Redis service external master host - ## - externalMaster: - enabled: false - host: "" - port: 6379 - ## @param sentinel.containerPorts.sentinel Container port to open on Redis® Sentinel nodes - ## - containerPorts: - sentinel: 26379 - ## Configure extra options for Redis® containers' liveness and readiness probes - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes - ## @param sentinel.startupProbe.enabled Enable startupProbe on Redis® Sentinel nodes - ## @param sentinel.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe - ## @param sentinel.startupProbe.periodSeconds Period seconds for startupProbe - ## @param sentinel.startupProbe.timeoutSeconds Timeout seconds for startupProbe - ## @param sentinel.startupProbe.failureThreshold Failure threshold for startupProbe - ## @param sentinel.startupProbe.successThreshold Success threshold for startupProbe - ## - startupProbe: - enabled: true - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 5 - successThreshold: 1 - failureThreshold: 22 - ## @param sentinel.livenessProbe.enabled Enable livenessProbe on Redis® Sentinel nodes - ## @param sentinel.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe - ## @param sentinel.livenessProbe.periodSeconds Period seconds for livenessProbe - ## @param sentinel.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe - ## @param sentinel.livenessProbe.failureThreshold Failure threshold for livenessProbe - ## @param sentinel.livenessProbe.successThreshold Success threshold for livenessProbe - ## - livenessProbe: - enabled: true - initialDelaySeconds: 20 - periodSeconds: 10 - timeoutSeconds: 5 - successThreshold: 1 - failureThreshold: 6 - ## @param sentinel.readinessProbe.enabled Enable readinessProbe on Redis® Sentinel nodes - ## @param sentinel.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe - ## @param sentinel.readinessProbe.periodSeconds Period seconds for readinessProbe - ## @param sentinel.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe - ## @param sentinel.readinessProbe.failureThreshold Failure threshold for readinessProbe - ## @param sentinel.readinessProbe.successThreshold Success threshold for readinessProbe - ## - readinessProbe: - enabled: true - initialDelaySeconds: 20 - periodSeconds: 5 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 6 - ## @param sentinel.customStartupProbe Custom startupProbe that overrides the default one - ## - customStartupProbe: {} - ## @param sentinel.customLivenessProbe Custom livenessProbe that overrides the default one - ## - customLivenessProbe: {} - ## @param sentinel.customReadinessProbe Custom readinessProbe that overrides the default one - ## - customReadinessProbe: {} - ## Persistence parameters - ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ - ## - persistence: - ## @param sentinel.persistence.enabled Enable persistence on Redis® sentinel nodes using Persistent Volume Claims (Experimental) - ## - enabled: false - ## @param sentinel.persistence.storageClass Persistent Volume storage class - ## If defined, storageClassName: - ## If set to "-", storageClassName: "", which disables dynamic provisioning - ## If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner - ## - storageClass: "" - ## @param sentinel.persistence.accessModes Persistent Volume access modes - ## - accessModes: - - ReadWriteOnce - ## @param sentinel.persistence.size Persistent Volume size - ## - size: 100Mi - ## @param sentinel.persistence.annotations Additional custom annotations for the PVC - ## - annotations: {} - ## @param sentinel.persistence.labels Additional custom labels for the PVC - ## - labels: {} - ## @param sentinel.persistence.selector Additional labels to match for the PVC - ## e.g: - ## selector: - ## matchLabels: - ## app: my-app - ## - selector: {} - ## @param sentinel.persistence.dataSource Custom PVC data source - ## - dataSource: {} - ## @param sentinel.persistence.medium Provide a medium for `emptyDir` volumes. - ## - medium: "" - ## @param sentinel.persistence.sizeLimit Set this to enable a size limit for `emptyDir` volumes. - ## - sizeLimit: "" - ## persistentVolumeClaimRetentionPolicy - ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention - ## @param sentinel.persistentVolumeClaimRetentionPolicy.enabled Controls if and how PVCs are deleted during the lifecycle of a StatefulSet - ## @param sentinel.persistentVolumeClaimRetentionPolicy.whenScaled Volume retention behavior when the replica count of the StatefulSet is reduced - ## @param sentinel.persistentVolumeClaimRetentionPolicy.whenDeleted Volume retention behavior that applies when the StatefulSet is deleted - ## - persistentVolumeClaimRetentionPolicy: - enabled: false - whenScaled: Retain - whenDeleted: Retain - ## Redis® Sentinel resource requests and limits - ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ - ## @param sentinel.resources.limits The resources limits for the Redis® Sentinel containers - ## @param sentinel.resources.requests The requested resources for the Redis® Sentinel containers - ## - resources: - limits: {} - requests: {} - ## Configure Container Security Context - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod - ## @param sentinel.containerSecurityContext.enabled Enabled Redis® Sentinel containers' Security Context - ## @param sentinel.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container - ## @param sentinel.containerSecurityContext.runAsUser Set Redis® Sentinel containers' Security Context runAsUser - ## @param sentinel.containerSecurityContext.runAsGroup Set Redis® Sentinel containers' Security Context runAsGroup - ## @param sentinel.containerSecurityContext.runAsNonRoot Set Redis® Sentinel containers' Security Context runAsNonRoot - ## @param sentinel.containerSecurityContext.allowPrivilegeEscalation Set Redis® Sentinel containers' Security Context allowPrivilegeEscalation - ## @param sentinel.containerSecurityContext.seccompProfile.type Set Redis® Sentinel containers' Security Context seccompProfile - ## @param sentinel.containerSecurityContext.capabilities.drop Set Redis® Sentinel containers' Security Context capabilities to drop - ## - containerSecurityContext: - enabled: true - seLinuxOptions: null - runAsUser: 1001 - runAsGroup: 0 - runAsNonRoot: true - allowPrivilegeEscalation: false - seccompProfile: - type: RuntimeDefault - capabilities: - drop: - - ALL - ## @param sentinel.lifecycleHooks for the Redis® sentinel container(s) to automate configuration before or after startup - ## - lifecycleHooks: {} - ## @param sentinel.extraVolumes Optionally specify extra list of additional volumes for the Redis® Sentinel - ## - extraVolumes: [] - ## @param sentinel.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the Redis® Sentinel container(s) - ## - extraVolumeMounts: [] - ## Redis® Sentinel service parameters - ## - service: - ## @param sentinel.service.type Redis® Sentinel service type - ## - type: ClusterIP - ## @param sentinel.service.ports.redis Redis® service port for Redis® - ## @param sentinel.service.ports.sentinel Redis® service port for Redis® Sentinel - ## - ports: - redis: 6379 - sentinel: 26379 - ## @param sentinel.service.nodePorts.redis Node port for Redis® - ## @param sentinel.service.nodePorts.sentinel Node port for Sentinel - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport - ## NOTE: choose port between <30000-32767> - ## NOTE: By leaving these values blank, they will be generated by ports-configmap - ## If setting manually, please leave at least replica.replicaCount + 1 in between sentinel.service.nodePorts.redis and sentinel.service.nodePorts.sentinel to take into account the ports that will be created while incrementing that base port - ## - nodePorts: - redis: "" - sentinel: "" - ## @param sentinel.service.externalTrafficPolicy Redis® Sentinel service external traffic policy - ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip - ## - externalTrafficPolicy: Cluster - ## @param sentinel.service.extraPorts Extra ports to expose (normally used with the `sidecar` value) - ## - extraPorts: [] - ## @param sentinel.service.clusterIP Redis® Sentinel service Cluster IP - ## - clusterIP: "" - ## @param sentinel.service.loadBalancerIP Redis® Sentinel service Load Balancer IP - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer - ## - loadBalancerIP: "" - ## @param sentinel.service.loadBalancerClass sentinel service Load Balancer class if service type is `LoadBalancer` (optional, cloud specific) - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer - ## - loadBalancerClass: "" - ## @param sentinel.service.loadBalancerSourceRanges Redis® Sentinel service Load Balancer sources - ## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service - ## e.g. - ## loadBalancerSourceRanges: - ## - 10.10.10.0/24 - ## - loadBalancerSourceRanges: [] - ## @param sentinel.service.annotations Additional custom annotations for Redis® Sentinel service - ## - annotations: {} - ## @param sentinel.service.sessionAffinity Session Affinity for Kubernetes service, can be "None" or "ClientIP" - ## If "ClientIP", consecutive client requests will be directed to the same Pod - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies - ## - sessionAffinity: None - ## @param sentinel.service.sessionAffinityConfig Additional settings for the sessionAffinity - ## sessionAffinityConfig: - ## clientIP: - ## timeoutSeconds: 300 - ## - sessionAffinityConfig: {} - ## Headless service properties - ## - headless: - ## @param sentinel.service.headless.annotations Annotations for the headless service. - ## - annotations: {} - ## @param sentinel.terminationGracePeriodSeconds Integer setting the termination grace period for the redis-node pods - ## - terminationGracePeriodSeconds: 30 - -## @section Other Parameters -## - -## @param serviceBindings.enabled Create secret for service binding (Experimental) -## Ref: https://servicebinding.io/service-provider/ -## -serviceBindings: - enabled: false - -## Network Policy configuration -## ref: https://kubernetes.io/docs/concepts/services-networking/network-policies/ -## -networkPolicy: - ## @param networkPolicy.enabled Enable creation of NetworkPolicy resources - ## - enabled: false - ## @param networkPolicy.allowExternal Don't require client label for connections - ## When set to false, only pods with the correct client label will have network access to the ports - ## Redis® is listening on. When true, Redis® will accept connections from any source - ## (with the correct destination port). - ## - allowExternal: true - ## @param networkPolicy.extraIngress Add extra ingress rules to the NetworkPolicy - ## e.g: - ## extraIngress: - ## - ports: - ## - port: 1234 - ## from: - ## - podSelector: - ## - matchLabels: - ## - role: frontend - ## - podSelector: - ## - matchExpressions: - ## - key: role - ## operator: In - ## values: - ## - frontend - ## - extraIngress: [] - ## @param networkPolicy.extraEgress Add extra egress rules to the NetworkPolicy - ## e.g: - ## extraEgress: - ## - ports: - ## - port: 1234 - ## to: - ## - podSelector: - ## - matchLabels: - ## - role: frontend - ## - podSelector: - ## - matchExpressions: - ## - key: role - ## operator: In - ## values: - ## - frontend - ## - extraEgress: [] - ## @param networkPolicy.ingressNSMatchLabels Labels to match to allow traffic from other namespaces - ## @param networkPolicy.ingressNSPodMatchLabels Pod labels to match to allow traffic from other namespaces - ## - ingressNSMatchLabels: {} - ingressNSPodMatchLabels: {} - - metrics: - ## @param networkPolicy.metrics.allowExternal Don't require client label for connections for metrics endpoint - ## When set to false, only pods with the correct client label will have network access to the metrics port - ## - allowExternal: true - ## @param networkPolicy.metrics.ingressNSMatchLabels Labels to match to allow traffic from other namespaces to metrics endpoint - ## @param networkPolicy.metrics.ingressNSPodMatchLabels Pod labels to match to allow traffic from other namespaces to metrics endpoint - ## - ingressNSMatchLabels: {} - ingressNSPodMatchLabels: {} - -## PodSecurityPolicy configuration -## ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/ -## -podSecurityPolicy: - ## @param podSecurityPolicy.create Whether to create a PodSecurityPolicy. WARNING: PodSecurityPolicy is deprecated in Kubernetes v1.21 or later, unavailable in v1.25 or later - ## - create: false - ## @param podSecurityPolicy.enabled Enable PodSecurityPolicy's RBAC rules - ## - enabled: false -## RBAC configuration -## -rbac: - ## @param rbac.create Specifies whether RBAC resources should be created - ## - create: false - ## @param rbac.rules Custom RBAC rules to set - ## e.g: - ## rules: - ## - apiGroups: - ## - "" - ## resources: - ## - pods - ## verbs: - ## - get - ## - list - ## - rules: [] -## ServiceAccount configuration -## -serviceAccount: - ## @param serviceAccount.create Specifies whether a ServiceAccount should be created - ## - create: true - ## @param serviceAccount.name The name of the ServiceAccount to use. - ## If not set and create is true, a name is generated using the common.names.fullname template - ## - name: "" - ## @param serviceAccount.automountServiceAccountToken Whether to auto mount the service account token - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server - ## - automountServiceAccountToken: false - ## @param serviceAccount.annotations Additional custom annotations for the ServiceAccount - ## - annotations: {} -## Redis® Pod Disruption Budget configuration -## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/ -## -pdb: - ## @param pdb.create Specifies whether a PodDisruptionBudget should be created - ## - create: false - ## @param pdb.minAvailable Min number of pods that must still be available after the eviction - ## - minAvailable: 1 - ## @param pdb.maxUnavailable Max number of pods that can be unavailable after the eviction - ## - maxUnavailable: "" -## TLS configuration -## -tls: - ## @param tls.enabled Enable TLS traffic - ## - enabled: false - ## @param tls.authClients Require clients to authenticate - ## - authClients: true - ## @param tls.autoGenerated Enable autogenerated certificates - ## - autoGenerated: false - ## @param tls.existingSecret The name of the existing secret that contains the TLS certificates - ## - existingSecret: "" - ## @param tls.certificatesSecret DEPRECATED. Use existingSecret instead. - ## - certificatesSecret: "" - ## @param tls.certFilename Certificate filename - ## - certFilename: "" - ## @param tls.certKeyFilename Certificate Key filename - ## - certKeyFilename: "" - ## @param tls.certCAFilename CA Certificate filename - ## - certCAFilename: "" - ## @param tls.dhParamsFilename File containing DH params (in order to support DH based ciphers) - ## - dhParamsFilename: "" - -## @section Metrics Parameters -## - -metrics: - ## @param metrics.enabled Start a sidecar prometheus exporter to expose Redis® metrics - ## - enabled: false - ## Bitnami Redis® Exporter image - ## ref: https://hub.docker.com/r/bitnami/redis-exporter/tags/ - ## @param metrics.image.registry [default: REGISTRY_NAME] Redis® Exporter image registry - ## @param metrics.image.repository [default: REPOSITORY_NAME/redis-exporter] Redis® Exporter image repository - ## @skip metrics.image.tag Redis® Exporter image tag (immutable tags are recommended) - ## @param metrics.image.digest Redis® Exporter image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag - ## @param metrics.image.pullPolicy Redis® Exporter image pull policy - ## @param metrics.image.pullSecrets Redis® Exporter image pull secrets - ## - image: - registry: docker.io - repository: bitnami/redis-exporter - tag: 1.56.0-debian-11-r1 - digest: "" - pullPolicy: IfNotPresent - ## Optionally specify an array of imagePullSecrets. - ## Secrets must be manually created in the namespace. - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - ## e.g: - ## pullSecrets: - ## - myRegistryKeySecretName - ## - pullSecrets: [] - ## Configure extra options for Redis® containers' liveness, readiness & startup probes - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/ - ## @param metrics.startupProbe.enabled Enable startupProbe on Redis® replicas nodes - ## @param metrics.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe - ## @param metrics.startupProbe.periodSeconds Period seconds for startupProbe - ## @param metrics.startupProbe.timeoutSeconds Timeout seconds for startupProbe - ## @param metrics.startupProbe.failureThreshold Failure threshold for startupProbe - ## @param metrics.startupProbe.successThreshold Success threshold for startupProbe - ## - startupProbe: - enabled: false - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 5 - successThreshold: 1 - failureThreshold: 5 - ## @param metrics.livenessProbe.enabled Enable livenessProbe on Redis® replicas nodes - ## @param metrics.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe - ## @param metrics.livenessProbe.periodSeconds Period seconds for livenessProbe - ## @param metrics.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe - ## @param metrics.livenessProbe.failureThreshold Failure threshold for livenessProbe - ## @param metrics.livenessProbe.successThreshold Success threshold for livenessProbe - ## - livenessProbe: - enabled: true - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 5 - successThreshold: 1 - failureThreshold: 5 - ## @param metrics.readinessProbe.enabled Enable readinessProbe on Redis® replicas nodes - ## @param metrics.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe - ## @param metrics.readinessProbe.periodSeconds Period seconds for readinessProbe - ## @param metrics.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe - ## @param metrics.readinessProbe.failureThreshold Failure threshold for readinessProbe - ## @param metrics.readinessProbe.successThreshold Success threshold for readinessProbe - ## - readinessProbe: - enabled: true - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 3 - ## @param metrics.customStartupProbe Custom startupProbe that overrides the default one - ## - customStartupProbe: {} - ## @param metrics.customLivenessProbe Custom livenessProbe that overrides the default one - ## - customLivenessProbe: {} - ## @param metrics.customReadinessProbe Custom readinessProbe that overrides the default one - ## - customReadinessProbe: {} - ## @param metrics.command Override default metrics container init command (useful when using custom images) - ## - command: [] - ## @param metrics.redisTargetHost A way to specify an alternative Redis® hostname - ## Useful for certificate CN/SAN matching - ## - redisTargetHost: "localhost" - ## @param metrics.extraArgs Extra arguments for Redis® exporter, for example: - ## e.g.: - ## extraArgs: - ## check-keys: myKey,myOtherKey - ## - extraArgs: {} - ## @param metrics.extraEnvVars Array with extra environment variables to add to Redis® exporter - ## e.g: - ## extraEnvVars: - ## - name: FOO - ## value: "bar" - ## - extraEnvVars: [] - ## Configure Container Security Context - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod - ## @param metrics.containerSecurityContext.enabled Enabled Redis® exporter containers' Security Context - ## @param metrics.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container - ## @param metrics.containerSecurityContext.runAsUser Set Redis® exporter containers' Security Context runAsUser - ## @param metrics.containerSecurityContext.runAsGroup Set Redis® exporter containers' Security Context runAsGroup - ## @param metrics.containerSecurityContext.runAsNonRoot Set Redis® exporter containers' Security Context runAsNonRoot - ## @param metrics.containerSecurityContext.allowPrivilegeEscalation Set Redis® exporter containers' Security Context allowPrivilegeEscalation - ## @param metrics.containerSecurityContext.seccompProfile.type Set Redis® exporter containers' Security Context seccompProfile - ## @param metrics.containerSecurityContext.capabilities.drop Set Redis® exporter containers' Security Context capabilities to drop - ## - containerSecurityContext: - enabled: true - seLinuxOptions: null - runAsUser: 1001 - runAsGroup: 0 - runAsNonRoot: true - allowPrivilegeEscalation: false - seccompProfile: - type: RuntimeDefault - capabilities: - drop: - - ALL - ## @param metrics.extraVolumes Optionally specify extra list of additional volumes for the Redis® metrics sidecar - ## - extraVolumes: [] - ## @param metrics.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the Redis® metrics sidecar - ## - extraVolumeMounts: [] - ## Redis® exporter resource requests and limits - ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ - ## @param metrics.resources.limits The resources limits for the Redis® exporter container - ## @param metrics.resources.requests The requested resources for the Redis® exporter container - ## - resources: - limits: {} - requests: {} - ## @param metrics.podLabels Extra labels for Redis® exporter pods - ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ - ## - podLabels: {} - ## @param metrics.podAnnotations [object] Annotations for Redis® exporter pods - ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ - ## - podAnnotations: - prometheus.io/scrape: "true" - prometheus.io/port: "9121" - ## Redis® exporter service parameters - ## - service: - ## @param metrics.service.type Redis® exporter service type - ## - type: ClusterIP - ## @param metrics.service.port Redis® exporter service port - ## - port: 9121 - ## @param metrics.service.externalTrafficPolicy Redis® exporter service external traffic policy - ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip - ## - externalTrafficPolicy: Cluster - ## @param metrics.service.extraPorts Extra ports to expose (normally used with the `sidecar` value) - ## - extraPorts: [] - ## @param metrics.service.loadBalancerIP Redis® exporter service Load Balancer IP - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer - ## - loadBalancerIP: "" - ## @param metrics.service.loadBalancerClass exporter service Load Balancer class if service type is `LoadBalancer` (optional, cloud specific) - ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer - ## - loadBalancerClass: "" - ## @param metrics.service.loadBalancerSourceRanges Redis® exporter service Load Balancer sources - ## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service - ## e.g. - ## loadBalancerSourceRanges: - ## - 10.10.10.0/24 - ## - loadBalancerSourceRanges: [] - ## @param metrics.service.annotations Additional custom annotations for Redis® exporter service - ## - annotations: {} - ## @param metrics.service.clusterIP Redis® exporter service Cluster IP - ## - clusterIP: "" - ## Prometheus Service Monitor - ## ref: https://github.com/coreos/prometheus-operator - ## https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint - ## - serviceMonitor: - ## @param metrics.serviceMonitor.enabled Create ServiceMonitor resource(s) for scraping metrics using PrometheusOperator - ## - enabled: false - ## @param metrics.serviceMonitor.namespace The namespace in which the ServiceMonitor will be created - ## - namespace: "" - ## @param metrics.serviceMonitor.interval The interval at which metrics should be scraped - ## - interval: 30s - ## @param metrics.serviceMonitor.scrapeTimeout The timeout after which the scrape is ended - ## - scrapeTimeout: "" - ## @param metrics.serviceMonitor.relabellings Metrics RelabelConfigs to apply to samples before scraping. - ## - relabellings: [] - ## @param metrics.serviceMonitor.metricRelabelings Metrics RelabelConfigs to apply to samples before ingestion. - ## - metricRelabelings: [] - ## @param metrics.serviceMonitor.honorLabels Specify honorLabels parameter to add the scrape endpoint - ## - honorLabels: false - ## @param metrics.serviceMonitor.additionalLabels Additional labels that can be used so ServiceMonitor resource(s) can be discovered by Prometheus - ## - additionalLabels: {} - ## @param metrics.serviceMonitor.podTargetLabels Labels from the Kubernetes pod to be transferred to the created metrics - ## - podTargetLabels: [] - ## @param metrics.serviceMonitor.sampleLimit Limit of how many samples should be scraped from every Pod - ## - sampleLimit: false - ## @param metrics.serviceMonitor.targetLimit Limit of how many targets should be scraped - ## - targetLimit: false - ## @param metrics.serviceMonitor.additionalEndpoints Additional endpoints to scrape (e.g sentinel) - ## - additionalEndpoints: [] - # uncomment in order to scrape sentinel metrics - # - port: http-metrics - # interval: 30s - # path: /scrape - # params: - # target: - # - localhost:26379 - ## Prometheus Pod Monitor - ## ref: https://github.com/coreos/prometheus-operator - ## https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#podmonitor - ## - podMonitor: - ## @param metrics.podMonitor.enabled Create PodMonitor resource(s) for scraping metrics using PrometheusOperator - ## - enabled: false - ## @param metrics.podMonitor.namespace The namespace in which the PodMonitor will be created - ## - namespace: "" - ## @param metrics.podMonitor.interval The interval at which metrics should be scraped - ## - interval: 30s - ## @param metrics.podMonitor.scrapeTimeout The timeout after which the scrape is ended - ## - scrapeTimeout: "" - ## @param metrics.podMonitor.relabellings Metrics RelabelConfigs to apply to samples before scraping. - ## - relabellings: [] - ## @param metrics.podMonitor.metricRelabelings Metrics RelabelConfigs to apply to samples before ingestion. - ## - metricRelabelings: [] - ## @param metrics.podMonitor.honorLabels Specify honorLabels parameter to add the scrape endpoint - ## - honorLabels: false - ## @param metrics.podMonitor.additionalLabels Additional labels that can be used so PodMonitor resource(s) can be discovered by Prometheus - ## - additionalLabels: {} - ## @param metrics.podMonitor.podTargetLabels Labels from the Kubernetes pod to be transferred to the created metrics - ## - podTargetLabels: [] - ## @param metrics.podMonitor.sampleLimit Limit of how many samples should be scraped from every Pod - ## - sampleLimit: false - ## @param metrics.podMonitor.targetLimit Limit of how many targets should be scraped - ## - targetLimit: false - ## @param metrics.podMonitor.additionalEndpoints Additional endpoints to scrape (e.g sentinel) - ## - additionalEndpoints: [] - # uncomment in order to scrape sentinel metrics - # - port: metrics - # interval: 30s - # path: /scrape - # params: - # target: - # - localhost:26379 - - ## Custom PrometheusRule to be defined - ## ref: https://github.com/coreos/prometheus-operator#customresourcedefinitions - ## - prometheusRule: - ## @param metrics.prometheusRule.enabled Create a custom prometheusRule Resource for scraping metrics using PrometheusOperator - ## - enabled: false - ## @param metrics.prometheusRule.namespace The namespace in which the prometheusRule will be created - ## - namespace: "" - ## @param metrics.prometheusRule.additionalLabels Additional labels for the prometheusRule - ## - additionalLabels: {} - ## @param metrics.prometheusRule.rules Custom Prometheus rules - ## e.g: - ## rules: - ## - alert: RedisDown - ## expr: redis_up{service="{{ template "common.names.fullname" . }}-metrics"} == 0 - ## for: 2m - ## labels: - ## severity: error - ## annotations: - ## summary: Redis® instance {{ "{{ $labels.instance }}" }} down - ## description: Redis® instance {{ "{{ $labels.instance }}" }} is down - ## - alert: RedisMemoryHigh - ## expr: > - ## redis_memory_used_bytes{service="{{ template "common.names.fullname" . }}-metrics"} * 100 - ## / - ## redis_memory_max_bytes{service="{{ template "common.names.fullname" . }}-metrics"} - ## > 90 - ## for: 2m - ## labels: - ## severity: error - ## annotations: - ## summary: Redis® instance {{ "{{ $labels.instance }}" }} is using too much memory - ## description: | - ## Redis® instance {{ "{{ $labels.instance }}" }} is using {{ "{{ $value }}" }}% of its available memory. - ## - alert: RedisKeyEviction - ## expr: | - ## increase(redis_evicted_keys_total{service="{{ template "common.names.fullname" . }}-metrics"}[5m]) > 0 - ## for: 1s - ## labels: - ## severity: error - ## annotations: - ## summary: Redis® instance {{ "{{ $labels.instance }}" }} has evicted keys - ## description: | - ## Redis® instance {{ "{{ $labels.instance }}" }} has evicted {{ "{{ $value }}" }} keys in the last 5 minutes. - ## - rules: [] - -## @section Init Container Parameters -## - -## 'volumePermissions' init container parameters -## Changes the owner and group of the persistent volume mount point to runAsUser:fsGroup values -## based on the *podSecurityContext/*containerSecurityContext parameters -## -volumePermissions: - ## @param volumePermissions.enabled Enable init container that changes the owner/group of the PV mount point to `runAsUser:fsGroup` - ## - enabled: false - ## OS Shell + Utility image - ## ref: https://hub.docker.com/r/bitnami/os-shell/tags/ - ## @param volumePermissions.image.registry [default: REGISTRY_NAME] OS Shell + Utility image registry - ## @param volumePermissions.image.repository [default: REPOSITORY_NAME/os-shell] OS Shell + Utility image repository - ## @skip volumePermissions.image.tag OS Shell + Utility image tag (immutable tags are recommended) - ## @param volumePermissions.image.digest OS Shell + Utility image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag - ## @param volumePermissions.image.pullPolicy OS Shell + Utility image pull policy - ## @param volumePermissions.image.pullSecrets OS Shell + Utility image pull secrets - ## - image: - registry: docker.io - repository: bitnami/os-shell - tag: 11-debian-11-r94 - digest: "" - pullPolicy: IfNotPresent - ## Optionally specify an array of imagePullSecrets. - ## Secrets must be manually created in the namespace. - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - ## e.g: - ## pullSecrets: - ## - myRegistryKeySecretName - ## - pullSecrets: [] - ## Init container's resource requests and limits - ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ - ## @param volumePermissions.resources.limits The resources limits for the init container - ## @param volumePermissions.resources.requests The requested resources for the init container - ## - resources: - limits: {} - requests: {} - ## Init container Container Security Context - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container - ## @param volumePermissions.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container - ## @param volumePermissions.containerSecurityContext.runAsUser Set init container's Security Context runAsUser - ## NOTE: when runAsUser is set to special value "auto", init container will try to chown the - ## data folder to auto-determined user&group, using commands: `id -u`:`id -G | cut -d" " -f2` - ## "auto" is especially useful for OpenShift which has scc with dynamic user ids (and 0 is not allowed) - ## - containerSecurityContext: - seLinuxOptions: null - runAsUser: 0 - -## init-sysctl container parameters -## used to perform sysctl operation to modify Kernel settings (needed sometimes to avoid warnings) -## -sysctl: - ## @param sysctl.enabled Enable init container to modify Kernel settings - ## - enabled: false - ## OS Shell + Utility image - ## ref: https://hub.docker.com/r/bitnami/os-shell/tags/ - ## @param sysctl.image.registry [default: REGISTRY_NAME] OS Shell + Utility image registry - ## @param sysctl.image.repository [default: REPOSITORY_NAME/os-shell] OS Shell + Utility image repository - ## @skip sysctl.image.tag OS Shell + Utility image tag (immutable tags are recommended) - ## @param sysctl.image.digest OS Shell + Utility image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag - ## @param sysctl.image.pullPolicy OS Shell + Utility image pull policy - ## @param sysctl.image.pullSecrets OS Shell + Utility image pull secrets - ## - image: - registry: docker.io - repository: bitnami/os-shell - tag: 11-debian-11-r94 - digest: "" - pullPolicy: IfNotPresent - ## Optionally specify an array of imagePullSecrets. - ## Secrets must be manually created in the namespace. - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - ## e.g: - ## pullSecrets: - ## - myRegistryKeySecretName - ## - pullSecrets: [] - ## @param sysctl.command Override default init-sysctl container command (useful when using custom images) - ## - command: [] - ## @param sysctl.mountHostSys Mount the host `/sys` folder to `/host-sys` - ## - mountHostSys: false - ## Init container's resource requests and limits - ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ - ## @param sysctl.resources.limits The resources limits for the init container - ## @param sysctl.resources.requests The requested resources for the init container - ## - resources: - limits: {} - requests: {} - -## @section useExternalDNS Parameters -## -## @param useExternalDNS.enabled Enable various syntax that would enable external-dns to work. Note this requires a working installation of `external-dns` to be usable. -## @param useExternalDNS.additionalAnnotations Extra annotations to be utilized when `external-dns` is enabled. -## @param useExternalDNS.annotationKey The annotation key utilized when `external-dns` is enabled. Setting this to `false` will disable annotations. -## @param useExternalDNS.suffix The DNS suffix utilized when `external-dns` is enabled. Note that we prepend the suffix with the full name of the release. -## -useExternalDNS: - enabled: false - suffix: "" - annotationKey: external-dns.alpha.kubernetes.io/ - additionalAnnotations: {} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/.helmignore b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/.helmignore deleted file mode 100644 index 0e8a0eb36..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/CHANGELOG.md b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/CHANGELOG.md deleted file mode 100644 index 31346f64a..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/CHANGELOG.md +++ /dev/null @@ -1,163 +0,0 @@ -# CHANGELOG for `victoria-metrics-agent` helm-chart - -## Next release - -- TODO - -## 0.9.17 - -**Release date:** 2024-02-01 - -![AppVersion: v1.97.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.97.1&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- bump version of VM components to [v1.97.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.97.1) - -## 0.9.16 - -**Release date:** 2023-12-20 - -![AppVersion: v1.96.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.96.0&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- Add init containers for deployment and statefulset. See [#806](https://github.com/VictoriaMetrics/helm-charts/pull/806) by @MemberIT. - -## 0.9.15 - -**Release date:** 2023-12-13 - -![AppVersion: v1.96.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.96.0&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- Fix configuration of volume mount for license key referenced by using secret. - -## 0.9.14 - -**Release date:** 2023-12-12 - -![AppVersion: v1.96.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.96.0&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- bump version of VM components to [v1.96.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.96.0) - -## 0.9.13 - -**Release date:** 2023-11-16 - -![AppVersion: v1.95.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.95.1&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- bump version of VM components to [v1.95.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.95.1) - -## 0.9.12 - -**Release date:** 2023-11-15 - -![AppVersion: v1.95.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.95.0&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- bump version of VM components to [v1.95.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.95.0) - -## 0.9.11 - -**Release date:** 2023-10-04 - -![AppVersion: v1.94.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.94.0&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- bump version of VM components to [v1.94.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.94.0) -- Add support of providing enterprise license key for VictoriaMetrics enterprise. See [these docs](https://docs.victoriametrics.com/enterprise.html) for details. - -## 0.9.10 - -**Release date:** 2023-09-21 - -![AppVersion: v1.93.5](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.5&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- Bump version of VM components to [v1.93.5](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.93.5) - -## 0.9.9 - -**Release date:** 2023-09-11 - -![AppVersion: v1.93.4](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.4&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- Bump version of VM components to [v1.93.4](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.93.4) - -## 0.9.8 - -**Release date:** 2023-09-04 - -![AppVersion: v1.93.3](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.3&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- Bump version of vmagent to `v1.93.3` - -## 0.9.6 - -**Release date:** 2023-08-30 - -![AppVersion: v1.93.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.1&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -* fix `honor_timestamps` field for cadvisor scrape job (#626) - -## 0.9.5 - -**Release date:** 2023-08-24 - -![AppVersion: v1.93.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.1&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -* Disable `honorTimestamps` for cadvisor scrape job by default (#617) - -## 0.9.4 - -**Release date:** 2023-08-23 - -![AppVersion: v1.93.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.0&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -* Update VictoriaMetrics components from v1.93.0 to v1.93.1 - -## 0.9.3 - -**Release date:** 2023-08-12 - -![AppVersion: v1.93.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.0&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -* Update VictoriaMetrics components from v1.92.1 to v1.93.0 - -## 0.9.2 - -**Release date:** 2023-07-28 - -![AppVersion: v1.92.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.92.1&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -* Update VictoriaMetrics components from v1.92.0 to v1.92.1 (#599) - -## 0.9.1 - -**Release date:** 2023-07-27 - -![AppVersion: v1.92.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.92.0&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -* Update VictoriaMetrics components from v1.91.3 to v1.92.0 -* make package merge gen-docs - -## 0.9.0 - -**Release date:** 2023-07-13 - -![AppVersion: v1.91.3](https://img.shields.io/static/v1?label=AppVersion&message=v1.91.3&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -* bump version of agent, alert, auth, cluster, single -* feat(vmagent): Add support for topologySpreadConstraints field (#583) -* Feat: Add custom objects to vma helm charts (#558) -* fix(vmagent): Use endpoints instead of endpointslices on kubernetes-apiservers (#574) diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/Chart.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/Chart.yaml deleted file mode 100644 index f2acc26f1..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/Chart.yaml +++ /dev/null @@ -1,33 +0,0 @@ -annotations: - artifacthub.io/category: monitoring-logging - artifacthub.io/changes: '- bump version of VM components to [v1.97.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.97.1)' - artifacthub.io/license: Apache-2.0 - artifacthub.io/links: | - - name: Sources - url: https://github.com/VictoriaMetrics/helm-charts - - name: Charts repo - url: https://victoriametrics.github.io/helm-charts/ - - name: Docs - url: https://docs.victoriametrics.com/vmagent.html -apiVersion: v1 -appVersion: v1.97.1 -description: Victoria Metrics Agent - collects metrics from various sources and stores - them to VictoriaMetrics -home: https://github.com/VictoriaMetrics/helm-charts -icon: https://avatars.githubusercontent.com/u/43720803?s=200&v=4 -keywords: -- victoriametrics -- vmagent -- agent -- collector -- monitoring -- kubernetes -- observability -- metrics -- timeseries -- servicediscovery -kubeVersion: '>=1.23.0-0' -name: victoria-metrics-agent -sources: -- https://github.com/VictoriaMetrics/helm-charts -version: 0.9.17 diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/README.md b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/README.md deleted file mode 100644 index 68d5c86b5..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/README.md +++ /dev/null @@ -1,358 +0,0 @@ -# Helm Chart For Victoria Metrics Agent. - - ![Version: 0.9.17](https://img.shields.io/badge/Version-0.9.17-informational?style=flat-square) -[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/victoriametrics)](https://artifacthub.io/packages/helm/victoriametrics/victoria-metrics-agent) -[![Slack](https://img.shields.io/badge/join%20slack-%23victoriametrics-brightgreen.svg)](https://slack.victoriametrics.com/) - -Victoria Metrics Agent - collects metrics from various sources and stores them to VictoriaMetrics - -## Prerequisites - -* Install the follow packages: ``git``, ``kubectl``, ``helm``, ``helm-docs``. See this [tutorial](../../REQUIREMENTS.md). - -## How to install - -Access a Kubernetes cluster. - -Add a chart helm repository with follow commands: - -```console -helm repo add vm https://victoriametrics.github.io/helm-charts/ - -helm repo update -``` - -List versions of ``vm/victoria-metrics-agent`` chart available to installation: - -```console -helm search repo vm/victoria-metrics-agent -l -``` - -Export default values of ``victoria-metrics-agent`` chart to file ``values.yaml``: - -```console -helm show values vm/victoria-metrics-agent > values.yaml -``` - -Change the values according to the need of the environment in ``values.yaml`` file. - -Test the installation with command: - -```console -helm install vmagent vm/victoria-metrics-agent -f values.yaml -n NAMESPACE --debug --dry-run -``` - -Install chart with command: - -```console -helm install vmagent vm/victoria-metrics-agent -f values.yaml -n NAMESPACE -``` - -Get the pods lists by running this commands: - -```console -kubectl get pods -A | grep 'agent' -``` - -Get the application by running this command: - -```console -helm list -f vmagent -n NAMESPACE -``` - -See the history of versions of ``vmagent`` application with command. - -```console -helm history vmagent -n NAMESPACE -``` - -## How to uninstall - -Remove application with command. - -```console -helm uninstall vmagent -n NAMESPACE -``` - -## Documentation of Helm Chart - -Install ``helm-docs`` following the instructions on this [tutorial](../../REQUIREMENTS.md). - -Generate docs with ``helm-docs`` command. - -```bash -cd charts/victoria-metrics-agent - -helm-docs -``` - -The markdown generation is entirely go template driven. The tool parses metadata from charts and generates a number of sub-templates that can be referenced in a template file (by default ``README.md.gotmpl``). If no template file is provided, the tool has a default internal template that will generate a reasonably formatted README. - -## Parameters - -The following tables lists the configurable parameters of the chart and their default values. - -Change the values according to the need of the environment in ``victoria-metrics-agent/values.yaml`` file. - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| affinity | object | `{}` | | -| annotations | object | `{}` | | -| config.global.scrape_interval | string | `"10s"` | | -| config.scrape_configs[0].job_name | string | `"vmagent"` | | -| config.scrape_configs[0].static_configs[0].targets[0] | string | `"localhost:8429"` | | -| config.scrape_configs[1].bearer_token_file | string | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | | -| config.scrape_configs[1].job_name | string | `"kubernetes-apiservers"` | | -| config.scrape_configs[1].kubernetes_sd_configs[0].role | string | `"endpoints"` | | -| config.scrape_configs[1].relabel_configs[0].action | string | `"keep"` | | -| config.scrape_configs[1].relabel_configs[0].regex | string | `"default;kubernetes;https"` | | -| config.scrape_configs[1].relabel_configs[0].source_labels[0] | string | `"__meta_kubernetes_namespace"` | | -| config.scrape_configs[1].relabel_configs[0].source_labels[1] | string | `"__meta_kubernetes_service_name"` | | -| config.scrape_configs[1].relabel_configs[0].source_labels[2] | string | `"__meta_kubernetes_endpoint_port_name"` | | -| config.scrape_configs[1].scheme | string | `"https"` | | -| config.scrape_configs[1].tls_config.ca_file | string | `"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"` | | -| config.scrape_configs[1].tls_config.insecure_skip_verify | bool | `true` | | -| config.scrape_configs[2].bearer_token_file | string | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | | -| config.scrape_configs[2].job_name | string | `"kubernetes-nodes"` | | -| config.scrape_configs[2].kubernetes_sd_configs[0].role | string | `"node"` | | -| config.scrape_configs[2].relabel_configs[0].action | string | `"labelmap"` | | -| config.scrape_configs[2].relabel_configs[0].regex | string | `"__meta_kubernetes_node_label_(.+)"` | | -| config.scrape_configs[2].relabel_configs[1].replacement | string | `"kubernetes.default.svc:443"` | | -| config.scrape_configs[2].relabel_configs[1].target_label | string | `"__address__"` | | -| config.scrape_configs[2].relabel_configs[2].regex | string | `"(.+)"` | | -| config.scrape_configs[2].relabel_configs[2].replacement | string | `"/api/v1/nodes/$1/proxy/metrics"` | | -| config.scrape_configs[2].relabel_configs[2].source_labels[0] | string | `"__meta_kubernetes_node_name"` | | -| config.scrape_configs[2].relabel_configs[2].target_label | string | `"__metrics_path__"` | | -| config.scrape_configs[2].scheme | string | `"https"` | | -| config.scrape_configs[2].tls_config.ca_file | string | `"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"` | | -| config.scrape_configs[2].tls_config.insecure_skip_verify | bool | `true` | | -| config.scrape_configs[3].bearer_token_file | string | `"/var/run/secrets/kubernetes.io/serviceaccount/token"` | | -| config.scrape_configs[3].honor_timestamps | bool | `false` | | -| config.scrape_configs[3].job_name | string | `"kubernetes-nodes-cadvisor"` | | -| config.scrape_configs[3].kubernetes_sd_configs[0].role | string | `"node"` | | -| config.scrape_configs[3].relabel_configs[0].action | string | `"labelmap"` | | -| config.scrape_configs[3].relabel_configs[0].regex | string | `"__meta_kubernetes_node_label_(.+)"` | | -| config.scrape_configs[3].relabel_configs[1].replacement | string | `"kubernetes.default.svc:443"` | | -| config.scrape_configs[3].relabel_configs[1].target_label | string | `"__address__"` | | -| config.scrape_configs[3].relabel_configs[2].regex | string | `"(.+)"` | | -| config.scrape_configs[3].relabel_configs[2].replacement | string | `"/api/v1/nodes/$1/proxy/metrics/cadvisor"` | | -| config.scrape_configs[3].relabel_configs[2].source_labels[0] | string | `"__meta_kubernetes_node_name"` | | -| config.scrape_configs[3].relabel_configs[2].target_label | string | `"__metrics_path__"` | | -| config.scrape_configs[3].scheme | string | `"https"` | | -| config.scrape_configs[3].tls_config.ca_file | string | `"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"` | | -| config.scrape_configs[3].tls_config.insecure_skip_verify | bool | `true` | | -| config.scrape_configs[4].job_name | string | `"kubernetes-service-endpoints"` | | -| config.scrape_configs[4].kubernetes_sd_configs[0].role | string | `"endpointslices"` | | -| config.scrape_configs[4].relabel_configs[0].action | string | `"drop"` | | -| config.scrape_configs[4].relabel_configs[0].regex | bool | `true` | | -| config.scrape_configs[4].relabel_configs[0].source_labels[0] | string | `"__meta_kubernetes_pod_container_init"` | | -| config.scrape_configs[4].relabel_configs[10].source_labels[0] | string | `"__meta_kubernetes_service_name"` | | -| config.scrape_configs[4].relabel_configs[10].target_label | string | `"service"` | | -| config.scrape_configs[4].relabel_configs[11].replacement | string | `"${1}"` | | -| config.scrape_configs[4].relabel_configs[11].source_labels[0] | string | `"__meta_kubernetes_service_name"` | | -| config.scrape_configs[4].relabel_configs[11].target_label | string | `"job"` | | -| config.scrape_configs[4].relabel_configs[12].action | string | `"replace"` | | -| config.scrape_configs[4].relabel_configs[12].source_labels[0] | string | `"__meta_kubernetes_pod_node_name"` | | -| config.scrape_configs[4].relabel_configs[12].target_label | string | `"node"` | | -| config.scrape_configs[4].relabel_configs[1].action | string | `"keep_if_equal"` | | -| config.scrape_configs[4].relabel_configs[1].source_labels[0] | string | `"__meta_kubernetes_service_annotation_prometheus_io_port"` | | -| config.scrape_configs[4].relabel_configs[1].source_labels[1] | string | `"__meta_kubernetes_pod_container_port_number"` | | -| config.scrape_configs[4].relabel_configs[2].action | string | `"keep"` | | -| config.scrape_configs[4].relabel_configs[2].regex | bool | `true` | | -| config.scrape_configs[4].relabel_configs[2].source_labels[0] | string | `"__meta_kubernetes_service_annotation_prometheus_io_scrape"` | | -| config.scrape_configs[4].relabel_configs[3].action | string | `"replace"` | | -| config.scrape_configs[4].relabel_configs[3].regex | string | `"(https?)"` | | -| config.scrape_configs[4].relabel_configs[3].source_labels[0] | string | `"__meta_kubernetes_service_annotation_prometheus_io_scheme"` | | -| config.scrape_configs[4].relabel_configs[3].target_label | string | `"__scheme__"` | | -| config.scrape_configs[4].relabel_configs[4].action | string | `"replace"` | | -| config.scrape_configs[4].relabel_configs[4].regex | string | `"(.+)"` | | -| config.scrape_configs[4].relabel_configs[4].source_labels[0] | string | `"__meta_kubernetes_service_annotation_prometheus_io_path"` | | -| config.scrape_configs[4].relabel_configs[4].target_label | string | `"__metrics_path__"` | | -| config.scrape_configs[4].relabel_configs[5].action | string | `"replace"` | | -| config.scrape_configs[4].relabel_configs[5].regex | string | `"([^:]+)(?::\\d+)?;(\\d+)"` | | -| config.scrape_configs[4].relabel_configs[5].replacement | string | `"$1:$2"` | | -| config.scrape_configs[4].relabel_configs[5].source_labels[0] | string | `"__address__"` | | -| config.scrape_configs[4].relabel_configs[5].source_labels[1] | string | `"__meta_kubernetes_service_annotation_prometheus_io_port"` | | -| config.scrape_configs[4].relabel_configs[5].target_label | string | `"__address__"` | | -| config.scrape_configs[4].relabel_configs[6].action | string | `"labelmap"` | | -| config.scrape_configs[4].relabel_configs[6].regex | string | `"__meta_kubernetes_service_label_(.+)"` | | -| config.scrape_configs[4].relabel_configs[7].source_labels[0] | string | `"__meta_kubernetes_pod_name"` | | -| config.scrape_configs[4].relabel_configs[7].target_label | string | `"pod"` | | -| config.scrape_configs[4].relabel_configs[8].source_labels[0] | string | `"__meta_kubernetes_pod_container_name"` | | -| config.scrape_configs[4].relabel_configs[8].target_label | string | `"container"` | | -| config.scrape_configs[4].relabel_configs[9].source_labels[0] | string | `"__meta_kubernetes_namespace"` | | -| config.scrape_configs[4].relabel_configs[9].target_label | string | `"namespace"` | | -| config.scrape_configs[5].job_name | string | `"kubernetes-service-endpoints-slow"` | | -| config.scrape_configs[5].kubernetes_sd_configs[0].role | string | `"endpointslices"` | | -| config.scrape_configs[5].relabel_configs[0].action | string | `"drop"` | | -| config.scrape_configs[5].relabel_configs[0].regex | bool | `true` | | -| config.scrape_configs[5].relabel_configs[0].source_labels[0] | string | `"__meta_kubernetes_pod_container_init"` | | -| config.scrape_configs[5].relabel_configs[10].source_labels[0] | string | `"__meta_kubernetes_service_name"` | | -| config.scrape_configs[5].relabel_configs[10].target_label | string | `"service"` | | -| config.scrape_configs[5].relabel_configs[11].replacement | string | `"${1}"` | | -| config.scrape_configs[5].relabel_configs[11].source_labels[0] | string | `"__meta_kubernetes_service_name"` | | -| config.scrape_configs[5].relabel_configs[11].target_label | string | `"job"` | | -| config.scrape_configs[5].relabel_configs[12].action | string | `"replace"` | | -| config.scrape_configs[5].relabel_configs[12].source_labels[0] | string | `"__meta_kubernetes_pod_node_name"` | | -| config.scrape_configs[5].relabel_configs[12].target_label | string | `"node"` | | -| config.scrape_configs[5].relabel_configs[1].action | string | `"keep_if_equal"` | | -| config.scrape_configs[5].relabel_configs[1].source_labels[0] | string | `"__meta_kubernetes_service_annotation_prometheus_io_port"` | | -| config.scrape_configs[5].relabel_configs[1].source_labels[1] | string | `"__meta_kubernetes_pod_container_port_number"` | | -| config.scrape_configs[5].relabel_configs[2].action | string | `"keep"` | | -| config.scrape_configs[5].relabel_configs[2].regex | bool | `true` | | -| config.scrape_configs[5].relabel_configs[2].source_labels[0] | string | `"__meta_kubernetes_service_annotation_prometheus_io_scrape_slow"` | | -| config.scrape_configs[5].relabel_configs[3].action | string | `"replace"` | | -| config.scrape_configs[5].relabel_configs[3].regex | string | `"(https?)"` | | -| config.scrape_configs[5].relabel_configs[3].source_labels[0] | string | `"__meta_kubernetes_service_annotation_prometheus_io_scheme"` | | -| config.scrape_configs[5].relabel_configs[3].target_label | string | `"__scheme__"` | | -| config.scrape_configs[5].relabel_configs[4].action | string | `"replace"` | | -| config.scrape_configs[5].relabel_configs[4].regex | string | `"(.+)"` | | -| config.scrape_configs[5].relabel_configs[4].source_labels[0] | string | `"__meta_kubernetes_service_annotation_prometheus_io_path"` | | -| config.scrape_configs[5].relabel_configs[4].target_label | string | `"__metrics_path__"` | | -| config.scrape_configs[5].relabel_configs[5].action | string | `"replace"` | | -| config.scrape_configs[5].relabel_configs[5].regex | string | `"([^:]+)(?::\\d+)?;(\\d+)"` | | -| config.scrape_configs[5].relabel_configs[5].replacement | string | `"$1:$2"` | | -| config.scrape_configs[5].relabel_configs[5].source_labels[0] | string | `"__address__"` | | -| config.scrape_configs[5].relabel_configs[5].source_labels[1] | string | `"__meta_kubernetes_service_annotation_prometheus_io_port"` | | -| config.scrape_configs[5].relabel_configs[5].target_label | string | `"__address__"` | | -| config.scrape_configs[5].relabel_configs[6].action | string | `"labelmap"` | | -| config.scrape_configs[5].relabel_configs[6].regex | string | `"__meta_kubernetes_service_label_(.+)"` | | -| config.scrape_configs[5].relabel_configs[7].source_labels[0] | string | `"__meta_kubernetes_pod_name"` | | -| config.scrape_configs[5].relabel_configs[7].target_label | string | `"pod"` | | -| config.scrape_configs[5].relabel_configs[8].source_labels[0] | string | `"__meta_kubernetes_pod_container_name"` | | -| config.scrape_configs[5].relabel_configs[8].target_label | string | `"container"` | | -| config.scrape_configs[5].relabel_configs[9].source_labels[0] | string | `"__meta_kubernetes_namespace"` | | -| config.scrape_configs[5].relabel_configs[9].target_label | string | `"namespace"` | | -| config.scrape_configs[5].scrape_interval | string | `"5m"` | | -| config.scrape_configs[5].scrape_timeout | string | `"30s"` | | -| config.scrape_configs[6].job_name | string | `"kubernetes-services"` | | -| config.scrape_configs[6].kubernetes_sd_configs[0].role | string | `"service"` | | -| config.scrape_configs[6].metrics_path | string | `"/probe"` | | -| config.scrape_configs[6].params.module[0] | string | `"http_2xx"` | | -| config.scrape_configs[6].relabel_configs[0].action | string | `"keep"` | | -| config.scrape_configs[6].relabel_configs[0].regex | bool | `true` | | -| config.scrape_configs[6].relabel_configs[0].source_labels[0] | string | `"__meta_kubernetes_service_annotation_prometheus_io_probe"` | | -| config.scrape_configs[6].relabel_configs[1].source_labels[0] | string | `"__address__"` | | -| config.scrape_configs[6].relabel_configs[1].target_label | string | `"__param_target"` | | -| config.scrape_configs[6].relabel_configs[2].replacement | string | `"blackbox"` | | -| config.scrape_configs[6].relabel_configs[2].target_label | string | `"__address__"` | | -| config.scrape_configs[6].relabel_configs[3].source_labels[0] | string | `"__param_target"` | | -| config.scrape_configs[6].relabel_configs[3].target_label | string | `"instance"` | | -| config.scrape_configs[6].relabel_configs[4].action | string | `"labelmap"` | | -| config.scrape_configs[6].relabel_configs[4].regex | string | `"__meta_kubernetes_service_label_(.+)"` | | -| config.scrape_configs[6].relabel_configs[5].source_labels[0] | string | `"__meta_kubernetes_namespace"` | | -| config.scrape_configs[6].relabel_configs[5].target_label | string | `"namespace"` | | -| config.scrape_configs[6].relabel_configs[6].source_labels[0] | string | `"__meta_kubernetes_service_name"` | | -| config.scrape_configs[6].relabel_configs[6].target_label | string | `"service"` | | -| config.scrape_configs[7].job_name | string | `"kubernetes-pods"` | | -| config.scrape_configs[7].kubernetes_sd_configs[0].role | string | `"pod"` | | -| config.scrape_configs[7].relabel_configs[0].action | string | `"drop"` | | -| config.scrape_configs[7].relabel_configs[0].regex | bool | `true` | | -| config.scrape_configs[7].relabel_configs[0].source_labels[0] | string | `"__meta_kubernetes_pod_container_init"` | | -| config.scrape_configs[7].relabel_configs[1].action | string | `"keep_if_equal"` | | -| config.scrape_configs[7].relabel_configs[1].source_labels[0] | string | `"__meta_kubernetes_pod_annotation_prometheus_io_port"` | | -| config.scrape_configs[7].relabel_configs[1].source_labels[1] | string | `"__meta_kubernetes_pod_container_port_number"` | | -| config.scrape_configs[7].relabel_configs[2].action | string | `"keep"` | | -| config.scrape_configs[7].relabel_configs[2].regex | bool | `true` | | -| config.scrape_configs[7].relabel_configs[2].source_labels[0] | string | `"__meta_kubernetes_pod_annotation_prometheus_io_scrape"` | | -| config.scrape_configs[7].relabel_configs[3].action | string | `"replace"` | | -| config.scrape_configs[7].relabel_configs[3].regex | string | `"(.+)"` | | -| config.scrape_configs[7].relabel_configs[3].source_labels[0] | string | `"__meta_kubernetes_pod_annotation_prometheus_io_path"` | | -| config.scrape_configs[7].relabel_configs[3].target_label | string | `"__metrics_path__"` | | -| config.scrape_configs[7].relabel_configs[4].action | string | `"replace"` | | -| config.scrape_configs[7].relabel_configs[4].regex | string | `"([^:]+)(?::\\d+)?;(\\d+)"` | | -| config.scrape_configs[7].relabel_configs[4].replacement | string | `"$1:$2"` | | -| config.scrape_configs[7].relabel_configs[4].source_labels[0] | string | `"__address__"` | | -| config.scrape_configs[7].relabel_configs[4].source_labels[1] | string | `"__meta_kubernetes_pod_annotation_prometheus_io_port"` | | -| config.scrape_configs[7].relabel_configs[4].target_label | string | `"__address__"` | | -| config.scrape_configs[7].relabel_configs[5].action | string | `"labelmap"` | | -| config.scrape_configs[7].relabel_configs[5].regex | string | `"__meta_kubernetes_pod_label_(.+)"` | | -| config.scrape_configs[7].relabel_configs[6].source_labels[0] | string | `"__meta_kubernetes_pod_name"` | | -| config.scrape_configs[7].relabel_configs[6].target_label | string | `"pod"` | | -| config.scrape_configs[7].relabel_configs[7].source_labels[0] | string | `"__meta_kubernetes_pod_container_name"` | | -| config.scrape_configs[7].relabel_configs[7].target_label | string | `"container"` | | -| config.scrape_configs[7].relabel_configs[8].source_labels[0] | string | `"__meta_kubernetes_namespace"` | | -| config.scrape_configs[7].relabel_configs[8].target_label | string | `"namespace"` | | -| config.scrape_configs[7].relabel_configs[9].action | string | `"replace"` | | -| config.scrape_configs[7].relabel_configs[9].source_labels[0] | string | `"__meta_kubernetes_pod_node_name"` | | -| config.scrape_configs[7].relabel_configs[9].target_label | string | `"node"` | | -| configMap | string | `""` | | -| containerWorkingDir | string | `"/"` | | -| deployment.enabled | bool | `true` | | -| deployment.strategy | object | `{}` | | -| env | list | `[]` | Additional environment variables (ex.: secret tokens, flags) https://github.com/VictoriaMetrics/VictoriaMetrics#environment-variables | -| envFrom | list | `[]` | | -| extraArgs."envflag.enable" | string | `"true"` | | -| extraArgs."envflag.prefix" | string | `"VM_"` | | -| extraArgs.loggerFormat | string | `"json"` | | -| extraContainers | list | `[]` | | -| extraHostPathMounts | list | `[]` | | -| extraLabels | object | `{}` | | -| extraObjects | list | `[]` | | -| extraScrapeConfigs | list | `[]` | Extra scrape configs that will be appended to `config` | -| extraVolumeMounts | list | `[]` | | -| extraVolumes | list | `[]` | | -| fullnameOverride | string | `""` | | -| image.pullPolicy | string | `"IfNotPresent"` | | -| image.repository | string | `"victoriametrics/vmagent"` | | -| image.tag | string | `""` | | -| imagePullSecrets | list | `[]` | | -| ingress.annotations | object | `{}` | | -| ingress.enabled | bool | `false` | | -| ingress.extraLabels | object | `{}` | | -| ingress.hosts | list | `[]` | | -| ingress.pathType | string | `"Prefix"` | pathType is only for k8s >= 1.1= | -| ingress.tls | list | `[]` | | -| initContainers | list | `[]` | | -| license | object | `{"key":"","secret":{"key":"","name":""}}` | Enterprise license key configuration for VictoriaMetrics enterprise. Required only for VictoriaMetrics enterprise. Documentation - https://docs.victoriametrics.com/enterprise.html, for more information, visit https://victoriametrics.com/products/enterprise/ . To request a trial license, go to https://victoriametrics.com/products/enterprise/trial/ Supported starting from VictoriaMetrics v1.94.0 | -| license.key | string | `""` | License key | -| license.secret | object | `{"key":"","name":""}` | Use existing secret with license key | -| license.secret.key | string | `""` | Key in secret with license key | -| license.secret.name | string | `""` | Existing secret name | -| multiTenantUrls | list | `[]` | | -| nameOverride | string | `""` | | -| nodeSelector | object | `{}` | | -| persistence.accessModes[0] | string | `"ReadWriteOnce"` | | -| persistence.annotations | object | `{}` | | -| persistence.enabled | bool | `false` | | -| persistence.existingClaim | string | `""` | | -| persistence.extraLabels | object | `{}` | | -| persistence.matchLabels | object | `{}` | Bind Persistent Volume by labels. Must match all labels of targeted PV. | -| persistence.size | string | `"10Gi"` | | -| podAnnotations | object | `{}` | | -| podDisruptionBudget.enabled | bool | `false` | | -| podDisruptionBudget.labels | object | `{}` | | -| podLabels | object | `{}` | | -| podSecurityContext | object | `{}` | | -| priorityClassName | string | `""` | priority class to be assigned to the pod(s) | -| rbac.annotations | object | `{}` | | -| rbac.create | bool | `true` | | -| rbac.extraLabels | object | `{}` | | -| rbac.namespaced | bool | `false` | if true and `rbac.enabled`, will deploy a Role/Rolebinding instead of a ClusterRole/ClusterRoleBinding | -| rbac.pspEnabled | bool | `true` | | -| remoteWriteUrls | list | `[]` | | -| replicaCount | int | `1` | | -| resources | object | `{}` | | -| securityContext | object | `{}` | | -| service.annotations | object | `{}` | | -| service.clusterIP | string | `""` | | -| service.enabled | bool | `false` | | -| service.externalIPs | list | `[]` | | -| service.extraLabels | object | `{}` | | -| service.loadBalancerIP | string | `""` | | -| service.loadBalancerSourceRanges | list | `[]` | | -| service.servicePort | int | `8429` | | -| service.type | string | `"ClusterIP"` | | -| serviceAccount.annotations | object | `{}` | | -| serviceAccount.create | bool | `true` | | -| serviceAccount.name | string | `nil` | | -| serviceMonitor.annotations | object | `{}` | | -| serviceMonitor.enabled | bool | `false` | | -| serviceMonitor.extraLabels | object | `{}` | | -| serviceMonitor.relabelings | list | `[]` | | -| statefulset.clusterMode | bool | `false` | create cluster of vmagents. See https://docs.victoriametrics.com/vmagent.html#scraping-big-number-of-targets available since 1.77.2 version https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.77.2 | -| statefulset.enabled | bool | `false` | | -| statefulset.replicationFactor | int | `1` | replication factor for vmagent in cluster mode | -| statefulset.updateStrategy | object | `{}` | | -| tolerations | list | `[]` | | -| topologySpreadConstraints | list | `[]` | | diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/README.md.gotmpl b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/README.md.gotmpl deleted file mode 100644 index 1ff4d25c8..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/README.md.gotmpl +++ /dev/null @@ -1,97 +0,0 @@ -# Helm Chart For Victoria Metrics Agent. - -{{ template "chart.typeBadge" . }} {{ template "chart.versionBadge" . }} -[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/victoriametrics)](https://artifacthub.io/packages/helm/victoriametrics/victoria-metrics-agent) -[![Slack](https://img.shields.io/badge/join%20slack-%23victoriametrics-brightgreen.svg)](https://slack.victoriametrics.com/) - -{{ template "chart.description" . }} - -## Prerequisites - -* Install the follow packages: ``git``, ``kubectl``, ``helm``, ``helm-docs``. See this [tutorial](../../REQUIREMENTS.md). - -## How to install - -Access a Kubernetes cluster. - -Add a chart helm repository with follow commands: - -```console -helm repo add vm https://victoriametrics.github.io/helm-charts/ - -helm repo update -``` - -List versions of ``vm/victoria-metrics-agent`` chart available to installation: - -```console -helm search repo vm/victoria-metrics-agent -l -``` - -Export default values of ``victoria-metrics-agent`` chart to file ``values.yaml``: - -```console -helm show values vm/victoria-metrics-agent > values.yaml -``` - -Change the values according to the need of the environment in ``values.yaml`` file. - -Test the installation with command: - -```console -helm install vmagent vm/victoria-metrics-agent -f values.yaml -n NAMESPACE --debug --dry-run -``` - -Install chart with command: - -```console -helm install vmagent vm/victoria-metrics-agent -f values.yaml -n NAMESPACE -``` - -Get the pods lists by running this commands: - -```console -kubectl get pods -A | grep 'agent' -``` - -Get the application by running this command: - -```console -helm list -f vmagent -n NAMESPACE -``` - -See the history of versions of ``vmagent`` application with command. - -```console -helm history vmagent -n NAMESPACE -``` - -## How to uninstall - -Remove application with command. - -```console -helm uninstall vmagent -n NAMESPACE -``` - -## Documentation of Helm Chart - -Install ``helm-docs`` following the instructions on this [tutorial](../../REQUIREMENTS.md). - -Generate docs with ``helm-docs`` command. - -```bash -cd charts/victoria-metrics-agent - -helm-docs -``` - -The markdown generation is entirely go template driven. The tool parses metadata from charts and generates a number of sub-templates that can be referenced in a template file (by default ``README.md.gotmpl``). If no template file is provided, the tool has a default internal template that will generate a reasonably formatted README. - -## Parameters - -The following tables lists the configurable parameters of the chart and their default values. - -Change the values according to the need of the environment in ``victoria-metrics-agent/values.yaml`` file. - -{{ template "chart.valuesTable" . }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/RELEASE_NOTES.md b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/RELEASE_NOTES.md deleted file mode 100644 index 97a8e7604..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/RELEASE_NOTES.md +++ /dev/null @@ -1,9 +0,0 @@ -# Release notes for version 0.9.17 - -**Release date:** 2024-02-01 - -![AppVersion: v1.97.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.97.1&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- bump version of VM components to [v1.97.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.97.1) - diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/_helpers.tpl b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/_helpers.tpl deleted file mode 100644 index 6f0be4786..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/_helpers.tpl +++ /dev/null @@ -1,148 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "chart.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "chart.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "chart.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Common labels -*/}} -{{- define "chart.labels" -}} -helm.sh/chart: {{ include "chart.chart" . }} -{{ include "chart.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end -}} - -{{/* -Selector labels -*/}} -{{- define "chart.selectorLabels" -}} -app.kubernetes.io/name: {{ include "chart.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} - -{{/* -Create the name of the service account to use -*/}} -{{- define "chart.serviceAccountName" -}} -{{- if .Values.serviceAccount.create -}} - {{ default (include "chart.fullname" .) .Values.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* -Defines the name of configuration map -*/}} -{{- define "chart.configname" -}} -{{- if .Values.configMap -}} -{{- .Values.configMap -}} -{{- else -}} -{{- include "chart.fullname" . -}}-config -{{- end -}} -{{- end -}} - -{{- define "split-host-port" -}} -{{- $hp := split ":" . -}} -{{- printf "%s" $hp._1 -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for ingress. -*/}} -{{- define "vmagent.ingress.apiVersion" -}} - {{- if and (.Capabilities.APIVersions.Has "networking.k8s.io/v1") -}} - {{- print "networking.k8s.io/v1" -}} - {{- else if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" -}} - {{- print "networking.k8s.io/v1beta1" -}} - {{- else -}} - {{- print "extensions/v1beta1" -}} - {{- end -}} -{{- end -}} - -{{/* -Return if ingress is stable. -*/}} -{{- define "vmagent.ingress.isStable" -}} - {{- eq (include "vmagent.ingress.apiVersion" .) "networking.k8s.io/v1" -}} -{{- end -}} - -{{/* -Return if ingress supports ingressClassName. -*/}} -{{- define "vmagent.ingress.supportsIngressClassName" -}} - {{- or (eq (include "vmagent.ingress.isStable" .) "true") (and (eq (include "vmagent.ingress.apiVersion" .) "networking.k8s.io/v1beta1")) -}} -{{- end -}} - -{{/* -Return if ingress supports pathType. -*/}} -{{- define "vmagent.ingress.supportsPathType" -}} - {{- or (eq (include "vmagent.ingress.isStable" .) "true") (and (eq (include "vmagent.ingress.apiVersion" .) "networking.k8s.io/v1beta1")) -}} -{{- end -}} - -{{/* -Return license flag if necessary. -*/}} -{{- define "chart.license.flag" -}} -{{- if .Values.license.key -}} --license={{ .Values.license.key }} -{{- end }} -{{- if and .Values.license.secret.name .Values.license.secret.key -}} --licenseFile=/etc/vm-license-key/{{ .Values.license.secret.key }} -{{- end -}} -{{- end -}} - - -{{/* -Return license volume mount -*/}} -{{- define "chart.license.volume" -}} -{{- if and .Values.license.secret.name .Values.license.secret.key -}} -- name: license-key - secret: - secretName: {{ .Values.license.secret.name }} -{{- end -}} -{{- end -}} - -{{/* -Return license volume mount for container -*/}} -{{- define "chart.license.mount" -}} -{{- if and .Values.license.secret.name .Values.license.secret.key -}} -- name: license-key - mountPath: /etc/vm-license-key - readOnly: true -{{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/clusterrole.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/clusterrole.yaml deleted file mode 100644 index 5151d1aaf..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/clusterrole.yaml +++ /dev/null @@ -1,50 +0,0 @@ -{{- if .Values.rbac.create -}} -{{- $namespaced := .Values.rbac.namespaced }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: {{ ternary "Role" "ClusterRole" $namespaced }} -metadata: - name: {{ template "chart.fullname" . }}{{- ternary "" "-clusterrole" $namespaced }} - {{- if not $namespaced }} - namespace: {{ .Release.Namespace }} - {{- end }} - labels: - {{- include "chart.labels" . | nindent 4 }} -{{- with .Values.rbac.extraLabels }} -{{ toYaml . | indent 4}} -{{- end }} - {{- with .Values.rbac.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -rules: -- apiGroups: - - discovery.k8s.io - resources: - - endpointslices - verbs: ["get", "list", "watch"] -- apiGroups: [""] - resources: - - nodes - - nodes/proxy - - nodes/metrics - - services - - endpoints - - pods - verbs: ["get", "list", "watch"] -- apiGroups: - - extensions - - networking.k8s.io - resources: - - ingresses - verbs: ["get", "list", "watch"] -{{- if not $namespaced }} -- nonResourceURLs: ["/metrics"] - verbs: ["get"] -{{- end }} -{{- if and .Values.rbac.pspEnabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -- apiGroups: ['extensions'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: [{{ template "chart.fullname" . }}] -{{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/clusterrolebinding.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/clusterrolebinding.yaml deleted file mode 100644 index 016aa27c9..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/clusterrolebinding.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{- if .Values.rbac.create -}} -{{- $namespaced := .Values.rbac.namespaced }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: {{ ternary "RoleBinding" "ClusterRoleBinding" $namespaced }} -metadata: - name: {{ template "chart.fullname" . }}{{- ternary "" "-clusterrolebinding" $namespaced }} - {{- if not $namespaced }} - namespace: {{ .Release.Namespace }} - {{- end }} - labels: - {{- include "chart.labels" . | nindent 4 }} -{{- with .Values.rbac.extraLabels }} -{{ toYaml . | indent 4}} -{{- end }} - {{- with .Values.rbac.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: {{ ternary "Role" "ClusterRole" $namespaced }} - name: {{ template "chart.fullname" . }}{{- ternary "" "-clusterrole" $namespaced }} -subjects: - - kind: ServiceAccount - name: {{ template "chart.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/configmap.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/configmap.yaml deleted file mode 100644 index 086cd62b1..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/configmap.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if eq .Values.configMap "" }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "chart.configname" .}} - namespace: {{ .Release.Namespace }} - labels: {{- include "chart.labels" . | nindent 4 }} -data: - scrape.yml: | - {{- range $k, $v := .Values.config }} - {{- if and (eq $k "scrape_configs") ($.Values.extraScrapeConfigs) }} - {{ dict $k (concat $v $.Values.extraScrapeConfigs) | toYaml | nindent 4 }} - {{- else }} - {{ dict $k $v | toYaml | nindent 4 }} - {{- end }} - {{- end }} -{{- end }} \ No newline at end of file diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/deployment.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/deployment.yaml deleted file mode 100644 index 8e4ad2c81..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/deployment.yaml +++ /dev/null @@ -1,203 +0,0 @@ -{{- if .Values.deployment.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "chart.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "chart.labels" . | nindent 4 }} -{{- with .Values.extraLabels }} -{{ toYaml . | indent 4 }} -{{- end }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.replicaCount }} - {{- with .Values.deployment.strategy }} - strategy: - {{- toYaml . | nindent 4 }} - {{- end }} - selector: - matchLabels: - {{- include "chart.selectorLabels" . | nindent 6 }} - template: - metadata: - labels: - {{- include "chart.selectorLabels" . | nindent 8 }} -{{- with .Values.extraLabels }} -{{ toYaml . | indent 8 }} -{{- end }} -{{- with .Values.podLabels }} -{{ toYaml . | indent 8 }} -{{- end }} - annotations: - checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} - {{- range $key, $value := .Values.podAnnotations }} - {{ $key }}: {{ $value | quote }} - {{- end }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - serviceAccountName: {{ include "chart.serviceAccountName" . }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - {{- with .Values.initContainers }} - initContainers: - {{- toYaml . | nindent 8 }} - {{- end }} - containers: - - name: {{ .Chart.Name }} - securityContext: - {{- toYaml .Values.securityContext | nindent 12 }} - image: "{{ .Values.image.repository }}:{{ default .Chart.AppVersion .Values.image.tag }}" - workingDir: {{ .Values.containerWorkingDir }} - args: - - -promscrape.config=/config/scrape.yml - - -remoteWrite.tmpDataPath=/tmpData - {{- range .Values.remoteWriteUrls }} - - -remoteWrite.url={{ . }} - {{- end }} - {{- range .Values.multiTenantUrls }} - - -remoteWrite.multitenantURL={{ . }} - {{- end }} - {{- range $key, $value := .Values.extraArgs }} - - -{{ $key }}={{ $value }} - {{- end }} - {{- with (include "chart.license.flag" .) }} - - {{ . }} - {{- end }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - name: http - containerPort: 8429 - {{- if .Values.extraArgs.graphiteListenAddr }} - - name: graphite-tcp - protocol: TCP - containerPort: {{ include "split-host-port" .Values.extraArgs.graphiteListenAddr }} - {{- end }} - {{- if .Values.extraArgs.graphiteListenAddr }} - - name: graphite-udp - protocol: UDP - containerPort: {{ include "split-host-port" .Values.extraArgs.graphiteListenAddr }} - {{- end }} - {{- if .Values.extraArgs.influxListenAddr }} - - name: influx-tcp - protocol: TCP - containerPort: {{ include "split-host-port" .Values.extraArgs.influxListenAddr }} - {{- end }} - {{- if .Values.extraArgs.influxListenAddr }} - - name: influx-udp - protocol: UDP - containerPort: {{ include "split-host-port" .Values.extraArgs.influxListenAddr }} - {{- end }} - {{- if .Values.extraArgs.opentsdbHTTPListenAddr }} - - name: opentsdbhttp - protocol: TCP - containerPort: {{ include "split-host-port" .Values.extraArgs.opentsdbHTTPListenAddr }} - {{- end }} - {{- if .Values.extraArgs.opentsdbListenAddr }} - - name: opentsdb-tcp - protocol: TCP - containerPort: {{ include "split-host-port" .Values.extraArgs.opentsdbListenAddr }} - {{- end }} - {{- if .Values.extraArgs.opentsdbListenAddr }} - - name: opentsdb-udp - protocol: UDP - containerPort: {{ include "split-host-port" .Values.extraArgs.opentsdbListenAddr }} - {{- end }} - {{- if .Values.envFrom }} - envFrom: - {{- with .Values.envFrom -}} - {{ toYaml . | nindent 12 }} - {{- end }} - {{- end }} - {{- with .Values.env }} - env: {{ toYaml . | nindent 10 }} - {{- end }} - readinessProbe: - httpGet: - {{- if index .Values.extraArgs "http.pathPrefix" }} - path: {{ trimSuffix "/" (index .Values.extraArgs "http.pathPrefix") }}/health - {{- else }} - path: /health - {{- end }} - port: http - initialDelaySeconds: 5 - periodSeconds: 15 - livenessProbe: - tcpSocket: - port: http - initialDelaySeconds: 5 - periodSeconds: 15 - timeoutSeconds: 5 - volumeMounts: - - name: tmpdata - mountPath: /tmpData - - name: config - mountPath: /config - {{- range .Values.extraHostPathMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- with .Values.extraVolumeMounts }} - {{- toYaml . | nindent 12 }} - {{- end }} - {{- include "chart.license.mount" . | nindent 12 }} - resources: - {{- toYaml .Values.resources | nindent 12 }} - {{- with .Values.extraContainers }} - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.topologySpreadConstraints }} - topologySpreadConstraints: - {{- range $constraint := . }} - - {{ toYaml $constraint | nindent 8 | trim }} - {{- if not $constraint.labelSelector }} - labelSelector: - matchLabels: - {{- include "chart.selectorLabels" $ | nindent 12 }} - {{- end }} - {{- end }} - {{- end }} - volumes: - - name: tmpdata - {{- if .Values.persistence.enabled }} - persistentVolumeClaim: - claimName: {{ .Values.persistence.existingClaim | default (include "chart.fullname" .) }} - {{- else }} - emptyDir: {} - {{- end }} - - name: config - configMap: - name: {{ include "chart.configname" .}} - {{- range .Values.extraHostPathMounts }} - - name: {{ .name }} - hostPath: - path: {{ .hostPath }} - {{- end }} - {{- with .Values.extraVolumes }} - {{- toYaml . | nindent 8 }} - {{- end }} - {{- include "chart.license.volume" . | nindent 8 }} - {{- if .Values.priorityClassName }} - priorityClassName: {{ .Values.priorityClassName }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/extra-objects.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/extra-objects.yaml deleted file mode 100644 index a9bb3b6ba..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/extra-objects.yaml +++ /dev/null @@ -1,4 +0,0 @@ -{{ range .Values.extraObjects }} ---- -{{ tpl (toYaml .) $ }} -{{ end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/ingress.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/ingress.yaml deleted file mode 100644 index 88398ed87..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/ingress.yaml +++ /dev/null @@ -1,50 +0,0 @@ -{{- if .Values.ingress.enabled }} -{{- $ingressApiIsStable := eq (include "vmagent.ingress.isStable" .) "true" -}} -{{- $ingressSupportsIngressClassName := eq (include "vmagent.ingress.supportsIngressClassName" .) "true" -}} -{{- $ingressSupportsPathType := eq (include "vmagent.ingress.supportsPathType" .) "true" -}} -{{- $servicePort := .Values.service.servicePort -}} -{{- $ingressPathType := .Values.ingress.pathType -}} -apiVersion: {{ include "vmagent.ingress.apiVersion" . }} -kind: Ingress -metadata: -{{- if .Values.ingress.annotations }} - annotations: -{{ toYaml .Values.ingress.annotations | indent 4 }} -{{- end }} - labels: - {{- include "chart.labels" . | nindent 4 }} - {{ with .Values.ingress.extraLabels }} -{{ toYaml . | indent 4 }} - {{ end }} - name: {{ template "chart.fullname" . }} - namespace: {{ .Release.Namespace }} -spec: - {{- if and $ingressSupportsIngressClassName .Values.ingress.ingressClassName }} - ingressClassName: {{ .Values.ingress.ingressClassName }} - {{- end }} - rules: - {{- $serviceName := include "chart.fullname" . }} - {{- range .Values.ingress.hosts }} - - host: {{ .name }} - http: - paths: - - path: {{ .path }} - {{- if $ingressSupportsPathType }} - pathType: {{ $ingressPathType }} - {{- end }} - backend: - {{- if $ingressApiIsStable }} - service: - name: {{ $serviceName }} - port: - number: {{ $servicePort }} - {{- else }} - serviceName: {{ $serviceName }} - servicePort: {{ .port | default "http"}} - {{- end }} - {{- end -}} -{{- if .Values.ingress.tls }} - tls: -{{ toYaml .Values.ingress.tls | indent 4 }} -{{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/pdb.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/pdb.yaml deleted file mode 100644 index aa594eaf5..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/pdb.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{- if .Values.podDisruptionBudget.enabled }} -{{- if .Capabilities.APIVersions.Has "policy/v1/PodDisruptionBudget" }} -apiVersion: policy/v1 -{{- else -}} -apiVersion: policy/v1beta1 -{{- end }} -kind: PodDisruptionBudget -metadata: - name: {{ include "chart.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "chart.labels" . | nindent 4 }} - {{- with .Values.podDisruptionBudget.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: -{{- if .Values.podDisruptionBudget.minAvailable }} - minAvailable: {{ .Values.podDisruptionBudget.minAvailable }} -{{- end }} -{{- if .Values.podDisruptionBudget.maxUnavailable }} - maxUnavailable: {{ .Values.podDisruptionBudget.maxUnavailable }} -{{- end }} - selector: - matchLabels: - {{- include "chart.selectorLabels" . | nindent 6 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/podsecuritypolicy.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/podsecuritypolicy.yaml deleted file mode 100644 index 3964fede4..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/podsecuritypolicy.yaml +++ /dev/null @@ -1,42 +0,0 @@ -{{- if and .Values.rbac.pspEnabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ include "chart.fullname" . }} - labels: - {{- include "chart.labels" . | nindent 4 }} -{{- with .Values.rbac.extraLabels }} -{{ toYaml . | indent 4}} -{{- end }} - annotations: - seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default' - seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' -{{- with .Values.rbac.annotations }} -{{ toYaml . | indent 4}} -{{- end }} -spec: - privileged: false - allowPrivilegeEscalation: false - requiredDropCapabilities: - # Default set from Docker, with DAC_OVERRIDE and CHOWN - - ALL - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'secret' - - 'downwardAPI' - - 'persistentVolumeClaim' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/pvc.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/pvc.yaml deleted file mode 100644 index b099f68c7..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/pvc.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) .Values.deployment.enabled }} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ include "chart.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "chart.labels" . | nindent 4 }} - {{- with .Values.persistence.extraLabels }} - {{- toYaml . | nindent 4}} - {{- end }} - {{- with .Values.persistence.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - accessModes: - {{- range .Values.persistence.accessModes }} - - {{ . | quote }} - {{- end }} - resources: - requests: - storage: {{ .Values.persistence.size | quote }} - {{- if .Values.persistence.storageClassName }} - storageClassName: {{ .Values.persistence.storageClassName }} - {{- end -}} - {{- with .Values.persistence.matchLabels }} - selector: - matchLabels: - {{- toYaml . | nindent 6 }} - {{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/service-monitor.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/service-monitor.yaml deleted file mode 100644 index bcf6463c7..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/service-monitor.yaml +++ /dev/null @@ -1,44 +0,0 @@ -{{- if .Values.serviceMonitor.enabled -}} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - {{- if .Values.serviceMonitor.annotations }} - annotations: -{{ toYaml .Values.serviceMonitor.annotations | indent 4 }} - {{- end }} - labels: - {{- include "chart.labels" . | nindent 4 }} - {{- with .Values.serviceMonitor.extraLabels -}} - {{ toYaml . | nindent 4 }} - {{- end }} - name: {{ template "chart.fullname" . }} - {{- if .Values.serviceMonitor.namespace }} - namespace: {{ .Values.serviceMonitor.namespace }} - {{- end }} -spec: - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - selector: - matchLabels: - {{- include "chart.selectorLabels" . | nindent 6 }} - endpoints: - - port: http - {{- if .Values.serviceMonitor.scheme }} - scheme: {{ .Values.serviceMonitor.scheme }} - {{- end }} - {{- if .Values.serviceMonitor.interval }} - interval: {{ .Values.serviceMonitor.interval }} - {{- end }} - {{- if .Values.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.serviceMonitor.scrapeTimeout }} - {{- end }} - {{- with .Values.serviceMonitor.tlsConfig }} - tlsConfig: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.serviceMonitor.relabelings }} - relabelings: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/service.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/service.yaml deleted file mode 100644 index 10d966908..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/service.yaml +++ /dev/null @@ -1,92 +0,0 @@ -{{- if and .Values.service.enabled -}} -apiVersion: v1 -kind: Service -metadata: -{{- with .Values.service.annotations }} - annotations: -{{ toYaml . | indent 4}} -{{- end }} - labels: - {{- include "chart.labels" . | nindent 4 }} -{{- with .Values.service.extraLabels }} -{{ toYaml . | indent 4}} -{{- end }} - name: {{ template "chart.fullname" . }} - namespace: {{ .Release.Namespace }} -spec: -{{- if .Values.service.clusterIP }} - clusterIP: {{ .Values.service.clusterIP }} -{{- end }} -{{- if .Values.service.externalIPs }} - externalIPs: -{{ toYaml .Values.service.externalIPs | indent 4 }} -{{- end }} -{{- if .Values.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.service.loadBalancerIP }} -{{- end }} -{{- if .Values.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- range $cidr := .Values.service.loadBalancerSourceRanges }} - - {{ $cidr }} - {{- end }} -{{- end }} - ports: - - name: http - port: {{ .Values.service.servicePort }} - protocol: TCP - targetPort: http - {{- with .Values.service.nodePort }} - nodePort: {{ . }} - {{- end }} -{{- if .Values.extraArgs.graphiteListenAddr }} - - name: graphite-tcp - protocol: TCP - port: {{ include "split-host-port" .Values.extraArgs.graphiteListenAddr }} - targetPort: graphite-tcp -{{- end }} -{{- if .Values.extraArgs.graphiteListenAddr }} - - name: graphite-udp - protocol: UDP - port: {{ include "split-host-port" .Values.extraArgs.graphiteListenAddr }} - targetPort: graphite-udp -{{- end }} -{{- if .Values.extraArgs.influxListenAddr }} - - name: influx-tcp - protocol: TCP - port: {{ include "split-host-port" .Values.extraArgs.influxListenAddr }} - targetPort: influx-tcp -{{- end }} -{{- if .Values.extraArgs.influxListenAddr }} - - name: influx-udp - protocol: UDP - port: {{ include "split-host-port" .Values.extraArgs.influxListenAddr }} - targetPort: influx-udp -{{- end }} -{{- if .Values.extraArgs.opentsdbHTTPListenAddr }} - - name: opentsdbhttp - port: {{ include "split-host-port" .Values.extraArgs.opentsdbHTTPListenAddr }} - targetPort: opentsdbhttp -{{- end }} -{{- if .Values.extraArgs.opentsdbListenAddr }} - - name: opentsdb-udp - protocol: UDP - port: {{ include "split-host-port" .Values.extraArgs.opentsdbListenAddr }} - targetPort: opentsdb-udp -{{- end }} -{{- if .Values.extraArgs.opentsdbListenAddr }} - - name: opentsdb-tcp - protocol: TCP - port: {{ include "split-host-port" .Values.extraArgs.opentsdbListenAddr }} - targetPort: opentsdb-tcp -{{- end }} - - selector: - {{- include "chart.selectorLabels" . | nindent 4 }} - type: "{{ .Values.service.type }}" - {{- with .Values.service.healthCheckNodePort }} - healthCheckNodePort: {{ . }} - {{- end }} - {{- with .Values.service.externalTrafficPolicy }} - externalTrafficPolicy: {{ . }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/serviceaccount.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/serviceaccount.yaml deleted file mode 100644 index 882ed1242..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/serviceaccount.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "chart.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "chart.labels" . | nindent 4 }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/statefulset.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/statefulset.yaml deleted file mode 100644 index cddbd0531..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/templates/statefulset.yaml +++ /dev/null @@ -1,246 +0,0 @@ -{{- if .Values.statefulset.enabled }} -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ include "chart.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "chart.labels" . | nindent 4 }} -{{- with .Values.extraLabels }} -{{ toYaml . | indent 4 }} -{{- end }} - {{- with .Values.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.replicaCount }} - serviceName: {{ include "chart.fullname" . }} - {{- if .Values.statefulset.updateStrategy }} - updateStrategy: - {{- toYaml .Values.statefulset.updateStrategy | nindent 4 }} - {{- end }} - selector: - matchLabels: - {{- include "chart.selectorLabels" . | nindent 6 }} - template: - metadata: - labels: - {{- include "chart.selectorLabels" . | nindent 8 }} -{{- with .Values.extraLabels }} -{{ toYaml . | indent 8 }} -{{- end }} -{{- with .Values.podLabels }} -{{ toYaml . | indent 8 }} -{{- end }} - annotations: - checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} - {{- range $key, $value := .Values.podAnnotations }} - {{ $key }}: {{ $value | quote }} - {{- end }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - serviceAccountName: {{ include "chart.serviceAccountName" . }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - {{- with .Values.initContainers }} - initContainers: - {{- toYaml . | nindent 8 }} - {{- end }} - containers: - - name: {{ .Chart.Name }} - securityContext: - {{- toYaml .Values.securityContext | nindent 12 }} - image: "{{ .Values.image.repository }}:{{ default .Chart.AppVersion .Values.image.tag }}" - workingDir: {{ .Values.containerWorkingDir }} - args: - - -promscrape.config=/config/scrape.yml - - -remoteWrite.tmpDataPath=/tmpData - {{- if .Values.statefulset.clusterMode }} - - -promscrape.cluster.membersCount={{ .Values.replicaCount }} - - -promscrape.cluster.replicationFactor={{ .Values.statefulset.replicationFactor }} - - -promscrape.cluster.memberNum=$(POD_NAME) - {{- end }} - {{- range .Values.remoteWriteUrls }} - - -remoteWrite.url={{ . }} - {{- end }} - {{- range .Values.multiTenantUrls }} - - -remoteWrite.multitenantURL={{ . }} - {{- end }} - {{- range $key, $value := .Values.extraArgs }} - - -{{ $key }}={{ $value }} - {{- end }} - {{- with (include "chart.license.flag" .) }} - - {{ . }} - {{- end }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - name: http - containerPort: 8429 - {{- if .Values.extraArgs.graphiteListenAddr }} - - name: graphite-tcp - protocol: TCP - containerPort: {{ include "split-host-port" .Values.extraArgs.graphiteListenAddr }} - {{- end }} - {{- if .Values.extraArgs.graphiteListenAddr }} - - name: graphite-udp - protocol: UDP - containerPort: {{ include "split-host-port" .Values.extraArgs.graphiteListenAddr }} - {{- end }} - {{- if .Values.extraArgs.influxListenAddr }} - - name: influx-tcp - protocol: TCP - containerPort: {{ include "split-host-port" .Values.extraArgs.influxListenAddr }} - {{- end }} - {{- if .Values.extraArgs.influxListenAddr }} - - name: influx-udp - protocol: UDP - containerPort: {{ include "split-host-port" .Values.extraArgs.influxListenAddr }} - {{- end }} - {{- if .Values.extraArgs.opentsdbHTTPListenAddr }} - - name: opentsdbhttp - protocol: TCP - containerPort: {{ include "split-host-port" .Values.extraArgs.opentsdbHTTPListenAddr }} - {{- end }} - {{- if .Values.extraArgs.opentsdbListenAddr }} - - name: opentsdb-tcp - protocol: TCP - containerPort: {{ include "split-host-port" .Values.extraArgs.opentsdbListenAddr }} - {{- end }} - {{- if .Values.extraArgs.opentsdbListenAddr }} - - name: opentsdb-udp - protocol: UDP - containerPort: {{ include "split-host-port" .Values.extraArgs.opentsdbListenAddr }} - {{- end }} - {{- if .Values.envFrom }} - envFrom: - {{- with .Values.envFrom -}} - {{ toYaml . | nindent 12 }} - {{- end }} - {{- end }} - {{- if or .Values.env .Values.statefulset.clusterMode}} - env: - {{- if .Values.statefulset.clusterMode}} - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - {{- end -}} - {{- with .Values.env }} - {{ toYaml .| nindent 12 }} - {{- end }} - {{- end }} - readinessProbe: - httpGet: - {{- if index .Values.extraArgs "http.pathPrefix" }} - path: {{ trimSuffix "/" (index .Values.extraArgs "http.pathPrefix") }}/health - {{- else }} - path: /health - {{- end }} - port: http - initialDelaySeconds: 5 - periodSeconds: 15 - livenessProbe: - tcpSocket: - port: http - initialDelaySeconds: 5 - periodSeconds: 15 - timeoutSeconds: 5 - volumeMounts: - - name: tmpdata - mountPath: /tmpData - - name: config - mountPath: /config - {{- range .Values.extraHostPathMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- with .Values.extraVolumeMounts }} - {{- toYaml . | nindent 12 }} - {{- end }} - resources: - {{- toYaml .Values.resources | nindent 12 }} - {{- with .Values.extraContainers }} - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.topologySpreadConstraints }} - topologySpreadConstraints: - {{- range $constraint := . }} - - {{ toYaml $constraint | nindent 8 | trim }} - {{- if not $constraint.labelSelector }} - labelSelector: - matchLabels: - {{- include "chart.selectorLabels" $ | nindent 12 }} - {{- end }} - {{- end }} - {{- end }} - volumes: - {{- if not .Values.persistence.enabled }} - - name: tmpdata - emptyDir: {} - {{- else if .Values.persistence.existingClaim }} - - name: tmpdata - persistentVolumeClaim: - claimName: {{ .Values.persistence.existingClaim }} - {{- end }} - - name: config - configMap: - name: {{ include "chart.configname" .}} - {{- range .Values.extraHostPathMounts }} - - name: {{ .name }} - hostPath: - path: {{ .hostPath }} - {{- end }} - {{- with .Values.extraVolumes }} - {{- toYaml . | nindent 8 }} - {{- end }} - {{- if .Values.priorityClassName }} - priorityClassName: {{ .Values.priorityClassName }} - {{- end }} - {{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }} - volumeClaimTemplates: - - metadata: - name: tmpdata - {{- with .Values.persistence.extraLabels }} - labels: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.persistence.annotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - accessModes: - {{- range .Values.persistence.accessModes }} - - {{ . | quote }} - {{- end }} - {{- if .Values.persistence.storageClassName }} - storageClassName: {{ .Values.persistence.storageClassName }} - {{- end }} - {{- with .Values.persistence.matchLabels }} - selector: - matchLabels: - {{- toYaml . | nindent 10 }} - {{- end }} - resources: - requests: - storage: {{ .Values.persistence.size | quote }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/values.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/values.yaml deleted file mode 100644 index 06f656ffe..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-agent/values.yaml +++ /dev/null @@ -1,593 +0,0 @@ -# Default values for victoria-metrics-agent. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -replicaCount: 1 - -# ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/ -deployment: - enabled: true - # ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy - strategy: {} - # rollingUpdate: - # maxSurge: 25% - # maxUnavailable: 25% - # type: RollingUpdate - -# ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/ -statefulset: - enabled: false - # -- create cluster of vmagents. See https://docs.victoriametrics.com/vmagent.html#scraping-big-number-of-targets - # available since 1.77.2 version https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.77.2 - clusterMode: false - # -- replication factor for vmagent in cluster mode - replicationFactor: 1 - # ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies - updateStrategy: {} - # type: RollingUpdate - - -image: - repository: victoriametrics/vmagent - tag: "" # rewrites Chart.AppVersion - pullPolicy: IfNotPresent - -imagePullSecrets: [] -nameOverride: "" -fullnameOverride: "" - -containerWorkingDir: "/" - -rbac: - create: true - # Note: The PSP will only be deployed, if Kubernetes (<1.25) supports the resource. - pspEnabled: true - annotations: {} - extraLabels: {} - # -- if true and `rbac.enabled`, will deploy a Role/Rolebinding instead of a ClusterRole/ClusterRoleBinding - namespaced: false - -serviceAccount: - # Specifies whether a service account should be created - create: true - # Annotations to add to the service account - annotations: {} - # The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: - -## See `kubectl explain poddisruptionbudget.spec` for more -## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/ -podDisruptionBudget: - enabled: false - # minAvailable: 1 - # maxUnavailable: 1 - labels: {} - -# WARN: need to specify at least one remote write url or one multi tenant url -remoteWriteUrls: [] -# remoteWriteUrls: -# - http://vm-insert:8480/insert/0/prometheus -# - http://prometheus:8480/insert/0/prometheus - -multiTenantUrls: [] -# multiTenantUrls: -# - http://vm-insert-az1:8480 -# - http://vm-insert-az2:8480 - -extraArgs: - envflag.enable: "true" - envflag.prefix: VM_ - loggerFormat: json - # promscrape.maxScrapeSize: "167772160" - - # Uncomment and specify the port if you want to support any of the protocols: - # https://victoriametrics.github.io/vmagent.html#features - # graphiteListenAddr: ":2003" - # influxListenAddr: ":8189" - # opentsdbHTTPListenAddr: ":4242" - # opentsdbListenAddr: ":4242" - -# -- Additional environment variables (ex.: secret tokens, flags) https://github.com/VictoriaMetrics/VictoriaMetrics#environment-variables -env: - [] - # - name: VM_remoteWrite_basicAuth_password - # valueFrom: - # secretKeyRef: - # name: auth_secret - # key: password - -envFrom: - [] - #- configMapRef: - # name: special-config - -# extra Labels for Pods, Deployment and Statefulset -extraLabels: {} - -# extra Labels for Pods only -podLabels: {} - -# Additional hostPath mounts -extraHostPathMounts: - [] - # - name: certs-dir - # mountPath: /etc/kubernetes/certs - # subPath: "" - # hostPath: /etc/kubernetes/certs - # readOnly: true - -# Extra Volumes for the pod -extraVolumes: - [] - # - name: example - # configMap: - # name: example - -# Extra Volume Mounts for the container -extraVolumeMounts: - [] - # - name: example - # mountPath: /example - -extraContainers: [] -# - name: config-reloader -# image: reloader-image - -initContainers: - [] - # - name: example - # image: example-image - -podSecurityContext: - {} - # fsGroup: 2000 - -securityContext: - {} - # capabilities: - # drop: - # - ALL - # readOnlyRootFilesystem: true - # runAsNonRoot: true - # runAsUser: 1000 - -service: - enabled: false - annotations: {} - extraLabels: {} - clusterIP: "" - ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips - ## - externalIPs: [] - loadBalancerIP: "" - loadBalancerSourceRanges: [] - servicePort: 8429 - # nodePort: 30000 - type: ClusterIP - # Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip - # externalTrafficPolicy: "local" - # healthCheckNodePort: 0 -ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: 'true' - - extraLabels: {} - hosts: [] - # - name: vmagent.local - # path: / - # port: http - tls: [] - # - secretName: vmagent-ingress-tls - # hosts: - # - vmagent.local - # For Kubernetes >= 1.18 you should specify the ingress-controller via the field ingressClassName - # See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#specifying-the-class-of-an-ingress - # ingressClassName: nginx - # -- pathType is only for k8s >= 1.1= - pathType: Prefix -resources: - {} - # We usually recommend not to specify default resources and to leave this as a conscious - # choice for the user. This also increases chances charts run on environments with little - # resources, such as Minikube. If you do want to specify resources, uncomment the following - # lines, adjust them as necessary, and remove the curly braces after 'resources:'. - # limits: - # cpu: 100m - # memory: 128Mi - # requests: - # cpu: 100m - # memory: 128Mi - -# Annotations to be added to the deployment -annotations: {} - -# Annotations to be added to pod -podAnnotations: {} - -nodeSelector: {} - -tolerations: [] - -topologySpreadConstraints: [] - # - maxSkew: 1 - # topologyKey: topology.kubernetes.io/zone - # whenUnsatisfiable: DoNotSchedule - -affinity: {} - -# vmagent scraping configuration: -# https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/docs/vmagent.md#how-to-collect-metrics-in-prometheus-format - -# use existing configmap if specified -# otherwise .config values will be used -configMap: "" - -# -- priority class to be assigned to the pod(s) -priorityClassName: "" - -serviceMonitor: - enabled: false - extraLabels: {} - annotations: {} - relabelings: [] -# interval: 15s -# scrapeTimeout: 5s - # -- Commented. HTTP scheme to use for scraping. -# scheme: https - # -- Commented. TLS configuration to use when scraping the endpoint -# tlsConfig: -# insecureSkipVerify: true - -persistence: - enabled: false - # storageClassName: default - accessModes: - - ReadWriteOnce - size: 10Gi - annotations: {} - extraLabels: {} - existingClaim: "" - # -- Bind Persistent Volume by labels. Must match all labels of targeted PV. - matchLabels: {} - -config: - global: - scrape_interval: 10s - - # scrape self by default - scrape_configs: - - job_name: vmagent - static_configs: - - targets: ["localhost:8429"] - - ## COPY from Prometheus helm chart https://github.com/helm/charts/blob/master/stable/prometheus/values.yaml - - # Scrape config for API servers. - # - # Kubernetes exposes API servers as endpoints to the default/kubernetes - # service so this uses `endpoints` role and uses relabelling to only keep - # the endpoints associated with the default/kubernetes service using the - # default named port `https`. This works for single API server deployments as - # well as HA API server deployments. - - job_name: "kubernetes-apiservers" - kubernetes_sd_configs: - - role: endpoints - # Default to scraping over https. If required, just disable this or change to - # `http`. - scheme: https - # This TLS & bearer token file config is used to connect to the actual scrape - # endpoints for cluster components. This is separate to discovery auth - # configuration because discovery & scraping are two separate concerns in - # Prometheus. The discovery auth config is automatic if Prometheus runs inside - # the cluster. Otherwise, more config options have to be provided within the - # . - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - # If your node certificates are self-signed or use a different CA to the - # master CA, then you need to disable certificate verification. Note that - # certificate verification is an integral part of a secure infrastructure - # so this should only be disabled in a controlled environment. You can - # enable certificate verification by commenting the line below. - # - insecure_skip_verify: true - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - # Keep only the default/kubernetes service endpoints for the https port. This - # will add targets for each API server which Kubernetes adds an endpoint to - # the default/kubernetes service. - relabel_configs: - - source_labels: - [ - __meta_kubernetes_namespace, - __meta_kubernetes_service_name, - __meta_kubernetes_endpoint_port_name, - ] - action: keep - regex: default;kubernetes;https - - job_name: "kubernetes-nodes" - # Default to scraping over https. If required, just disable this or change to - # `http`. - scheme: https - # This TLS & bearer token file config is used to connect to the actual scrape - # endpoints for cluster components. This is separate to discovery auth - # configuration because discovery & scraping are two separate concerns in - # Prometheus. The discovery auth config is automatic if Prometheus runs inside - # the cluster. Otherwise, more config options have to be provided within the - # . - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - # If your node certificates are self-signed or use a different CA to the - # master CA, then you need to disable certificate verification. Note that - # certificate verification is an integral part of a secure infrastructure - # so this should only be disabled in a controlled environment. You can - # enable certificate verification by commenting the line below. - # - insecure_skip_verify: true - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - kubernetes_sd_configs: - - role: node - relabel_configs: - - action: labelmap - regex: __meta_kubernetes_node_label_(.+) - - target_label: __address__ - replacement: kubernetes.default.svc:443 - - source_labels: [__meta_kubernetes_node_name] - regex: (.+) - target_label: __metrics_path__ - replacement: /api/v1/nodes/$1/proxy/metrics - - job_name: "kubernetes-nodes-cadvisor" - # Default to scraping over https. If required, just disable this or change to - # `http`. - scheme: https - # This TLS & bearer token file config is used to connect to the actual scrape - # endpoints for cluster components. This is separate to discovery auth - # configuration because discovery & scraping are two separate concerns in - # Prometheus. The discovery auth config is automatic if Prometheus runs inside - # the cluster. Otherwise, more config options have to be provided within the - # . - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - # If your node certificates are self-signed or use a different CA to the - # master CA, then you need to disable certificate verification. Note that - # certificate verification is an integral part of a secure infrastructure - # so this should only be disabled in a controlled environment. You can - # enable certificate verification by commenting the line below. - # - insecure_skip_verify: true - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - kubernetes_sd_configs: - - role: node - # This configuration will work only on kubelet 1.7.3+ - # As the scrape endpoints for cAdvisor have changed - # if you are using older version you need to change the replacement to - # replacement: /api/v1/nodes/$1:4194/proxy/metrics - # more info here https://github.com/coreos/prometheus-operator/issues/633 - relabel_configs: - - action: labelmap - regex: __meta_kubernetes_node_label_(.+) - - target_label: __address__ - replacement: kubernetes.default.svc:443 - - source_labels: [__meta_kubernetes_node_name] - regex: (.+) - target_label: __metrics_path__ - replacement: /api/v1/nodes/$1/proxy/metrics/cadvisor - # ignore timestamps of cadvisor's metrics by default - # more info here https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4697#issuecomment-1656540535 - honor_timestamps: false - # Scrape config for service endpoints. - # - # The relabeling allows the actual service scrape endpoint to be configured - # via the following annotations: - # - # * `prometheus.io/scrape`: Only scrape services that have a value of `true` - # * `prometheus.io/scheme`: If the metrics endpoint is secured then you will need - # to set this to `https` & most likely set the `tls_config` of the scrape config. - # * `prometheus.io/path`: If the metrics path is not `/metrics` override this. - # * `prometheus.io/port`: If the metrics are exposed on a different port to the - # service then set this appropriately. - - job_name: "kubernetes-service-endpoints" - kubernetes_sd_configs: - - role: endpointslices - relabel_configs: - - action: drop - source_labels: [__meta_kubernetes_pod_container_init] - regex: true - - action: keep_if_equal - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number] - - source_labels: - [__meta_kubernetes_service_annotation_prometheus_io_scrape] - action: keep - regex: true - - source_labels: - [__meta_kubernetes_service_annotation_prometheus_io_scheme] - action: replace - target_label: __scheme__ - regex: (https?) - - source_labels: - [__meta_kubernetes_service_annotation_prometheus_io_path] - action: replace - target_label: __metrics_path__ - regex: (.+) - - source_labels: - [ - __address__, - __meta_kubernetes_service_annotation_prometheus_io_port, - ] - action: replace - target_label: __address__ - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) - - source_labels: [__meta_kubernetes_pod_name] - target_label: pod - - source_labels: [__meta_kubernetes_pod_container_name] - target_label: container - - source_labels: [__meta_kubernetes_namespace] - target_label: namespace - - source_labels: [__meta_kubernetes_service_name] - target_label: service - - source_labels: [__meta_kubernetes_service_name] - target_label: job - replacement: ${1} - - source_labels: [__meta_kubernetes_pod_node_name] - action: replace - target_label: node - # Scrape config for slow service endpoints; same as above, but with a larger - # timeout and a larger interval - # - # The relabeling allows the actual service scrape endpoint to be configured - # via the following annotations: - # - # * `prometheus.io/scrape-slow`: Only scrape services that have a value of `true` - # * `prometheus.io/scheme`: If the metrics endpoint is secured then you will need - # to set this to `https` & most likely set the `tls_config` of the scrape config. - # * `prometheus.io/path`: If the metrics path is not `/metrics` override this. - # * `prometheus.io/port`: If the metrics are exposed on a different port to the - # service then set this appropriately. - - job_name: "kubernetes-service-endpoints-slow" - scrape_interval: 5m - scrape_timeout: 30s - kubernetes_sd_configs: - - role: endpointslices - relabel_configs: - - action: drop - source_labels: [__meta_kubernetes_pod_container_init] - regex: true - - action: keep_if_equal - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number] - - source_labels: - [__meta_kubernetes_service_annotation_prometheus_io_scrape_slow] - action: keep - regex: true - - source_labels: - [__meta_kubernetes_service_annotation_prometheus_io_scheme] - action: replace - target_label: __scheme__ - regex: (https?) - - source_labels: - [__meta_kubernetes_service_annotation_prometheus_io_path] - action: replace - target_label: __metrics_path__ - regex: (.+) - - source_labels: - [ - __address__, - __meta_kubernetes_service_annotation_prometheus_io_port, - ] - action: replace - target_label: __address__ - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) - - source_labels: [__meta_kubernetes_pod_name] - target_label: pod - - source_labels: [__meta_kubernetes_pod_container_name] - target_label: container - - source_labels: [__meta_kubernetes_namespace] - target_label: namespace - - source_labels: [__meta_kubernetes_service_name] - target_label: service - - source_labels: [__meta_kubernetes_service_name] - target_label: job - replacement: ${1} - - source_labels: [__meta_kubernetes_pod_node_name] - action: replace - target_label: node - # Example scrape config for probing services via the Blackbox Exporter. - # - # The relabeling allows the actual service scrape endpoint to be configured - # via the following annotations: - # - # * `prometheus.io/probe`: Only probe services that have a value of `true` - - job_name: "kubernetes-services" - metrics_path: /probe - params: - module: [http_2xx] - kubernetes_sd_configs: - - role: service - relabel_configs: - - source_labels: - [__meta_kubernetes_service_annotation_prometheus_io_probe] - action: keep - regex: true - - source_labels: [__address__] - target_label: __param_target - - target_label: __address__ - replacement: blackbox - - source_labels: [__param_target] - target_label: instance - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) - - source_labels: [__meta_kubernetes_namespace] - target_label: namespace - - source_labels: [__meta_kubernetes_service_name] - target_label: service - # Example scrape config for pods - # - # The relabeling allows the actual pod scrape endpoint to be configured via the - # following annotations: - # - # * `prometheus.io/scrape`: Only scrape pods that have a value of `true` - # * `prometheus.io/path`: If the metrics path is not `/metrics` override this. - # * `prometheus.io/port`: Scrape the pod on the indicated port instead of the default of `9102`. - - job_name: "kubernetes-pods" - kubernetes_sd_configs: - - role: pod - relabel_configs: - - action: drop - source_labels: [__meta_kubernetes_pod_container_init] - regex: true - - action: keep_if_equal - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number] - - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] - action: keep - regex: true - - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] - action: replace - target_label: __metrics_path__ - regex: (.+) - - source_labels: - [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] - action: replace - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - target_label: __address__ - - action: labelmap - regex: __meta_kubernetes_pod_label_(.+) - - source_labels: [__meta_kubernetes_pod_name] - target_label: pod - - source_labels: [__meta_kubernetes_pod_container_name] - target_label: container - - source_labels: [__meta_kubernetes_namespace] - target_label: namespace - - source_labels: [__meta_kubernetes_pod_node_name] - action: replace - target_label: node - ## End of COPY - -# -- Extra scrape configs that will be appended to `config` -extraScrapeConfigs: [] - -# Add extra specs dynamically to this chart -extraObjects: [] - -# -- Enterprise license key configuration for VictoriaMetrics enterprise. -# Required only for VictoriaMetrics enterprise. -# Documentation - https://docs.victoriametrics.com/enterprise.html, -# for more information, visit https://victoriametrics.com/products/enterprise/ . -# To request a trial license, go to https://victoriametrics.com/products/enterprise/trial/ -# Supported starting from VictoriaMetrics v1.94.0 -license: - # -- License key - key: "" - - # -- Use existing secret with license key - secret: - # -- Existing secret name - name: "" - # -- Key in secret with license key - key: "" diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/.helmignore b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/.helmignore deleted file mode 100644 index 50af03172..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/.helmignore +++ /dev/null @@ -1,22 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/CHANGELOG.md b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/CHANGELOG.md deleted file mode 100644 index 2f7360169..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/CHANGELOG.md +++ /dev/null @@ -1,154 +0,0 @@ -# CHANGELOG for `victoria-metrics-single` helm-chart - -## Next release - -- TODO - -## 0.9.15 - -**Release date:** 2024-02-01 - -![AppVersion: v1.97.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.97.1&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- bump version of VM components to [v1.97.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.97.1) - -## 0.9.14 - -**Release date:** 2023-12-13 - -![AppVersion: v1.96.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.96.0&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- Fix configuration of volume mount for license key referenced by using secret. - -## 0.9.13 - -**Release date:** 2023-12-12 - -![AppVersion: v1.96.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.96.0&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- bump version of VM components to [v1.96.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.96.0) - -## 0.9.12 - -**Release date:** 2023-11-16 - -![AppVersion: v1.95.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.95.1&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- bump version of VM components to [v1.95.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.95.1) - -## 0.9.11 - -**Release date:** 2023-11-15 - -![AppVersion: v1.95.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.95.0&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- bump version of VM components to [v1.95.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.95.0) - -## 0.9.10 - -**Release date:** 2023-10-12 - -![AppVersion: v1.94.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.94.0&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- Add license enforcement for vmbackupmanager in order to avoid running it without enterprise license key. See [these docs](https://docs.victoriametrics.com/enterprise.html) for details. -- Fix license flags not being passed to vmsingle when using StatefulSet. - -## 0.9.9 - -**Release date:** 2023-10-04 - -![AppVersion: v1.94.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.94.0&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- bump version of VM components to [v1.94.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.94.0) -- Add support of providing enterprise license key for VictoriaMetrics enterprise. See [these docs](https://docs.victoriametrics.com/enterprise.html) for details. - -## 0.9.8 - -**Release date:** 2023-09-21 - -![AppVersion: v1.93.5](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.5&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- Bump version of VM components to [v1.93.5](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.93.5) - -## 0.9.7 - -**Release date:** 2023-09-11 - -![AppVersion: v1.93.4](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.4&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- Bump version of VM components to [v1.93.4](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.93.4) - -## 0.9.6 - -**Release date:** 2023-09-04 - -![AppVersion: v1.93.3](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.3&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- Bump version of Victoria Metrics to `v1.93.3` -- Fixed `kubeVersion` in `Chart.yaml` - -## 0.9.5 - -**Release date:** 2023-08-30 - -![AppVersion: v1.93.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.1&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -* Disable `honorTimestamps` for cadvisor scrape job by default (#617) - -## 0.9.4 - -**Release date:** 2023-08-23 - -![AppVersion: v1.93.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.0&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -* Update VictoriaMetrics components from v1.93.0 to v1.93.1 - -## 0.9.3 - -**Release date:** 2023-08-12 - -![AppVersion: v1.93.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.93.0&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -* Update VictoriaMetrics components from v1.92.1 to v1.93.0 - -## 0.9.2 - -**Release date:** 2023-07-28 - -![AppVersion: v1.92.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.92.1&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -* Update VictoriaMetrics components from v1.92.0 to v1.92.1 (#599) - -## 0.9.1 - -**Release date:** 2023-07-27 - -![AppVersion: v1.92.0](https://img.shields.io/static/v1?label=AppVersion&message=v1.92.0&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -* Update VictoriaMetrics components from v1.91.3 to v1.92.0 -* fix misused securityContext and podSecurityContext (#592) - -## 0.9.0 - -**Release date:** 2023-07-13 - -![AppVersion: v1.91.3](https://img.shields.io/static/v1?label=AppVersion&message=v1.91.3&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -* bump version of agent, alert, auth, cluster, single -* feat(vmsingle): Add ability to deploy extra manifests (#587) diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/Chart.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/Chart.yaml deleted file mode 100644 index 2d3a07172..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/Chart.yaml +++ /dev/null @@ -1,31 +0,0 @@ -annotations: - artifacthub.io/category: monitoring-logging - artifacthub.io/changes: '- bump version of VM components to [v1.97.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.97.1)' - artifacthub.io/license: Apache-2.0 - artifacthub.io/links: | - - name: Sources - url: https://github.com/VictoriaMetrics/helm-charts - - name: Charts repo - url: https://victoriametrics.github.io/helm-charts/ - - name: Docs - url: https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html -apiVersion: v1 -appVersion: v1.97.1 -description: Victoria Metrics Single version - high-performance, cost-effective and - scalable TSDB, long-term remote storage for Prometheus -keywords: -- victoriametrics -- vmsingle -- single -- monitoring -- kubernetes -- observability -- tsdb -- metrics -- metricsql -- timeseries -kubeVersion: '>=1.23.0-0' -name: victoria-metrics-single -sources: -- https://github.com/VictoriaMetrics/helm-charts -version: 0.9.15 diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/README.md b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/README.md deleted file mode 100644 index 8828b7b65..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/README.md +++ /dev/null @@ -1,240 +0,0 @@ -# Victoria Metrics Helm Chart for Single Version - - ![Version: 0.9.15](https://img.shields.io/badge/Version-0.9.15-informational?style=flat-square) -[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/victoriametrics)](https://artifacthub.io/packages/helm/victoriametrics/victoria-metrics-single) - -Victoria Metrics Single version - high-performance, cost-effective and scalable TSDB, long-term remote storage for Prometheus - -## Prerequisites - -* Install the follow packages: ``git``, ``kubectl``, ``helm``, ``helm-docs``. See this [tutorial](../../REQUIREMENTS.md). -* PV support on underlying infrastructure. - -## Chart Details - -This chart will do the following: - -* Rollout Victoria Metrics Single. - -## How to install - -Access a Kubernetes cluster. - -Add a chart helm repository with follow commands: - -```console -helm repo add vm https://victoriametrics.github.io/helm-charts/ - -helm repo update -``` - -List versions of ``vm/victoria-metrics-single`` chart available to installation: - -```console -helm search repo vm/victoria-metrics-single -l -``` - -Export default values of ``victoria-metrics-single`` chart to file ``values.yaml``: - -```console -helm show values vm/victoria-metrics-single > values.yaml -``` - -Change the values according to the need of the environment in ``values.yaml`` file. - -Test the installation with command: - -```console -helm install vmsingle vm/victoria-metrics-single -f values.yaml -n NAMESPACE --debug --dry-run -``` - -Install chart with command: - -```console -helm install vmsingle vm/victoria-metrics-single -f values.yaml -n NAMESPACE -``` - -Get the pods lists by running this commands: - -```console -kubectl get pods -A | grep 'single' -``` - -Get the application by running this command: - -```console -helm list -f vmsingle -n NAMESPACE -``` - -See the history of versions of ``vmsingle`` application with command. - -```console -helm history vmsingle -n NAMESPACE -``` - -## How to uninstall - -Remove application with command. - -```console -helm uninstall vmsingle -n NAMESPACE -``` - -## Documentation of Helm Chart - -Install ``helm-docs`` following the instructions on this [tutorial](../../REQUIREMENTS.md). - -Generate docs with ``helm-docs`` command. - -```bash -cd charts/victoria-metrics-single - -helm-docs -``` - -The markdown generation is entirely go template driven. The tool parses metadata from charts and generates a number of sub-templates that can be referenced in a template file (by default ``README.md.gotmpl``). If no template file is provided, the tool has a default internal template that will generate a reasonably formatted README. - -## Parameters - -The following tables lists the configurable parameters of the chart and their default values. - -Change the values according to the need of the environment in ``victoria-metrics-single/values.yaml`` file. - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| automountServiceAccountToken | bool | `true` | | -| extraObjects | list | `[]` | Add extra specs dynamically to this chart | -| license | object | `{"key":"","secret":{"key":"","name":""}}` | Enterprise license key configuration for VictoriaMetrics enterprise. Required only for VictoriaMetrics enterprise. Documentation - https://docs.victoriametrics.com/enterprise.html, for more information, visit https://victoriametrics.com/products/enterprise/ . To request a trial license, go to https://victoriametrics.com/products/enterprise/trial/ Supported starting from VictoriaMetrics v1.94.0 | -| license.key | string | `""` | License key | -| license.secret | object | `{"key":"","name":""}` | Use existing secret with license key | -| license.secret.key | string | `""` | Key in secret with license key | -| license.secret.name | string | `""` | Existing secret name | -| podDisruptionBudget.enabled | bool | `false` | See `kubectl explain poddisruptionbudget.spec` for more. Ref: [https://kubernetes.io/docs/tasks/run-application/configure-pdb/](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) | -| podDisruptionBudget.extraLabels | object | `{}` | | -| printNotes | bool | `true` | Print chart notes | -| rbac.create | bool | `true` | | -| rbac.extraLabels | object | `{}` | | -| rbac.namespaced | bool | `false` | | -| rbac.pspEnabled | bool | `true` | | -| server.affinity | object | `{}` | Pod affinity | -| server.containerWorkingDir | string | `""` | Container workdir | -| server.enabled | bool | `true` | Enable deployment of server component. Deployed as StatefulSet | -| server.env | list | `[]` | Additional environment variables (ex.: secret tokens, flags) https://github.com/VictoriaMetrics/VictoriaMetrics#environment-variables | -| server.envFrom | list | `[]` | | -| server.extraArgs."envflag.enable" | string | `"true"` | | -| server.extraArgs."envflag.prefix" | string | `"VM_"` | | -| server.extraArgs.loggerFormat | string | `"json"` | | -| server.extraContainers | list | `[]` | | -| server.extraHostPathMounts | list | `[]` | | -| server.extraLabels | object | `{}` | Sts/Deploy additional labels | -| server.extraVolumeMounts | list | `[]` | | -| server.extraVolumes | list | `[]` | | -| server.fullnameOverride | string | `nil` | Overrides the full name of server component | -| server.image.pullPolicy | string | `"IfNotPresent"` | Image pull policy | -| server.image.repository | string | `"victoriametrics/victoria-metrics"` | Image repository | -| server.image.tag | string | `"v1.97.1"` | Image tag | -| server.ingress.annotations | object | `{}` | Ingress annotations | -| server.ingress.enabled | bool | `false` | Enable deployment of ingress for server component | -| server.ingress.extraLabels | object | `{}` | Ingress extra labels | -| server.ingress.hosts | list | `[]` | Array of host objects | -| server.ingress.pathType | string | `"Prefix"` | pathType is only for k8s >= 1.1= | -| server.ingress.tls | list | `[]` | Array of TLS objects | -| server.initContainers | list | `[]` | | -| server.livenessProbe.failureThreshold | int | `10` | | -| server.livenessProbe.httpGet.path | string | `"/health"` | | -| server.livenessProbe.httpGet.port | int | `8428` | | -| server.livenessProbe.httpGet.scheme | string | `"HTTP"` | | -| server.livenessProbe.initialDelaySeconds | int | `30` | | -| server.livenessProbe.periodSeconds | int | `30` | | -| server.livenessProbe.timeoutSeconds | int | `5` | | -| server.name | string | `"server"` | Server container name | -| server.nodeSelector | object | `{}` | Pod's node selector. Ref: [https://kubernetes.io/docs/user-guide/node-selection/](https://kubernetes.io/docs/user-guide/node-selection/) | -| server.persistentVolume.accessModes | list | `["ReadWriteOnce"]` | Array of access modes. Must match those of existing PV or dynamic provisioner. Ref: [http://kubernetes.io/docs/user-guide/persistent-volumes/](http://kubernetes.io/docs/user-guide/persistent-volumes/) | -| server.persistentVolume.annotations | object | `{}` | Persistant volume annotations | -| server.persistentVolume.enabled | bool | `true` | Create/use Persistent Volume Claim for server component. Empty dir if false | -| server.persistentVolume.existingClaim | string | `""` | Existing Claim name. If defined, PVC must be created manually before volume will be bound | -| server.persistentVolume.matchLabels | object | `{}` | Bind Persistent Volume by labels. Must match all labels of targeted PV. | -| server.persistentVolume.mountPath | string | `"/storage"` | Mount path. Server data Persistent Volume mount root path. | -| server.persistentVolume.size | string | `"16Gi"` | Size of the volume. Should be calculated based on the metrics you send and retention policy you set. | -| server.persistentVolume.storageClass | string | `""` | StorageClass to use for persistent volume. Requires server.persistentVolume.enabled: true. If defined, PVC created automatically | -| server.persistentVolume.subPath | string | `""` | Mount subpath | -| server.podAnnotations | object | `{}` | Pod's annotations | -| server.podLabels | object | `{}` | Pod's additional labels | -| server.podManagementPolicy | string | `"OrderedReady"` | Pod's management policy | -| server.podSecurityContext | object | `{}` | Pod's security context. Ref: [https://kubernetes.io/docs/tasks/configure-pod-container/security-context/](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) | -| server.priorityClassName | string | `""` | Name of Priority Class | -| server.readinessProbe.failureThreshold | int | `3` | | -| server.readinessProbe.httpGet.path | string | `"/health"` | | -| server.readinessProbe.httpGet.port | string | `"http"` | | -| server.readinessProbe.initialDelaySeconds | int | `5` | | -| server.readinessProbe.periodSeconds | int | `15` | | -| server.readinessProbe.timeoutSeconds | int | `5` | | -| server.resources | object | `{}` | Resource object. Ref: [http://kubernetes.io/docs/user-guide/compute-resources/](http://kubernetes.io/docs/user-guide/compute-resources/ | -| server.retentionPeriod | int | `1` | Data retention period in month | -| server.scrape | object | `{"config":{"global":{"scrape_interval":"15s"},"scrape_configs":[{"job_name":"victoriametrics","static_configs":[{"targets":["localhost:8428"]}]},{"bearer_token_file":"/var/run/secrets/kubernetes.io/serviceaccount/token","job_name":"kubernetes-apiservers","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"keep","regex":"default;kubernetes;https","source_labels":["__meta_kubernetes_namespace","__meta_kubernetes_service_name","__meta_kubernetes_endpoint_port_name"]}],"scheme":"https","tls_config":{"ca_file":"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt","insecure_skip_verify":true}},{"bearer_token_file":"/var/run/secrets/kubernetes.io/serviceaccount/token","job_name":"kubernetes-nodes","kubernetes_sd_configs":[{"role":"node"}],"relabel_configs":[{"action":"labelmap","regex":"__meta_kubernetes_node_label_(.+)"},{"replacement":"kubernetes.default.svc:443","target_label":"__address__"},{"regex":"(.+)","replacement":"/api/v1/nodes/$1/proxy/metrics","source_labels":["__meta_kubernetes_node_name"],"target_label":"__metrics_path__"}],"scheme":"https","tls_config":{"ca_file":"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt","insecure_skip_verify":true}},{"bearer_token_file":"/var/run/secrets/kubernetes.io/serviceaccount/token","honor_timestamps":false,"job_name":"kubernetes-nodes-cadvisor","kubernetes_sd_configs":[{"role":"node"}],"relabel_configs":[{"action":"labelmap","regex":"__meta_kubernetes_node_label_(.+)"},{"replacement":"kubernetes.default.svc:443","target_label":"__address__"},{"regex":"(.+)","replacement":"/api/v1/nodes/$1/proxy/metrics/cadvisor","source_labels":["__meta_kubernetes_node_name"],"target_label":"__metrics_path__"}],"scheme":"https","tls_config":{"ca_file":"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt","insecure_skip_verify":true}},{"job_name":"kubernetes-service-endpoints","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scrape"]},{"action":"replace","regex":"(https?)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scheme"],"target_label":"__scheme__"},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_service_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"},{"action":"replace","source_labels":["__meta_kubernetes_pod_node_name"],"target_label":"kubernetes_node"}]},{"job_name":"kubernetes-service-endpoints-slow","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scrape_slow"]},{"action":"replace","regex":"(https?)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scheme"],"target_label":"__scheme__"},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_service_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"},{"action":"replace","source_labels":["__meta_kubernetes_pod_node_name"],"target_label":"kubernetes_node"}],"scrape_interval":"5m","scrape_timeout":"30s"},{"job_name":"kubernetes-services","kubernetes_sd_configs":[{"role":"service"}],"metrics_path":"/probe","params":{"module":["http_2xx"]},"relabel_configs":[{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_probe"]},{"source_labels":["__address__"],"target_label":"__param_target"},{"replacement":"blackbox","target_label":"__address__"},{"source_labels":["__param_target"],"target_label":"instance"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"}]},{"job_name":"kubernetes-pods","kubernetes_sd_configs":[{"role":"pod"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_scrape"]},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_pod_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_pod_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_pod_name"],"target_label":"kubernetes_pod_name"}]}]},"configMap":"","enabled":false,"extraScrapeConfigs":[]}` | Scrape configuration for victoriametrics | -| server.scrape.config | object | `{"global":{"scrape_interval":"15s"},"scrape_configs":[{"job_name":"victoriametrics","static_configs":[{"targets":["localhost:8428"]}]},{"bearer_token_file":"/var/run/secrets/kubernetes.io/serviceaccount/token","job_name":"kubernetes-apiservers","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"keep","regex":"default;kubernetes;https","source_labels":["__meta_kubernetes_namespace","__meta_kubernetes_service_name","__meta_kubernetes_endpoint_port_name"]}],"scheme":"https","tls_config":{"ca_file":"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt","insecure_skip_verify":true}},{"bearer_token_file":"/var/run/secrets/kubernetes.io/serviceaccount/token","job_name":"kubernetes-nodes","kubernetes_sd_configs":[{"role":"node"}],"relabel_configs":[{"action":"labelmap","regex":"__meta_kubernetes_node_label_(.+)"},{"replacement":"kubernetes.default.svc:443","target_label":"__address__"},{"regex":"(.+)","replacement":"/api/v1/nodes/$1/proxy/metrics","source_labels":["__meta_kubernetes_node_name"],"target_label":"__metrics_path__"}],"scheme":"https","tls_config":{"ca_file":"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt","insecure_skip_verify":true}},{"bearer_token_file":"/var/run/secrets/kubernetes.io/serviceaccount/token","honor_timestamps":false,"job_name":"kubernetes-nodes-cadvisor","kubernetes_sd_configs":[{"role":"node"}],"relabel_configs":[{"action":"labelmap","regex":"__meta_kubernetes_node_label_(.+)"},{"replacement":"kubernetes.default.svc:443","target_label":"__address__"},{"regex":"(.+)","replacement":"/api/v1/nodes/$1/proxy/metrics/cadvisor","source_labels":["__meta_kubernetes_node_name"],"target_label":"__metrics_path__"}],"scheme":"https","tls_config":{"ca_file":"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt","insecure_skip_verify":true}},{"job_name":"kubernetes-service-endpoints","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scrape"]},{"action":"replace","regex":"(https?)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scheme"],"target_label":"__scheme__"},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_service_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"},{"action":"replace","source_labels":["__meta_kubernetes_pod_node_name"],"target_label":"kubernetes_node"}]},{"job_name":"kubernetes-service-endpoints-slow","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scrape_slow"]},{"action":"replace","regex":"(https?)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scheme"],"target_label":"__scheme__"},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_service_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"},{"action":"replace","source_labels":["__meta_kubernetes_pod_node_name"],"target_label":"kubernetes_node"}],"scrape_interval":"5m","scrape_timeout":"30s"},{"job_name":"kubernetes-services","kubernetes_sd_configs":[{"role":"service"}],"metrics_path":"/probe","params":{"module":["http_2xx"]},"relabel_configs":[{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_probe"]},{"source_labels":["__address__"],"target_label":"__param_target"},{"replacement":"blackbox","target_label":"__address__"},{"source_labels":["__param_target"],"target_label":"instance"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"}]},{"job_name":"kubernetes-pods","kubernetes_sd_configs":[{"role":"pod"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_scrape"]},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_pod_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_pod_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_pod_name"],"target_label":"kubernetes_pod_name"}]}]}` | Scrape config | -| server.scrape.config.scrape_configs | list | `[{"job_name":"victoriametrics","static_configs":[{"targets":["localhost:8428"]}]},{"bearer_token_file":"/var/run/secrets/kubernetes.io/serviceaccount/token","job_name":"kubernetes-apiservers","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"keep","regex":"default;kubernetes;https","source_labels":["__meta_kubernetes_namespace","__meta_kubernetes_service_name","__meta_kubernetes_endpoint_port_name"]}],"scheme":"https","tls_config":{"ca_file":"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt","insecure_skip_verify":true}},{"bearer_token_file":"/var/run/secrets/kubernetes.io/serviceaccount/token","job_name":"kubernetes-nodes","kubernetes_sd_configs":[{"role":"node"}],"relabel_configs":[{"action":"labelmap","regex":"__meta_kubernetes_node_label_(.+)"},{"replacement":"kubernetes.default.svc:443","target_label":"__address__"},{"regex":"(.+)","replacement":"/api/v1/nodes/$1/proxy/metrics","source_labels":["__meta_kubernetes_node_name"],"target_label":"__metrics_path__"}],"scheme":"https","tls_config":{"ca_file":"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt","insecure_skip_verify":true}},{"bearer_token_file":"/var/run/secrets/kubernetes.io/serviceaccount/token","honor_timestamps":false,"job_name":"kubernetes-nodes-cadvisor","kubernetes_sd_configs":[{"role":"node"}],"relabel_configs":[{"action":"labelmap","regex":"__meta_kubernetes_node_label_(.+)"},{"replacement":"kubernetes.default.svc:443","target_label":"__address__"},{"regex":"(.+)","replacement":"/api/v1/nodes/$1/proxy/metrics/cadvisor","source_labels":["__meta_kubernetes_node_name"],"target_label":"__metrics_path__"}],"scheme":"https","tls_config":{"ca_file":"/var/run/secrets/kubernetes.io/serviceaccount/ca.crt","insecure_skip_verify":true}},{"job_name":"kubernetes-service-endpoints","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scrape"]},{"action":"replace","regex":"(https?)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scheme"],"target_label":"__scheme__"},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_service_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"},{"action":"replace","source_labels":["__meta_kubernetes_pod_node_name"],"target_label":"kubernetes_node"}]},{"job_name":"kubernetes-service-endpoints-slow","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scrape_slow"]},{"action":"replace","regex":"(https?)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scheme"],"target_label":"__scheme__"},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_service_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"},{"action":"replace","source_labels":["__meta_kubernetes_pod_node_name"],"target_label":"kubernetes_node"}],"scrape_interval":"5m","scrape_timeout":"30s"},{"job_name":"kubernetes-services","kubernetes_sd_configs":[{"role":"service"}],"metrics_path":"/probe","params":{"module":["http_2xx"]},"relabel_configs":[{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_probe"]},{"source_labels":["__address__"],"target_label":"__param_target"},{"replacement":"blackbox","target_label":"__address__"},{"source_labels":["__param_target"],"target_label":"instance"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"}]},{"job_name":"kubernetes-pods","kubernetes_sd_configs":[{"role":"pod"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_scrape"]},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_pod_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_pod_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_pod_name"],"target_label":"kubernetes_pod_name"}]}]` | Scrape targets | -| server.scrape.config.scrape_configs[0] | object | `{"job_name":"victoriametrics","static_configs":[{"targets":["localhost:8428"]}]}` | Scrape rule for scrape victoriametrics | -| server.scrape.config.scrape_configs[4] | object | `{"job_name":"kubernetes-service-endpoints","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scrape"]},{"action":"replace","regex":"(https?)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scheme"],"target_label":"__scheme__"},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_service_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"},{"action":"replace","source_labels":["__meta_kubernetes_pod_node_name"],"target_label":"kubernetes_node"}]}` | Scrape rule using kubernetes service discovery for endpoints | -| server.scrape.config.scrape_configs[5] | object | `{"job_name":"kubernetes-service-endpoints-slow","kubernetes_sd_configs":[{"role":"endpoints"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scrape_slow"]},{"action":"replace","regex":"(https?)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_scheme"],"target_label":"__scheme__"},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_service_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_service_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"},{"action":"replace","source_labels":["__meta_kubernetes_pod_node_name"],"target_label":"kubernetes_node"}],"scrape_interval":"5m","scrape_timeout":"30s"}` | Scrape config for slow service endpoints; same as above, but with a larger timeout and a larger interval The relabeling allows the actual service scrape endpoint to be configured via the following annotations: * `prometheus.io/scrape-slow`: Only scrape services that have a value of `true` * `prometheus.io/scheme`: If the metrics endpoint is secured then you will need to set this to `https` & most likely set the `tls_config` of the scrape config. * `prometheus.io/path`: If the metrics path is not `/metrics` override this. * `prometheus.io/port`: If the metrics are exposed on a different port to the service then set this appropriately. | -| server.scrape.config.scrape_configs[6] | object | `{"job_name":"kubernetes-services","kubernetes_sd_configs":[{"role":"service"}],"metrics_path":"/probe","params":{"module":["http_2xx"]},"relabel_configs":[{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_service_annotation_prometheus_io_probe"]},{"source_labels":["__address__"],"target_label":"__param_target"},{"replacement":"blackbox","target_label":"__address__"},{"source_labels":["__param_target"],"target_label":"instance"},{"action":"labelmap","regex":"__meta_kubernetes_service_label_(.+)"},{"source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"source_labels":["__meta_kubernetes_service_name"],"target_label":"kubernetes_name"}]}` | Example scrape config for probing services via the Blackbox Exporter. The relabeling allows the actual service scrape endpoint to be configured via the following annotations: * `prometheus.io/probe`: Only probe services that have a value of `true` | -| server.scrape.config.scrape_configs[7] | object | `{"job_name":"kubernetes-pods","kubernetes_sd_configs":[{"role":"pod"}],"relabel_configs":[{"action":"drop","regex":true,"source_labels":["__meta_kubernetes_pod_container_init"]},{"action":"keep_if_equal","source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_port","__meta_kubernetes_pod_container_port_number"]},{"action":"keep","regex":true,"source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_scrape"]},{"action":"replace","regex":"(.+)","source_labels":["__meta_kubernetes_pod_annotation_prometheus_io_path"],"target_label":"__metrics_path__"},{"action":"replace","regex":"([^:]+)(?::\\d+)?;(\\d+)","replacement":"$1:$2","source_labels":["__address__","__meta_kubernetes_pod_annotation_prometheus_io_port"],"target_label":"__address__"},{"action":"labelmap","regex":"__meta_kubernetes_pod_label_(.+)"},{"action":"replace","source_labels":["__meta_kubernetes_namespace"],"target_label":"kubernetes_namespace"},{"action":"replace","source_labels":["__meta_kubernetes_pod_name"],"target_label":"kubernetes_pod_name"}]}` | Example scrape config for pods The relabeling allows the actual pod scrape endpoint to be configured via the following annotations: * `prometheus.io/scrape`: Only scrape pods that have a value of `true` * `prometheus.io/path`: If the metrics path is not `/metrics` override this. * `prometheus.io/port`: Scrape the pod on the indicated port instead of the default of `9102`. | -| server.scrape.configMap | string | `""` | Use existing configmap if specified otherwise .config values will be used | -| server.scrape.enabled | bool | `false` | If true scrapes targets, creates config map or use specified one with scrape targets | -| server.scrape.extraScrapeConfigs | list | `[]` | Extra scrape configs that will be appended to `server.scrape.config` | -| server.securityContext | object | `{}` | Security context to be added to server pods | -| server.service.annotations | object | `{}` | Service annotations | -| server.service.clusterIP | string | `""` | Service ClusterIP | -| server.service.externalIPs | list | `[]` | Service External IPs. Ref: [https://kubernetes.io/docs/user-guide/services/#external-ips]( https://kubernetes.io/docs/user-guide/services/#external-ips) | -| server.service.labels | object | `{}` | Service labels | -| server.service.loadBalancerIP | string | `""` | Service load balacner IP | -| server.service.loadBalancerSourceRanges | list | `[]` | Load balancer source range | -| server.service.servicePort | int | `8428` | Service port | -| server.service.type | string | `"ClusterIP"` | Service type | -| server.serviceMonitor.annotations | object | `{}` | Service Monitor annotations | -| server.serviceMonitor.enabled | bool | `false` | Enable deployment of Service Monitor for server component. This is Prometheus operator object | -| server.serviceMonitor.extraLabels | object | `{}` | Service Monitor labels | -| server.serviceMonitor.relabelings | list | `[]` | Service Monitor relabelings | -| server.startupProbe | object | `{}` | | -| server.statefulSet.enabled | bool | `true` | Creates statefulset instead of deployment, useful when you want to keep the cache | -| server.statefulSet.podManagementPolicy | string | `"OrderedReady"` | Deploy order policy for StatefulSet pods | -| server.statefulSet.service.annotations | object | `{}` | Headless service annotations | -| server.statefulSet.service.labels | object | `{}` | Headless service labels | -| server.statefulSet.service.servicePort | int | `8428` | Headless service port | -| server.terminationGracePeriodSeconds | int | `60` | Pod's termination grace period in seconds | -| server.tolerations | list | `[]` | Node tolerations for server scheduling to nodes with taints. Ref: [https://kubernetes.io/docs/concepts/configuration/assign-pod-node/](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/) | -| server.vmbackupmanager.destination | string | `""` | backup destination at S3, GCS or local filesystem. Release name will be included to path! | -| server.vmbackupmanager.disableDaily | bool | `false` | disable daily backups | -| server.vmbackupmanager.disableHourly | bool | `false` | disable hourly backups | -| server.vmbackupmanager.disableMonthly | bool | `false` | disable monthly backups | -| server.vmbackupmanager.disableWeekly | bool | `false` | disable weekly backups | -| server.vmbackupmanager.enable | bool | `false` | enable automatic creation of backup via vmbackupmanager. vmbackupmanager is part of Enterprise packages | -| server.vmbackupmanager.env | list | `[]` | Additional environment variables (ex.: secret tokens, flags) https://github.com/VictoriaMetrics/VictoriaMetrics#environment-variables | -| server.vmbackupmanager.eula | bool | `false` | should be true and means that you have the legal right to run a backup manager that can either be a signed contract or an email with confirmation to run the service in a trial period # https://victoriametrics.com/legal/esa/ | -| server.vmbackupmanager.extraArgs."envflag.enable" | string | `"true"` | | -| server.vmbackupmanager.extraArgs."envflag.prefix" | string | `"VM_"` | | -| server.vmbackupmanager.extraArgs.loggerFormat | string | `"json"` | | -| server.vmbackupmanager.extraVolumeMounts | list | `[]` | | -| server.vmbackupmanager.image.repository | string | `"victoriametrics/vmbackupmanager"` | vmbackupmanager image repository | -| server.vmbackupmanager.image.tag | string | `"v1.97.1-enterprise"` | vmbackupmanager image tag | -| server.vmbackupmanager.livenessProbe.failureThreshold | int | `10` | | -| server.vmbackupmanager.livenessProbe.initialDelaySeconds | int | `30` | | -| server.vmbackupmanager.livenessProbe.periodSeconds | int | `30` | | -| server.vmbackupmanager.livenessProbe.tcpSocket.port | string | `"manager-http"` | | -| server.vmbackupmanager.livenessProbe.timeoutSeconds | int | `5` | | -| server.vmbackupmanager.readinessProbe.failureThreshold | int | `3` | | -| server.vmbackupmanager.readinessProbe.httpGet.path | string | `"/health"` | | -| server.vmbackupmanager.readinessProbe.httpGet.port | string | `"manager-http"` | | -| server.vmbackupmanager.readinessProbe.initialDelaySeconds | int | `5` | | -| server.vmbackupmanager.readinessProbe.periodSeconds | int | `15` | | -| server.vmbackupmanager.readinessProbe.timeoutSeconds | int | `5` | | -| server.vmbackupmanager.resources | object | `{}` | | -| server.vmbackupmanager.restore | object | `{"onStart":{"enabled":false}}` | Allows to enable restore options for pod. Read more: https://docs.victoriametrics.com/vmbackupmanager.html#restore-commands | -| server.vmbackupmanager.retention | object | `{"keepLastDaily":2,"keepLastHourly":2,"keepLastMonthly":2,"keepLastWeekly":2}` | backups' retention settings | -| server.vmbackupmanager.retention.keepLastDaily | int | `2` | keep last N daily backups. 0 means delete all existing daily backups. Specify -1 to turn off | -| server.vmbackupmanager.retention.keepLastHourly | int | `2` | keep last N hourly backups. 0 means delete all existing hourly backups. Specify -1 to turn off | -| server.vmbackupmanager.retention.keepLastMonthly | int | `2` | keep last N monthly backups. 0 means delete all existing monthly backups. Specify -1 to turn off | -| server.vmbackupmanager.retention.keepLastWeekly | int | `2` | keep last N weekly backups. 0 means delete all existing weekly backups. Specify -1 to turn off | -| serviceAccount.automountToken | bool | `true` | Mount API token to pod directly | -| serviceAccount.create | bool | `true` | Create service account. | -| serviceAccount.extraLabels | object | `{}` | | \ No newline at end of file diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/README.md.gotmpl b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/README.md.gotmpl deleted file mode 100644 index 6e221d559..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/README.md.gotmpl +++ /dev/null @@ -1,103 +0,0 @@ -# Victoria Metrics Helm Chart for Single Version - -{{ template "chart.typeBadge" . }} {{ template "chart.versionBadge" . }} -[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/victoriametrics)](https://artifacthub.io/packages/helm/victoriametrics/victoria-metrics-single) - -{{ template "chart.description" . }} - -## Prerequisites - -* Install the follow packages: ``git``, ``kubectl``, ``helm``, ``helm-docs``. See this [tutorial](../../REQUIREMENTS.md). -* PV support on underlying infrastructure. - -## Chart Details - -This chart will do the following: - -* Rollout Victoria Metrics Single. - -## How to install - -Access a Kubernetes cluster. - -Add a chart helm repository with follow commands: - -```console -helm repo add vm https://victoriametrics.github.io/helm-charts/ - -helm repo update -``` - -List versions of ``vm/victoria-metrics-single`` chart available to installation: - -```console -helm search repo vm/victoria-metrics-single -l -``` - -Export default values of ``victoria-metrics-single`` chart to file ``values.yaml``: - -```console -helm show values vm/victoria-metrics-single > values.yaml -``` - -Change the values according to the need of the environment in ``values.yaml`` file. - -Test the installation with command: - -```console -helm install vmsingle vm/victoria-metrics-single -f values.yaml -n NAMESPACE --debug --dry-run -``` - -Install chart with command: - -```console -helm install vmsingle vm/victoria-metrics-single -f values.yaml -n NAMESPACE -``` - -Get the pods lists by running this commands: - -```console -kubectl get pods -A | grep 'single' -``` - -Get the application by running this command: - -```console -helm list -f vmsingle -n NAMESPACE -``` - -See the history of versions of ``vmsingle`` application with command. - -```console -helm history vmsingle -n NAMESPACE -``` - -## How to uninstall - -Remove application with command. - -```console -helm uninstall vmsingle -n NAMESPACE -``` - -## Documentation of Helm Chart - -Install ``helm-docs`` following the instructions on this [tutorial](../../REQUIREMENTS.md). - -Generate docs with ``helm-docs`` command. - -```bash -cd charts/victoria-metrics-single - -helm-docs -``` - -The markdown generation is entirely go template driven. The tool parses metadata from charts and generates a number of sub-templates that can be referenced in a template file (by default ``README.md.gotmpl``). If no template file is provided, the tool has a default internal template that will generate a reasonably formatted README. - -## Parameters - -The following tables lists the configurable parameters of the chart and their default values. - -Change the values according to the need of the environment in ``victoria-metrics-single/values.yaml`` file. - -{{ template "chart.valuesTable" . }} \ No newline at end of file diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/RELEASE_NOTES.md b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/RELEASE_NOTES.md deleted file mode 100644 index 4d13f3404..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/RELEASE_NOTES.md +++ /dev/null @@ -1,9 +0,0 @@ -# Release notes for version 0.9.15 - -**Release date:** 2024-02-01 - -![AppVersion: v1.97.1](https://img.shields.io/static/v1?label=AppVersion&message=v1.97.1&color=success&logo=) -![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm) - -- bump version of VM components to [v1.97.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.97.1) - diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/NOTES.txt b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/NOTES.txt deleted file mode 100644 index 6c357c127..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/NOTES.txt +++ /dev/null @@ -1,51 +0,0 @@ -{{- if .Values.printNotes }} -{{- if .Values.server.enabled }} -The VictoriaMetrics write api can be accessed via port {{ .Values.server.service.servicePort }} on the following DNS name from within your cluster: - {{ template "victoria-metrics.server.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local - - -Metrics Ingestion: - Get the Victoria Metrics service URL by running these commands in the same shell: - -{{- if contains "NodePort" .Values.server.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "victoria-metrics.server.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.server.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "victoria-metrics.server.fullname" . }}' - - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "victoria-metrics.server.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') - echo http://$SERVICE_IP:{{ .Values.server.service.servicePort }} -{{- else if contains "ClusterIP" .Values.server.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ .Values.server.name }}" -o jsonpath="{.items[0].metadata.name}") - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME {{ .Values.server.service.servicePort }} -{{- end }} - - Write url inside the kubernetes cluster: - http://{{ template "victoria-metrics.server.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local:{{ .Values.server.service.servicePort }}/api/v1/write - -{{- if .Values.server.scrape.enabled }} - -Metrics Scrape: - Pull-based scrapes are enabled - Scrape config can be displayed by running this command:: - {{- if eq .Values.server.scrape.configMap "" }} - kubectl get cm {{ template "victoria-metrics.server.fullname" . }}-scrapeconfig -n {{ .Release.Namespace }} - {{- else }} - kubectl get cm .Values.server.scrape.configMap -n {{ .Release.Namespace }} - {{- end }} - - The target’s information is accessible via api: - Inside cluster: - http://{{ template "victoria-metrics.server.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local:{{ .Values.server.service.servicePort }}/targets - Outside cluster: - You need to port-forward service (see instructions above) and call - http:///targets -{{- end }} - -Read Data: - The following url can be used as the datasource url in Grafana:: - http://{{ template "victoria-metrics.server.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local:{{ .Values.server.service.servicePort }} -{{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/_helpers.tpl b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/_helpers.tpl deleted file mode 100644 index 072d81d07..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/_helpers.tpl +++ /dev/null @@ -1,227 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "victoria-metrics.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "victoria-metrics.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "victoria-metrics.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create the name of the service account -*/}} -{{- define "victoria-metrics.serviceAccountName" -}} -{{- if .Values.serviceAccount.create -}} - {{ default (include "victoria-metrics.fullname" .) .Values.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* -Create unified labels for victoria-metrics components -*/}} -{{- define "victoria-metrics.common.matchLabels" -}} -app.kubernetes.io/name: {{ include "victoria-metrics.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} - -{{- define "victoria-metrics.common.metaLabels" -}} -helm.sh/chart: {{ include "victoria-metrics.chart" . }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end -}} - -{{- define "victoria-metrics.server.labels" -}} -{{ include "victoria-metrics.server.matchLabels" . }} -{{ include "victoria-metrics.common.metaLabels" . }} -{{- end -}} - -{{- define "victoria-metrics.server.matchLabels" -}} -app: {{ .Values.server.name }} -{{ include "victoria-metrics.common.matchLabels" . }} -{{- end -}} - -{{/* -Create a fully qualified server name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "victoria-metrics.server.fullname" -}} -{{- if .Values.server.fullnameOverride -}} -{{- .Values.server.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- printf "%s-%s" .Release.Name .Values.server.name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s-%s" .Release.Name $name .Values.server.name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - - -{{- define "split-host-port" -}} -{{- $hp := split ":" . -}} -{{- printf "%s" $hp._1 -}} -{{- end -}} - -{{/* -Defines the name of scrape configuration map -*/}} -{{- define "victoria-metrics.server.scrape.configname" -}} -{{- if .Values.server.scrape.configMap -}} -{{- .Values.server.scrape.configMap -}} -{{- else -}} -{{- include "victoria-metrics.server.fullname" . -}}-scrapeconfig -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for ingress. -*/}} -{{- define "victoria-metrics.ingress.apiVersion" -}} - {{- if and (.Capabilities.APIVersions.Has "networking.k8s.io/v1") -}} - {{- print "networking.k8s.io/v1" -}} - {{- else if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" -}} - {{- print "networking.k8s.io/v1beta1" -}} - {{- else -}} - {{- print "extensions/v1beta1" -}} - {{- end -}} -{{- end -}} - -{{/* -Return if ingress is stable. -*/}} -{{- define "victoria-metrics.ingress.isStable" -}} - {{- eq (include "victoria-metrics.ingress.apiVersion" .) "networking.k8s.io/v1" -}} -{{- end -}} - -{{/* -Return if ingress supports ingressClassName. -*/}} -{{- define "victoria-metrics.ingress.supportsIngressClassName" -}} - {{- or (eq (include "victoria-metrics.ingress.isStable" .) "true") (and (eq (include "victoria-metrics.ingress.apiVersion" .) "networking.k8s.io/v1beta1")) -}} -{{- end -}} - -{{/* -Return if ingress supports pathType. -*/}} -{{- define "victoria-metrics.ingress.supportsPathType" -}} - {{- or (eq (include "victoria-metrics.ingress.isStable" .) "true") (and (eq (include "victoria-metrics.ingress.apiVersion" .) "networking.k8s.io/v1beta1")) -}} -{{- end -}} - -{{- define "victoria-metrics.hasInitContainer" -}} - {{- or (gt (len .Values.server.initContainers) 0) .Values.server.vmbackupmanager.restore.onStart.enabled -}} -{{- end -}} - -{{- define "victoria-metrics.initContiners" -}} -{{- if eq (include "victoria-metrics.hasInitContainer" . ) "true" -}} -{{- with .Values.server.initContainers -}} -{{ toYaml . }} -{{- end -}} -{{- if .Values.server.vmbackupmanager.restore.onStart.enabled }} -- name: {{ template "victoria-metrics.name" . }}-vmbackupmanager-restore - image: "{{ .Values.server.vmbackupmanager.image.repository }}:{{ .Values.server.vmbackupmanager.image.tag }}" - imagePullPolicy: "{{ .Values.server.image.pullPolicy }}" - args: - - restore - - {{ printf "%s=%t" "--eula" .Values.server.vmbackupmanager.eula | quote}} - - {{ printf "%s=%s" "--storageDataPath" .Values.server.persistentVolume.mountPath | quote}} - {{- range $key, $value := .Values.server.vmbackupmanager.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - {{- with .Values.server.securityContext }} - securityContext: {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.server.vmbackupmanager.resources }} - resources: {{ toYaml . | nindent 4 }} - {{- end }} - {{- with .Values.server.vmbackupmanager.env }} - env: {{ toYaml . | nindent 4 }} - {{- end }} - ports: - - name: manager-http - containerPort: 8300 - volumeMounts: - - name: server-volume - mountPath: {{ .Values.server.persistentVolume.mountPath }} - subPath: {{ .Values.server.persistentVolume.subPath }} - {{- with .Values.server.vmbackupmanager.extraVolumeMounts }} - {{- toYaml . | nindent 4 }} - {{- end }} -{{- end -}} -{{- else -}} -[] -{{- end -}} -{{- end -}} - -{{/* -Return license flag if necessary. -*/}} -{{- define "victoria-metrics.license.flag" -}} -{{- if .Values.license.key -}} --license={{ .Values.license.key }} -{{- end }} -{{- if and .Values.license.secret.name .Values.license.secret.key -}} --licenseFile=/etc/vm-license-key/{{ .Values.license.secret.key }} -{{- end -}} -{{- end -}} - - -{{/* -Return license volume mount -*/}} -{{- define "victoria-metrics.license.volume" -}} -{{- if and .Values.license.secret.name .Values.license.secret.key -}} -- name: license-key - secret: - secretName: {{ .Values.license.secret.name }} -{{- end -}} -{{- end -}} - -{{/* -Return license volume mount for container -*/}} -{{- define "victoria-metrics.license.mount" -}} -{{- if and .Values.license.secret.name .Values.license.secret.key -}} -- name: license-key - mountPath: /etc/vm-license-key - readOnly: true -{{- end -}} -{{- end -}} - -{{/* -Enforce license for vmbackupmanager -*/}} -{{- define "victoria-metrics.vmbackupmanager.enforce_license" -}} -{{ if and .Values.server.vmbackupmanager.enable (not (or .Values.server.vmbackupmanager.eula .Values.license.key .Values.license.secret.name)) }} -{{ fail `Pass -eula command-line flag or valid license at .Values.license if you have an enterprise license for running this software. - See https://victoriametrics.com/legal/esa/ for details. - Documentation - https://docs.victoriametrics.com/enterprise.html - for more information, visit https://victoriametrics.com/products/enterprise/ - To request a trial license, go to https://victoriametrics.com/products/enterprise/trial/`}} -{{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/clusterrole.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/clusterrole.yaml deleted file mode 100644 index 44a86553a..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/clusterrole.yaml +++ /dev/null @@ -1,50 +0,0 @@ -{{- if and .Values.rbac.create (not .Values.rbac.namespaced) }} -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: {{ template "victoria-metrics.fullname" . }}-clusterrole - labels: - {{- include "victoria-metrics.common.metaLabels" . | nindent 4 }} - {{- if .Values.rbac.extraLabels }} -{{ toYaml .Values.rbac.extraLabels | indent 4}} - {{- end }} -{{- with .Values.rbac.annotations }} - annotations: -{{ toYaml . | indent 4 }} -{{- end }} -{{- if or .Values.rbac.pspEnabled .Values.server.scrape.enabled }} -rules: - {{- if .Values.server.scrape.enabled }} - - apiGroups: - - discovery.k8s.io - resources: - - endpointslices - verbs: ["get", "list", "watch"] - - apiGroups: [ "" ] - resources: - - nodes - - nodes/proxy - - nodes/metrics - - services - - endpoints - - pods - verbs: [ "get", "list", "watch" ] - - apiGroups: - - extensions - - networking.k8s.io - resources: - - ingresses - verbs: [ "get", "list", "watch" ] - - nonResourceURLs: [ "/metrics" ] - verbs: [ "get" ] - {{- end }} - {{- if and .Values.rbac.pspEnabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} - - apiGroups: ['extensions'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: [{{ template "victoria-metrics.fullname" . }}] - {{- end }} -{{- else }} -rules: [] -{{- end }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/clusterrolebinding.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/clusterrolebinding.yaml deleted file mode 100644 index bee3ea1d1..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/clusterrolebinding.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if and .Values.rbac.create (not .Values.rbac.namespaced) }} -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: {{ template "victoria-metrics.fullname" . }}-clusterrolebinding - labels: - {{- include "victoria-metrics.common.metaLabels" . | nindent 4 }} - {{- if .Values.rbac.extraLabels }} -{{ toYaml .Values.rbac.extraLabels | indent 4}} - {{- end }} -{{- with .Values.rbac.annotations }} - annotations: -{{ toYaml . | indent 4 }} -{{- end }} -subjects: - - kind: ServiceAccount - name: {{ template "victoria-metrics.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} -roleRef: - kind: ClusterRole - name: {{ template "victoria-metrics.fullname" . }}-clusterrole - apiGroup: rbac.authorization.k8s.io -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/extra-objects.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/extra-objects.yaml deleted file mode 100644 index a9bb3b6ba..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/extra-objects.yaml +++ /dev/null @@ -1,4 +0,0 @@ -{{ range .Values.extraObjects }} ---- -{{ tpl (toYaml .) $ }} -{{ end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/pdb.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/pdb.yaml deleted file mode 100644 index acdb390a3..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/pdb.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{- if .Values.podDisruptionBudget.enabled }} -{{- if .Capabilities.APIVersions.Has "policy/v1/PodDisruptionBudget" }} -apiVersion: policy/v1 -{{- else -}} -apiVersion: policy/v1beta1 -{{- end }} -kind: PodDisruptionBudget -metadata: - name: {{ template "victoria-metrics.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "victoria-metrics.common.metaLabels" . | nindent 4 }} - {{- if .Values.podDisruptionBudget.extraLabels }} -{{ toYaml .Values.podDisruptionBudget.extraLabels | indent 4}} - {{- end }} -spec: -{{- if .Values.podDisruptionBudget.minAvailable }} - minAvailable: {{ .Values.podDisruptionBudget.minAvailable }} -{{- end }} -{{- if .Values.podDisruptionBudget.maxUnavailable }} - maxUnavailable: {{ .Values.podDisruptionBudget.maxUnavailable }} -{{- end }} - selector: - matchLabels: - {{- include "victoria-metrics.server.matchLabels" . | nindent 6 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/podsecuritypolicy.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/podsecuritypolicy.yaml deleted file mode 100644 index 27affe23d..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/podsecuritypolicy.yaml +++ /dev/null @@ -1,42 +0,0 @@ -{{- if and .Values.rbac.pspEnabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "victoria-metrics.fullname" . }} - labels: - {{- include "victoria-metrics.common.metaLabels" . | nindent 4 }} - {{- if .Values.rbac.extraLabels }} -{{ toYaml .Values.rbac.extraLabels | indent 4}} - {{- end }} - annotations: - seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default' - seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' - {{- if .Values.rbac.annotations }} - {{ toYaml .Values.rbac.annotations | indent 4}} - {{- end }} -spec: - privileged: false - allowPrivilegeEscalation: false - requiredDropCapabilities: - # Default set from Docker, with DAC_OVERRIDE and CHOWN - - ALL - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'secret' - - 'downwardAPI' - - 'persistentVolumeClaim' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/role.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/role.yaml deleted file mode 100644 index 27fd2b8e0..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/role.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if and .Values.rbac.pspEnabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -{{- if .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ template "victoria-metrics.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "victoria-metrics.common.metaLabels" . | nindent 4 }} - {{- if .Values.rbac.extraLabels }} -{{ toYaml .Values.rbac.extraLabels | indent 4}} - {{- end }} -{{- with .Values.rbac.annotations }} - annotations: -{{ toYaml . | indent 4 }} -{{- end }} -rules: -- apiGroups: ['extensions'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: [{{ template "victoria-metrics.fullname" . }}] -{{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/rolebinding.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/rolebinding.yaml deleted file mode 100644 index df9d185bb..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/rolebinding.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{- if and .Values.rbac.pspEnabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }} -{{- if .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "victoria-metrics.fullname" . }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "victoria-metrics.common.metaLabels" . | nindent 4 }} - {{- if .Values.rbac.extraLabels }} -{{ toYaml .Values.rbac.extraLabels | indent 4}} - {{- end }} -{{- with .Values.rbac.annotations }} - annotations: -{{ toYaml . | indent 4 }} -{{- end }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "victoria-metrics.fullname" . }} -subjects: -- kind: ServiceAccount - name: {{ template "victoria-metrics.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} -{{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/scrape-configmap.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/scrape-configmap.yaml deleted file mode 100644 index 7d09eae64..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/scrape-configmap.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if and .Values.server.scrape.enabled (eq .Values.server.scrape.configMap "") }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "victoria-metrics.server.fullname" . }}-scrapeconfig - namespace: {{ .Release.Namespace }} - labels: {{- include "victoria-metrics.server.labels" . | nindent 4 }} -data: - scrape.yml: | - {{- range $k, $v := .Values.server.scrape.config }} - {{- if and (eq $k "scrape_configs") ($.Values.server.scrape.extraScrapeConfigs) }} - {{ dict $k (concat $v $.Values.server.scrape.extraScrapeConfigs) | toYaml | nindent 4 }} - {{- else }} - {{ dict $k $v | toYaml | nindent 4 }} - {{- end }} - {{- end }} -{{- end }} \ No newline at end of file diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-deployment.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-deployment.yaml deleted file mode 100644 index 3524e2593..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-deployment.yaml +++ /dev/null @@ -1,251 +0,0 @@ -{{- if and .Values.server.enabled (not .Values.server.statefulSet.enabled) -}} -{{ include "victoria-metrics.vmbackupmanager.enforce_license" . }} -apiVersion: apps/v1 -kind: Deployment -metadata: -{{- if .Values.server.annotations }} - annotations: -{{ toYaml .Values.server.annotations | indent 4 }} -{{- end }} - labels: - {{- include "victoria-metrics.server.labels" . | nindent 4 }} - {{- with .Values.server.extraLabels }} - {{ toYaml .}} - {{- end }} - name: {{ template "victoria-metrics.server.fullname" . }} - namespace: {{ .Release.Namespace }} -spec: - selector: - matchLabels: - {{- include "victoria-metrics.server.matchLabels" . | nindent 6 }} - replicas: 1 -{{- if .Values.server.persistentVolume.enabled }} - strategy: - # Must be "Recreate" when we have a persistent volume - type: Recreate -{{- end }} - template: - metadata: - {{- if .Values.server.podAnnotations }} - annotations: -{{ toYaml .Values.server.podAnnotations | indent 8 }} - {{- end }} - labels: - {{- include "victoria-metrics.server.labels" . | nindent 8 }} - {{- range $key, $value := .Values.server.podLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - spec: -{{- if .Values.server.priorityClassName }} - priorityClassName: "{{ .Values.server.priorityClassName }}" -{{- end }} -{{- if .Values.server.schedulerName }} - schedulerName: "{{ .Values.server.schedulerName }}" -{{- end }} - automountServiceAccountToken: {{ .Values.serviceAccount.automountToken }} - {{- if eq (include "victoria-metrics.hasInitContainer" . ) "true" -}} - initContainers: - {{- include "victoria-metrics.initContiners" . | nindent 8 }} - {{- end }} - containers: - - name: {{ template "victoria-metrics.name" . }}-{{ .Values.server.name }} - securityContext: - {{- toYaml .Values.server.securityContext | nindent 12 }} - image: "{{ .Values.server.image.repository }}:{{ .Values.server.image.tag }}" - imagePullPolicy: "{{ .Values.server.image.pullPolicy }}" - {{- if .Values.server.containerWorkingDir }} - workingDir: {{ .Values.server.containerWorkingDir }} - {{- end }} - args: - - {{ printf "%s=%s" "--retentionPeriod" (toString .Values.server.retentionPeriod) | quote}} - - {{ printf "%s=%s" "--storageDataPath" .Values.server.persistentVolume.mountPath | quote}} - {{- if .Values.server.scrape.enabled }} - - -promscrape.config=/scrapeconfig/scrape.yml - {{- end }} - {{- range $key, $value := .Values.server.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - {{- with (include "victoria-metrics.license.flag" .) }} - - {{ . }} - {{- end }} - {{- if .Values.server.envFrom }} - envFrom: - {{- with .Values.server.envFrom -}} - {{ toYaml . | nindent 12 }} - {{- end }} - {{- end }} - {{- with .Values.server.env }} - env: {{ toYaml . | nindent 10 }} - {{- end }} - ports: - - name: http - containerPort: 8428 - {{- if .Values.server.extraArgs.graphiteListenAddr }} - - name: graphite-tcp - protocol: TCP - containerPort: {{ include "split-host-port" .Values.server.extraArgs.graphiteListenAddr }} - {{- end }} - {{- if .Values.server.extraArgs.graphiteListenAddr }} - - name: graphite-udp - protocol: UDP - containerPort: {{ include "split-host-port" .Values.server.extraArgs.graphiteListenAddr }} - {{- end }} - {{- if .Values.server.extraArgs.influxListenAddr }} - - name: influx-tcp - protocol: TCP - containerPort: {{ include "split-host-port" .Values.server.extraArgs.influxListenAddr }} - {{- end }} - {{- if .Values.server.extraArgs.influxListenAddr }} - - name: influx-udp - protocol: UDP - containerPort: {{ include "split-host-port" .Values.server.extraArgs.influxListenAddr }} - {{- end }} - {{- if .Values.server.extraArgs.opentsdbHTTPListenAddr }} - - name: opentsdbhttp - protocol: TCP - containerPort: {{ include "split-host-port" .Values.server.extraArgs.opentsdbHTTPListenAddr }} - {{- end }} - {{- if .Values.server.extraArgs.opentsdbListenAddr }} - - name: opentsdb-tcp - protocol: TCP - containerPort: {{ include "split-host-port" .Values.server.extraArgs.opentsdbListenAddr }} - {{- end }} - {{- if .Values.server.extraArgs.opentsdbListenAddr }} - - name: opentsdb-udp - protocol: UDP - containerPort: {{ include "split-host-port" .Values.server.extraArgs.opentsdbListenAddr }} - {{- end }} - {{- with $.Values.server.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 12 }} - {{- end }} - {{- with $.Values.server.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 12 }} - {{- end }} - {{- with $.Values.server.startupProbe }} - startupProbe: - {{- toYaml . | nindent 12 }} - {{- end }} - resources: -{{ toYaml .Values.server.resources | indent 12 }} - volumeMounts: - - name: server-volume - mountPath: {{ .Values.server.persistentVolume.mountPath }} - subPath: {{ .Values.server.persistentVolume.subPath }} - {{- if .Values.server.scrape.enabled }} - - name: scrapeconfig - mountPath: /scrapeconfig - {{- end }} - {{- range .Values.server.extraHostPathMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- range .Values.server.extraConfigmapMounts }} - - name: {{ $.Values.server.name }}-{{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- range .Values.server.extraSecretMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- include "victoria-metrics.license.mount" . | nindent 12 }} - {{- with .Values.server.extraVolumeMounts }} - {{- toYaml . | nindent 12 }} - {{- end }} - {{- if .Values.server.vmbackupmanager.enable }} - - name: {{ template "victoria-metrics.name" . }}-vmbackupmanager - image: "{{ .Values.server.vmbackupmanager.image.repository }}:{{ .Values.server.vmbackupmanager.image.tag }}" - imagePullPolicy: "{{ .Values.server.image.pullPolicy }}" - args: - - {{ printf "%s=%t" "--eula" .Values.server.vmbackupmanager.eula | quote}} - - {{ printf "%s=%t" "--disableHourly" .Values.server.vmbackupmanager.disableHourly | quote}} - - {{ printf "%s=%t" "--disableDaily" .Values.server.vmbackupmanager.disableDaily | quote}} - - {{ printf "%s=%t" "--disableWeekly" .Values.server.vmbackupmanager.disableWeekly | quote}} - - {{ printf "%s=%t" "--disableMonthly" .Values.server.vmbackupmanager.disableMonthly | quote}} - - {{ printf "%s=%d" "--keepLastHourly" (int .Values.server.vmbackupmanager.retention.keepLastHourly) | quote}} - - {{ printf "%s=%d" "--keepLastDaily" (int .Values.server.vmbackupmanager.retention.keepLastDaily) | quote}} - - {{ printf "%s=%d" "--keepLastWeekly" (int .Values.server.vmbackupmanager.retention.keepLastWeekly) | quote}} - - {{ printf "%s=%d" "--keepLastMonthly" (int .Values.server.vmbackupmanager.retention.keepLastMonthly) | quote}} - - {{ printf "%s=%s" "--dst" (printf "%s/%s" .Values.server.vmbackupmanager.destination (include "victoria-metrics.name" .) ) | quote}} - - {{ printf "%s=%s" "--storageDataPath" .Values.server.persistentVolume.mountPath | quote}} - - "--snapshot.createURL=http://localhost:8428/snapshot/create" - - "--snapshot.deleteURL=http://localhost:8428/snapshot/delete" - {{- range $key, $value := .Values.server.vmbackupmanager.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - {{- with (include "victoria-metrics.license.flag" .) }} - - {{ . }} - {{- end }} - {{- with .Values.server.vmbackupmanager.resources }} - resources: {{ toYaml . | nindent 12 }} - {{- end }} - {{- with $.Values.server.vmbackupmanager.livenessProbe }} - livenessProbe: {{- toYaml . | nindent 12 }} - {{- end }} - {{- with $.Values.server.vmbackupmanager.readinessProbe }} - readinessProbe: {{- toYaml . | nindent 12 }} - {{- end }} - {{- with .Values.server.vmbackupmanager.env }} - env: {{ toYaml . | nindent 12 }} - {{- end }} - ports: - - name: manager-http - containerPort: 8300 - volumeMounts: - - name: server-volume - mountPath: {{ .Values.server.persistentVolume.mountPath }} - subPath: {{ .Values.server.persistentVolume.subPath }} - {{- with .Values.server.vmbackupmanager.extraVolumeMounts }} - {{- toYaml . | nindent 12 }} - {{- end }} - {{- include "victoria-metrics.license.mount" . | nindent 12 }} - {{- end }} - {{- with .Values.server.extraContainers }} - {{- toYaml . | nindent 8 }} - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.server.nodeSelector }} - nodeSelector: -{{ toYaml .Values.server.nodeSelector | indent 8 }} - {{- end }} - {{- if .Values.server.podSecurityContext }} - securityContext: -{{ toYaml .Values.server.podSecurityContext | indent 8 }} - {{- end }} - serviceAccountName: {{ template "victoria-metrics.serviceAccountName" . }} - {{- if .Values.server.tolerations }} - tolerations: -{{ toYaml .Values.server.tolerations | indent 8 }} - {{- end }} - {{- with .Values.server.affinity }} - affinity: {{ toYaml . | nindent 8 }} - {{- end }} - terminationGracePeriodSeconds: {{ .Values.server.terminationGracePeriodSeconds }} - volumes: - {{- if .Values.server.scrape.enabled }} - - name: scrapeconfig - configMap: - name: {{ include "victoria-metrics.server.scrape.configname" . }} - {{- end }} - {{- with .Values.server.extraVolumes }} - {{- toYaml . | nindent 6 }} - {{- end }} - - name: server-volume -{{- if .Values.server.persistentVolume.enabled }} - persistentVolumeClaim: - claimName: {{ if .Values.server.persistentVolume.existingClaim }}{{ .Values.server.persistentVolume.existingClaim }}{{- else }}{{ template "victoria-metrics.server.fullname" . }}{{- end }} -{{- else }} - emptyDir: {} -{{- end }} - {{- include "victoria-metrics.license.volume" . | nindent 8 }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-ingress.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-ingress.yaml deleted file mode 100644 index e353b9e53..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-ingress.yaml +++ /dev/null @@ -1,50 +0,0 @@ -{{- if and .Values.server.enabled .Values.server.ingress.enabled }} -{{- $ingressApiIsStable := eq (include "victoria-metrics.ingress.isStable" .) "true" -}} -{{- $ingressSupportsIngressClassName := eq (include "victoria-metrics.ingress.supportsIngressClassName" .) "true" -}} -{{- $ingressSupportsPathType := eq (include "victoria-metrics.ingress.supportsPathType" .) "true" -}} -{{- $servicePort := .Values.server.service.servicePort -}} -{{- $ingressPathType := .Values.server.ingress.pathType -}} -apiVersion: {{ include "victoria-metrics.ingress.apiVersion" . }} -kind: Ingress -metadata: -{{- if .Values.server.ingress.annotations }} - annotations: -{{ toYaml .Values.server.ingress.annotations | indent 4 }} -{{- end }} - labels: - {{- include "victoria-metrics.server.labels" . | nindent 4 }} - {{ if .Values.server.ingress.extraLabels }} -{{ toYaml .Values.server.ingress.extraLabels | indent 4 }} - {{ end }} - name: {{ template "victoria-metrics.server.fullname" . }} - namespace: {{ .Release.Namespace }} -spec: - {{- if and $ingressSupportsIngressClassName .Values.server.ingress.ingressClassName }} - ingressClassName: {{ .Values.server.ingress.ingressClassName }} - {{- end }} - rules: - {{- $serviceName := include "victoria-metrics.server.fullname" . }} - {{- range .Values.server.ingress.hosts }} - - host: {{ .name }} - http: - paths: - - path: {{ .path }} - {{- if $ingressSupportsPathType }} - pathType: {{ $ingressPathType }} - {{- end }} - backend: - {{- if $ingressApiIsStable }} - service: - name: {{ $serviceName }} - port: - number: {{ $servicePort }} - {{- else }} - serviceName: {{ $serviceName }} - servicePort: {{ .port | default "http"}} - {{- end }} - {{- end -}} -{{- if .Values.server.ingress.tls }} - tls: -{{ toYaml .Values.server.ingress.tls | indent 4 }} -{{- end -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-pvc.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-pvc.yaml deleted file mode 100644 index 35b3204b3..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-pvc.yaml +++ /dev/null @@ -1,33 +0,0 @@ -{{- if .Values.server.persistentVolume.enabled -}} -{{- if not .Values.server.statefulSet.enabled -}} -{{- if not .Values.server.persistentVolume.existingClaim -}} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ template "victoria-metrics.server.fullname" . }} - namespace: {{ .Release.Namespace }} -{{- with .Values.server.persistentVolume.annotations }} - annotations: -{{ toYaml . | indent 4 }} -{{- end }} - labels: -{{- include "victoria-metrics.server.labels" . | nindent 4 }} -spec: -{{- with .Values.server.persistentVolume.accessModes }} - accessModes: -{{ toYaml . | indent 4 }} -{{- end }} - resources: - requests: - storage: {{ .Values.server.persistentVolume.size | quote }} -{{- if .Values.server.persistentVolume.storageClass }} - storageClassName: {{ .Values.server.persistentVolume.storageClass | quote }} -{{- end }} -{{- with .Values.server.persistentVolume.matchLabels }} - selector: - matchLabels: - {{- toYaml . | nindent 6 }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service-headless.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service-headless.yaml deleted file mode 100644 index 9d6f22221..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service-headless.yaml +++ /dev/null @@ -1,72 +0,0 @@ -{{- if and .Values.server.enabled .Values.server.statefulSet.enabled -}} -apiVersion: v1 -kind: Service -metadata: - namespace: {{ .Release.Namespace }} -{{- if .Values.server.statefulSet.service.annotations }} - annotations: -{{ toYaml .Values.server.statefulSet.service.annotations | indent 4}} -{{- end }} - labels: - {{- include "victoria-metrics.server.labels" . | nindent 4 }} -{{- if .Values.server.statefulSet.service.labels }} -{{ toYaml .Values.server.statefulSet.service.labels | indent 4}} -{{- end }} - name: {{ template "victoria-metrics.server.fullname" . }} -spec: - clusterIP: None - {{- with .Values.server.statefulSet.service.healthCheckNodePort }} - healthCheckNodePort: {{ . }} - {{- end }} - {{- with .Values.server.statefulSet.service.externalTrafficPolicy }} - externalTrafficPolicy: {{ . }} - {{- end }} - ports: - - name: http - port: {{ .Values.server.statefulSet.service.servicePort }} - protocol: TCP - targetPort: http -{{- if .Values.server.extraArgs.graphiteListenAddr }} - - name: graphite-tcp - protocol: TCP - port: {{ include "split-host-port" .Values.server.extraArgs.graphiteListenAddr }} - targetPort: graphite-tcp -{{- end }} -{{- if .Values.server.extraArgs.graphiteListenAddr }} - - name: graphite-udp - protocol: UDP - port: {{ include "split-host-port" .Values.server.extraArgs.graphiteListenAddr }} - targetPort: graphite-udp -{{- end }} -{{- if .Values.server.extraArgs.influxListenAddr }} - - name: influx-tcp - protocol: TCP - port: {{ include "split-host-port" .Values.server.extraArgs.influxListenAddr }} - targetPort: influx-tcp -{{- end }} -{{- if .Values.server.extraArgs.influxListenAddr }} - - name: influx-udp - protocol: UDP - port: {{ include "split-host-port" .Values.server.extraArgs.influxListenAddr }} - targetPort: influx-udp -{{- end }} -{{- if .Values.server.extraArgs.opentsdbHTTPListenAddr }} - - name: opentsdbhttp - port: {{ include "split-host-port" .Values.server.extraArgs.opentsdbHTTPListenAddr }} - targetPort: opentsdbhttp -{{- end }} -{{- if .Values.server.extraArgs.opentsdbListenAddr }} - - name: opentsdb-udp - protocol: UDP - port: {{ include "split-host-port" .Values.server.extraArgs.opentsdbListenAddr }} - targetPort: opentsdb-udp -{{- end }} -{{- if .Values.server.extraArgs.opentsdbListenAddr }} - - name: opentsdb-tcp - protocol: TCP - port: {{ include "split-host-port" .Values.server.extraArgs.opentsdbListenAddr }} - targetPort: opentsdb-tcp -{{- end }} - selector: - {{- include "victoria-metrics.server.matchLabels" . | nindent 4 }} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service-monitor.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service-monitor.yaml deleted file mode 100644 index 8adfd9be5..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service-monitor.yaml +++ /dev/null @@ -1,44 +0,0 @@ -{{- if and .Values.server.enabled .Values.server.serviceMonitor.enabled -}} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - {{- if .Values.server.serviceMonitor.annotations }} - annotations: -{{ toYaml .Values.server.serviceMonitor.annotations | indent 4 }} - {{- end }} - labels: - {{- include "victoria-metrics.server.labels" . | nindent 4 }} - {{- if .Values.server.serviceMonitor.extraLabels }} -{{ toYaml .Values.server.serviceMonitor.extraLabels | indent 4 }} - {{- end }} - name: {{ template "victoria-metrics.server.fullname" . }} - {{- if .Values.server.serviceMonitor.namespace }} - namespace: {{ .Values.server.serviceMonitor.namespace }} - {{- end }} -spec: - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - selector: - matchLabels: - {{- include "victoria-metrics.server.matchLabels" . | nindent 6 }} - endpoints: - - port: http - {{- if .Values.server.serviceMonitor.scheme }} - scheme: {{ .Values.server.serviceMonitor.scheme }} - {{- end }} - {{- if .Values.server.serviceMonitor.interval }} - interval: {{ .Values.server.serviceMonitor.interval }} - {{- end }} - {{- if .Values.server.serviceMonitor.scrapeTimeout }} - scrapeTimeout: {{ .Values.server.serviceMonitor.scrapeTimeout }} - {{- end }} - {{- with .Values.server.serviceMonitor.tlsConfig }} - tlsConfig: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.server.serviceMonitor.relabelings }} - relabelings: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service.yaml deleted file mode 100644 index b58e7dfc2..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-service.yaml +++ /dev/null @@ -1,91 +0,0 @@ -{{- if and .Values.server.enabled (not .Values.server.statefulSet.enabled) -}} -apiVersion: v1 -kind: Service -metadata: - namespace: {{ .Release.Namespace }} -{{- if .Values.server.service.annotations }} - annotations: -{{ toYaml .Values.server.service.annotations | indent 4}} -{{- end }} - labels: - {{- include "victoria-metrics.server.labels" . | nindent 4 }} -{{- if .Values.server.service.labels }} -{{ toYaml .Values.server.service.labels | indent 4}} -{{- end }} - name: {{ template "victoria-metrics.server.fullname" . }} -spec: -{{- if .Values.server.service.clusterIP }} - clusterIP: {{ .Values.server.service.clusterIP }} -{{- end }} -{{- if .Values.server.service.externalIPs }} - externalIPs: -{{ toYaml .Values.server.service.externalIPs | indent 4 }} -{{- end }} -{{- if .Values.server.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.server.service.loadBalancerIP }} -{{- end }} -{{- if .Values.server.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- range $cidr := .Values.server.service.loadBalancerSourceRanges }} - - {{ $cidr }} - {{- end }} -{{- end }} - ports: - - name: http - port: {{ .Values.server.service.servicePort }} - protocol: TCP - targetPort: http - {{- with .Values.server.service.nodePort }} - nodePort: {{ . }} - {{- end }} -{{- if .Values.server.extraArgs.graphiteListenAddr }} - - name: graphite-tcp - protocol: TCP - port: {{ include "split-host-port" .Values.server.extraArgs.graphiteListenAddr }} - targetPort: graphite-tcp -{{- end }} -{{- if .Values.server.extraArgs.graphiteListenAddr }} - - name: graphite-udp - protocol: UDP - port: {{ include "split-host-port" .Values.server.extraArgs.graphiteListenAddr }} - targetPort: graphite-udp -{{- end }} -{{- if .Values.server.extraArgs.influxListenAddr }} - - name: influx-tcp - protocol: TCP - port: {{ include "split-host-port" .Values.server.extraArgs.influxListenAddr }} - targetPort: influx-tcp -{{- end }} -{{- if .Values.server.extraArgs.influxListenAddr }} - - name: influx-udp - protocol: UDP - port: {{ include "split-host-port" .Values.server.extraArgs.influxListenAddr }} - targetPort: influx-udp -{{- end }} -{{- if .Values.server.extraArgs.opentsdbHTTPListenAddr }} - - name: opentsdbhttp - port: {{ include "split-host-port" .Values.server.extraArgs.opentsdbHTTPListenAddr }} - targetPort: opentsdbhttp -{{- end }} -{{- if .Values.server.extraArgs.opentsdbListenAddr }} - - name: opentsdb-udp - protocol: UDP - port: {{ include "split-host-port" .Values.server.extraArgs.opentsdbListenAddr }} - targetPort: opentsdb-udp -{{- end }} -{{- if .Values.server.extraArgs.opentsdbListenAddr }} - - name: opentsdb-tcp - protocol: TCP - port: {{ include "split-host-port" .Values.server.extraArgs.opentsdbListenAddr }} - targetPort: opentsdb-tcp -{{- end }} - selector: - {{- include "victoria-metrics.server.matchLabels" . | nindent 4 }} - type: "{{ .Values.server.service.type }}" - {{- with .Values.server.service.healthCheckNodePort }} - healthCheckNodePort: {{ . }} - {{- end }} - {{- with .Values.server.service.externalTrafficPolicy }} - externalTrafficPolicy: {{ . }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-statefulset.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-statefulset.yaml deleted file mode 100644 index 534ee47cf..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/server-statefulset.yaml +++ /dev/null @@ -1,282 +0,0 @@ -{{- if and .Values.server.enabled .Values.server.statefulSet.enabled -}} -{{ include "victoria-metrics.vmbackupmanager.enforce_license" . }} -apiVersion: apps/v1 -kind: StatefulSet -metadata: - namespace: {{ .Release.Namespace }} -{{- if .Values.server.annotations }} - annotations: -{{ toYaml .Values.server.annotations | indent 4 }} -{{- end }} - labels: - {{- include "victoria-metrics.server.labels" . | nindent 4 }} - {{- with .Values.server.extraLabels }} - {{ toYaml .}} - {{- end}} - name: {{ template "victoria-metrics.server.fullname" . }} -spec: - serviceName: {{ template "victoria-metrics.server.fullname" . }} - selector: - matchLabels: - {{- include "victoria-metrics.server.matchLabels" . | nindent 6 }} - replicas: 1 - podManagementPolicy: {{ .Values.server.podManagementPolicy }} - template: - metadata: - {{- if .Values.server.podAnnotations }} - annotations: -{{ toYaml .Values.server.podAnnotations | indent 8 }} - {{- end }} - labels: - {{- include "victoria-metrics.server.labels" . | nindent 8 }} - {{- range $key, $value := .Values.server.podLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - spec: -{{- if .Values.server.priorityClassName }} - priorityClassName: "{{ .Values.server.priorityClassName }}" -{{- end }} -{{- if .Values.server.schedulerName }} - schedulerName: "{{ .Values.server.schedulerName }}" -{{- end }} - automountServiceAccountToken: {{ .Values.serviceAccount.automountToken }} - {{- if eq (include "victoria-metrics.hasInitContainer" . ) "true" }} - initContainers: - {{- include "victoria-metrics.initContiners" . | nindent 8 }} - {{- end }} - containers: - - name: {{ template "victoria-metrics.name" . }}-{{ .Values.server.name }} - {{- with .Values.server.securityContext }} - securityContext: {{- toYaml . | nindent 12 }} - {{- end }} - image: "{{ .Values.server.image.repository }}:{{ .Values.server.image.tag }}" - imagePullPolicy: "{{ .Values.server.image.pullPolicy }}" - {{- if .Values.server.containerWorkingDir }} - workingDir: {{ .Values.server.containerWorkingDir }} - {{- end }} - args: - - {{ printf "%s=%s" "--retentionPeriod" (toString .Values.server.retentionPeriod) | quote}} - - {{ printf "%s=%s" "--storageDataPath" .Values.server.persistentVolume.mountPath | quote}} - {{- if .Values.server.scrape.enabled }} - - -promscrape.config=/scrapeconfig/scrape.yml - {{- end }} - {{- range $key, $value := .Values.server.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - {{- with (include "victoria-metrics.license.flag" .) }} - - {{ . }} - {{- end }} - {{- if .Values.server.envFrom }} - envFrom: - {{- with .Values.server.envFrom -}} - {{ toYaml . | nindent 12 }} - {{- end }} - {{- end }} - {{- with .Values.server.env }} - env: {{ toYaml . | nindent 10 }} - {{- end }} - ports: - - name: http - containerPort: 8428 - {{- if .Values.server.extraArgs.graphiteListenAddr }} - - name: graphite-tcp - protocol: TCP - containerPort: {{ include "split-host-port" .Values.server.extraArgs.graphiteListenAddr }} - {{- end }} - {{- if .Values.server.extraArgs.graphiteListenAddr }} - - name: graphite-udp - protocol: UDP - containerPort: {{ include "split-host-port" .Values.server.extraArgs.graphiteListenAddr }} - {{- end }} - {{- if .Values.server.extraArgs.influxListenAddr }} - - name: influx-tcp - protocol: TCP - containerPort: {{ include "split-host-port" .Values.server.extraArgs.influxListenAddr }} - {{- end }} - {{- if .Values.server.extraArgs.influxListenAddr }} - - name: influx-udp - protocol: UDP - containerPort: {{ include "split-host-port" .Values.server.extraArgs.influxListenAddr }} - {{- end }} - {{- if .Values.server.extraArgs.opentsdbHTTPListenAddr }} - - name: opentsdbhttp - protocol: TCP - containerPort: {{ include "split-host-port" .Values.server.extraArgs.opentsdbHTTPListenAddr }} - {{- end }} - {{- if .Values.server.extraArgs.opentsdbListenAddr }} - - name: opentsdb-tcp - protocol: TCP - containerPort: {{ include "split-host-port" .Values.server.extraArgs.opentsdbListenAddr }} - {{- end }} - {{- if .Values.server.extraArgs.opentsdbListenAddr }} - - name: opentsdb-udp - protocol: UDP - containerPort: {{ include "split-host-port" .Values.server.extraArgs.opentsdbListenAddr }} - {{- end }} - {{- with $.Values.server.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 12 }} - {{- end }} - {{- with $.Values.server.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 12 }} - {{- end }} - {{- with $.Values.server.startupProbe }} - startupProbe: - {{- toYaml . | nindent 12 }} - {{- end }} - resources: - {{- toYaml .Values.server.resources | nindent 12 }} - volumeMounts: - - name: server-volume - mountPath: {{ .Values.server.persistentVolume.mountPath }} - subPath: {{ .Values.server.persistentVolume.subPath }} - {{- if .Values.server.scrape.enabled }} - - name: scrapeconfig - mountPath: /scrapeconfig - {{- end }} - {{- range .Values.server.extraHostPathMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- range .Values.server.extraConfigmapMounts }} - - name: {{ $.Values.server.name }}-{{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- range .Values.server.extraSecretMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- include "victoria-metrics.license.mount" . | nindent 12 }} - {{- with .Values.server.extraVolumeMounts }} - {{- toYaml . | nindent 12 }} - {{- end }} - {{- if .Values.server.vmbackupmanager.enable }} - - name: {{ template "victoria-metrics.name" . }}-vmbackupmanager - image: "{{ .Values.server.vmbackupmanager.image.repository }}:{{ .Values.server.vmbackupmanager.image.tag }}" - imagePullPolicy: "{{ .Values.server.image.pullPolicy }}" - args: - - {{ printf "%s=%t" "--eula" .Values.server.vmbackupmanager.eula | quote}} - - {{ printf "%s=%t" "--disableHourly" .Values.server.vmbackupmanager.disableHourly | quote}} - - {{ printf "%s=%t" "--disableDaily" .Values.server.vmbackupmanager.disableDaily | quote}} - - {{ printf "%s=%t" "--disableWeekly" .Values.server.vmbackupmanager.disableWeekly | quote}} - - {{ printf "%s=%t" "--disableMonthly" .Values.server.vmbackupmanager.disableMonthly | quote}} - - {{ printf "%s=%d" "--keepLastHourly" (int .Values.server.vmbackupmanager.retention.keepLastHourly) | quote}} - - {{ printf "%s=%d" "--keepLastDaily" (int .Values.server.vmbackupmanager.retention.keepLastDaily) | quote}} - - {{ printf "%s=%d" "--keepLastWeekly" (int .Values.server.vmbackupmanager.retention.keepLastWeekly) | quote}} - - {{ printf "%s=%d" "--keepLastMonthly" (int .Values.server.vmbackupmanager.retention.keepLastMonthly) | quote}} - - {{ printf "%s=%s" "--dst" (printf "%s/%s" .Values.server.vmbackupmanager.destination (include "victoria-metrics.name" .) ) | quote}} - - {{ printf "%s=%s" "--storageDataPath" .Values.server.persistentVolume.mountPath | quote}} - - "--snapshot.createURL=http://localhost:8428/snapshot/create" - - "--snapshot.deleteURL=http://localhost:8428/snapshot/delete" - {{- range $key, $value := .Values.server.vmbackupmanager.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - {{- with (include "victoria-metrics.license.flag" .) }} - - {{ . }} - {{- end }} - {{- with .Values.server.vmbackupmanager.resources }} - resources: {{ toYaml . | nindent 12 }} - {{- end }} - {{- with .Values.server.securityContext }} - securityContext: {{- toYaml . | nindent 12 }} - {{- end }} - {{- with $.Values.server.vmbackupmanager.livenessProbe }} - livenessProbe: {{- toYaml . | nindent 12 }} - {{- end }} - {{- with $.Values.server.vmbackupmanager.readinessProbe }} - readinessProbe: {{- toYaml . | nindent 12 }} - {{- end }} - {{- with .Values.server.vmbackupmanager.env }} - env: {{ toYaml . | nindent 12 }} - {{- end }} - ports: - - name: manager-http - containerPort: 8300 - volumeMounts: - - name: server-volume - mountPath: {{ .Values.server.persistentVolume.mountPath }} - subPath: {{ .Values.server.persistentVolume.subPath }} - {{- with .Values.server.vmbackupmanager.extraVolumeMounts }} - {{- toYaml . | nindent 12 }} - {{- end }} - {{- include "victoria-metrics.license.mount" . | nindent 12 }} - {{- end }} - {{- with .Values.server.extraContainers }} - {{- toYaml . | nindent 8 }} - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.server.nodeSelector }} - nodeSelector: -{{ toYaml .Values.server.nodeSelector | indent 8 }} - {{- end }} - {{- if .Values.server.podSecurityContext }} - securityContext: -{{ toYaml .Values.server.podSecurityContext | indent 8 }} - {{- end }} - serviceAccountName: {{ template "victoria-metrics.serviceAccountName" . }} - {{- if .Values.server.tolerations }} - tolerations: -{{ toYaml .Values.server.tolerations | indent 8 }} - {{- end }} - {{- with .Values.server.affinity }} - affinity: {{ toYaml . | nindent 8 }} - {{- end }} - terminationGracePeriodSeconds: {{ .Values.server.terminationGracePeriodSeconds }} - volumes: - {{- if .Values.server.scrape.enabled }} - - name: scrapeconfig - configMap: - name: {{ include "victoria-metrics.server.scrape.configname" . }} - {{- end }} - {{- if not .Values.server.persistentVolume.enabled }} - - name: server-volume - emptyDir: {} - {{- else }} - {{- if .Values.server.persistentVolume.existingClaim }} - - name: server-volume - persistentVolumeClaim: - claimName: {{ .Values.server.persistentVolume.existingClaim }} - {{- end }} - {{- end }} - {{- with .Values.server.extraVolumes }} - {{- toYaml . | nindent 8 }} - {{- end }} - {{- include "victoria-metrics.license.volume" . | nindent 8 }} - {{- if and .Values.server.persistentVolume.enabled (not .Values.server.persistentVolume.existingClaim) }} - volumeClaimTemplates: - - metadata: - name: server-volume - {{- if .Values.server.persistentVolume.annotations }} - annotations: -{{ toYaml .Values.server.persistentVolume.annotations | indent 10 }} - {{- end }} - spec: - accessModes: -{{ toYaml .Values.server.persistentVolume.accessModes | indent 10 }} - resources: - requests: - storage: "{{ .Values.server.persistentVolume.size }}" - {{- if .Values.server.persistentVolume.storageClass }} - {{- if (eq "-" .Values.server.persistentVolume.storageClass) }} - storageClassName: "" - {{- else }} - storageClassName: "{{ .Values.server.persistentVolume.storageClass }}" - {{- end }} - {{- end }} - {{- with .Values.server.persistentVolume.matchLabels }} - selector: - matchLabels: - {{- toYaml . | nindent 12 }} - {{- end }} -{{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/serviceaccount.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/serviceaccount.yaml deleted file mode 100644 index ebb616800..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/templates/serviceaccount.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if .Values.serviceAccount.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - {{- include "victoria-metrics.common.metaLabels" . | nindent 4 }} - {{- if .Values.serviceAccount.extraLabels }} -{{ toYaml .Values.serviceAccount.extraLabels | indent 4}} - {{- end }} -{{- with .Values.serviceAccount.annotations }} - annotations: -{{ toYaml . | indent 4 }} -{{- end }} - name: {{ template "victoria-metrics.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} -{{- end }} \ No newline at end of file diff --git a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/values.yaml b/thunder_deployment/infra/beta9/charts/victoria-metrics-single/values.yaml deleted file mode 100644 index 15dbe7810..000000000 --- a/thunder_deployment/infra/beta9/charts/victoria-metrics-single/values.yaml +++ /dev/null @@ -1,696 +0,0 @@ -# Default values for victoria-metrics. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -rbac: - create: true - # Note: The PSP will only be deployed, if Kubernetes (<1.25) supports the resource. - pspEnabled: true - namespaced: false - extraLabels: {} - # annotations: {} - -# -- Print chart notes -printNotes: true - -serviceAccount: - # -- Create service account. - create: true - # name: - extraLabels: {} - # annotations: {} - # -- Mount API token to pod directly - automountToken: true - -automountServiceAccountToken: true - -podDisruptionBudget: - # -- See `kubectl explain poddisruptionbudget.spec` for more. Ref: [https://kubernetes.io/docs/tasks/run-application/configure-pdb/](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) - enabled: false - # minAvailable: 1 - # maxUnavailable: 1 - extraLabels: {} - -server: - # -- Enable deployment of server component. Deployed as StatefulSet - enabled: true - # -- Server container name - name: server - image: - # -- Image repository - repository: victoriametrics/victoria-metrics - # -- Image tag - tag: v1.97.1 - # -- Image pull policy - pullPolicy: IfNotPresent - # -- Name of Priority Class - priorityClassName: "" - # -- Overrides the full name of server component - fullnameOverride: - # -- Data retention period in month - retentionPeriod: 1 - # Extra command line arguments for container of component - extraArgs: - envflag.enable: "true" - envflag.prefix: VM_ - loggerFormat: json - - # Additional hostPath mounts - extraHostPathMounts: - [] - #- name: certs-dir - # mountPath: /etc/kubernetes/certs - # subPath: "" - # hostPath: /etc/kubernetes/certs - # readOnly: true - - # Extra Volumes for the pod - extraVolumes: - [] - #- name: example - # configMap: - # name: example - - # Extra Volume Mounts for the container - extraVolumeMounts: - [] - # - name: example - # mountPath: /example - - extraContainers: - [] - #- name: config-reloader - # image: reloader-image - - initContainers: - [] - # - name: vmrestore - # image: victoriametrics/vmrestore:latest - # volumeMounts: - # - mountPath: /storage - # name: vmstorage-volume - # - mountPath: /etc/vm/creds - # name: secret-remote-storage-keys - # readOnly: true - # args: - # - -storageDataPath=/storage - # - -src=s3://your_bucket/folder/latest - # - -credsFilePath=/etc/vm/creds/credentials - - # -- Node tolerations for server scheduling to nodes with taints. Ref: [https://kubernetes.io/docs/concepts/configuration/assign-pod-node/](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/) - tolerations: - [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule" - - # -- Pod's node selector. Ref: [https://kubernetes.io/docs/user-guide/node-selection/](https://kubernetes.io/docs/user-guide/node-selection/) - nodeSelector: {} - - # -- Pod affinity - affinity: {} - - # -- Env variables - # -- Additional environment variables (ex.: secret tokens, flags) https://github.com/VictoriaMetrics/VictoriaMetrics#environment-variables - env: [] - - envFrom: [] - #- configMapRef: - # name: special-config - - # -- Container workdir - containerWorkingDir: "" - - ## Use an alternate scheduler, e.g. "stork". - ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ - ## - # schedulerName: - - persistentVolume: - # -- Create/use Persistent Volume Claim for server component. Empty dir if false - enabled: true - - # -- Array of access modes. Must match those of existing PV or dynamic provisioner. Ref: [http://kubernetes.io/docs/user-guide/persistent-volumes/](http://kubernetes.io/docs/user-guide/persistent-volumes/) - accessModes: - - ReadWriteOnce - # -- Persistant volume annotations - annotations: {} - - # -- StorageClass to use for persistent volume. Requires server.persistentVolume.enabled: true. If defined, PVC created automatically - storageClass: "" - - # -- Existing Claim name. If defined, PVC must be created manually before volume will be bound - existingClaim: "" - - # -- Bind Persistent Volume by labels. Must match all labels of targeted PV. - matchLabels: {} - - # -- Mount path. Server data Persistent Volume mount root path. - mountPath: /storage - # -- Mount subpath - subPath: "" - # -- Size of the volume. Should be calculated based on the metrics you send and retention policy you set. - size: 16Gi - - # -- Sts/Deploy additional labels - extraLabels: {} - # -- Pod's additional labels - podLabels: {} - # -- Pod's annotations - podAnnotations: {} - # -- Pod's management policy - podManagementPolicy: OrderedReady - - # -- Resource object. Ref: [http://kubernetes.io/docs/user-guide/compute-resources/](http://kubernetes.io/docs/user-guide/compute-resources/ - resources: - {} - # limits: - # cpu: 500m - # memory: 512Mi - # requests: - # cpu: 500m - # memory: 512Mi - - # Indicates whether the Container is ready to service requests. If the readiness probe fails, the endpoints controller removes the Pod's IP address from the endpoints of all Services that match the Pod. The default state of readiness before the initial delay is Failure. If a Container does not provide a readiness probe, the default state is Success. - readinessProbe: - httpGet: - path: /health - port: http - initialDelaySeconds: 5 - periodSeconds: 15 - timeoutSeconds: 5 - failureThreshold: 3 - - # Indicates whether the Container is running. If the liveness probe fails, the kubelet kills the Container, and the Container is subjected to its restart policy. If a Container does not provide a liveness probe, the default state is Success. - livenessProbe: - httpGet: - scheme: HTTP - path: /health - port: 8428 - initialDelaySeconds: 30 - periodSeconds: 30 - timeoutSeconds: 5 - failureThreshold: 10 - - # Indicates whether the Container is done with potentially costly initialization. If set it is executed first. If it fails Container is restarted. If it succeeds liveness and readiness probes takes over. - startupProbe: {} - #tcpSocket: - # port: http - #failureThreshold: 30 - #periodSeconds: 15 - #successThreshold: 1 - #timeoutSeconds: 5 - - # -- Security context to be added to server pods - securityContext: {} - # -- Pod's security context. Ref: [https://kubernetes.io/docs/tasks/configure-pod-container/security-context/](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) - podSecurityContext: {} - ingress: - # -- Enable deployment of ingress for server component - enabled: false - # -- Ingress annotations - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: 'true' - - # -- Ingress extra labels - extraLabels: {} - # -- Array of host objects - hosts: [] - # - name: vmselect.local - # path: /select - # port: http - - # -- Array of TLS objects - tls: [] - # - secretName: vmselect-ingress-tls - # hosts: - # - vmselect.local - # For Kubernetes >= 1.18 you should specify the ingress-controller via the field ingressClassName - # See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#specifying-the-class-of-an-ingress - # ingressClassName: nginx - # -- pathType is only for k8s >= 1.1= - pathType: Prefix - - vmbackupmanager: - # -- enable automatic creation of backup via vmbackupmanager. vmbackupmanager is part of Enterprise packages - enable: false - # -- should be true and means that you have the legal right to run a backup manager - # that can either be a signed contract or an email with confirmation to run the service in a trial period - # # https://victoriametrics.com/legal/esa/ - eula: false - image: - # -- vmbackupmanager image repository - repository: victoriametrics/vmbackupmanager - # -- vmbackupmanager image tag - tag: v1.97.1-enterprise - # -- disable hourly backups - disableHourly: false - # -- disable daily backups - disableDaily: false - # -- disable weekly backups - disableWeekly: false - # -- disable monthly backups - disableMonthly: false - # -- backup destination at S3, GCS or local filesystem. Release name will be included to path! - destination: "" - # -- backups' retention settings - retention: - # -- keep last N hourly backups. 0 means delete all existing hourly backups. Specify -1 to turn off - keepLastHourly: 2 - # -- keep last N daily backups. 0 means delete all existing daily backups. Specify -1 to turn off - keepLastDaily: 2 - # -- keep last N weekly backups. 0 means delete all existing weekly backups. Specify -1 to turn off - keepLastWeekly: 2 - # -- keep last N monthly backups. 0 means delete all existing monthly backups. Specify -1 to turn off - keepLastMonthly: 2 - extraArgs: - envflag.enable: "true" - envflag.prefix: VM_ - loggerFormat: json - # Extra Volume Mounts for the container - extraVolumeMounts: - [] - # - name: example - # mountPath: /example - # -- Allows to enable restore options for pod. - # Read more: https://docs.victoriametrics.com/vmbackupmanager.html#restore-commands - restore: - onStart: - enabled: false - resources: {} - # -- Additional environment variables (ex.: secret tokens, flags) https://github.com/VictoriaMetrics/VictoriaMetrics#environment-variables - env: [] - readinessProbe: - httpGet: - path: /health - port: manager-http - initialDelaySeconds: 5 - periodSeconds: 15 - timeoutSeconds: 5 - failureThreshold: 3 - livenessProbe: - tcpSocket: - port: manager-http - initialDelaySeconds: 30 - periodSeconds: 30 - timeoutSeconds: 5 - failureThreshold: 10 - service: - # -- Service annotations - annotations: {} - # -- Service labels - labels: {} - # -- Service ClusterIP - clusterIP: "" - # -- Service External IPs. Ref: [https://kubernetes.io/docs/user-guide/services/#external-ips]( https://kubernetes.io/docs/user-guide/services/#external-ips) - externalIPs: [] - # -- Service load balacner IP - loadBalancerIP: "" - # -- Load balancer source range - loadBalancerSourceRanges: [] - # -- Service port - servicePort: 8428 - # -- Node port - # nodePort: 30000 - # -- Service type - type: ClusterIP - # Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip - # externalTrafficPolicy: "local" - # healthCheckNodePort: 0 - - statefulSet: - # -- Creates statefulset instead of deployment, useful when you want to keep the cache - enabled: true - # -- Deploy order policy for StatefulSet pods - podManagementPolicy: OrderedReady - # Headless service for statefulset - service: - # -- Headless service annotations - annotations: {} - # -- Headless service labels - labels: {} - # -- Headless service port - servicePort: 8428 - # Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip - # externalTrafficPolicy: "local" - # healthCheckNodePort: 0 - # -- Pod's termination grace period in seconds - terminationGracePeriodSeconds: 60 - serviceMonitor: - # -- Enable deployment of Service Monitor for server component. This is Prometheus operator object - enabled: false - # -- Service Monitor labels - extraLabels: {} - # -- Service Monitor annotations - annotations: {} - # -- Commented. Prometheus scrape interval for server component -# interval: 15s - # -- Commented. Prometheus pre-scrape timeout for server component -# scrapeTimeout: 5s - # -- Commented. HTTP scheme to use for scraping. -# scheme: https - # -- Commented. TLS configuration to use when scraping the endpoint -# tlsConfig: -# insecureSkipVerify: true - # -- Service Monitor relabelings - relabelings: [] - - # -- Scrape configuration for victoriametrics - scrape: - # -- If true scrapes targets, creates config map or use specified one with scrape targets - enabled: false - # -- Use existing configmap if specified - # otherwise .config values will be used - configMap: "" - # -- Scrape config - config: - global: - scrape_interval: 15s - - # -- Scrape targets - scrape_configs: - # -- Scrape rule for scrape victoriametrics - - job_name: victoriametrics - static_configs: - - targets: [ "localhost:8428" ] - - ## COPY from Prometheus helm chart https://github.com/helm/charts/blob/master/stable/prometheus/values.yaml - - # -- Scrape config for API servers. - # - # Kubernetes exposes API servers as endpoints to the default/kubernetes - # service so this uses `endpoints` role and uses relabelling to only keep - # the endpoints associated with the default/kubernetes service using the - # default named port `https`. This works for single API server deployments as - # well as HA API server deployments. - - job_name: "kubernetes-apiservers" - kubernetes_sd_configs: - - role: endpoints - # Default to scraping over https. If required, just disable this or change to - # `http`. - scheme: https - # This TLS & bearer token file config is used to connect to the actual scrape - # endpoints for cluster components. This is separate to discovery auth - # configuration because discovery & scraping are two separate concerns in - # Prometheus. The discovery auth config is automatic if Prometheus runs inside - # the cluster. Otherwise, more config options have to be provided within the - # . - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - # If your node certificates are self-signed or use a different CA to the - # master CA, then you need to disable certificate verification. Note that - # certificate verification is an integral part of a secure infrastructure - # so this should only be disabled in a controlled environment. You can - # enable certificate verification by commenting the line below. - # - insecure_skip_verify: true - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - # Keep only the default/kubernetes service endpoints for the https port. This - # will add targets for each API server which Kubernetes adds an endpoint to - # the default/kubernetes service. - relabel_configs: - - source_labels: - [ - __meta_kubernetes_namespace, - __meta_kubernetes_service_name, - __meta_kubernetes_endpoint_port_name, - ] - action: keep - regex: default;kubernetes;https - # -- Scrape rule using kubernetes service discovery for nodes - - job_name: "kubernetes-nodes" - # Default to scraping over https. If required, just disable this or change to - # `http`. - scheme: https - # This TLS & bearer token file config is used to connect to the actual scrape - # endpoints for cluster components. This is separate to discovery auth - # configuration because discovery & scraping are two separate concerns in - # Prometheus. The discovery auth config is automatic if Prometheus runs inside - # the cluster. Otherwise, more config options have to be provided within the - # . - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - # If your node certificates are self-signed or use a different CA to the - # master CA, then you need to disable certificate verification. Note that - # certificate verification is an integral part of a secure infrastructure - # so this should only be disabled in a controlled environment. You can - # enable certificate verification by commenting the line below. - # - insecure_skip_verify: true - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - kubernetes_sd_configs: - - role: node - relabel_configs: - - action: labelmap - regex: __meta_kubernetes_node_label_(.+) - - target_label: __address__ - replacement: kubernetes.default.svc:443 - - source_labels: [ __meta_kubernetes_node_name ] - regex: (.+) - target_label: __metrics_path__ - replacement: /api/v1/nodes/$1/proxy/metrics - # -- Scrape rule using kubernetes service discovery for cadvisor - - job_name: "kubernetes-nodes-cadvisor" - # Default to scraping over https. If required, just disable this or change to - # `http`. - scheme: https - # This TLS & bearer token file config is used to connect to the actual scrape - # endpoints for cluster components. This is separate to discovery auth - # configuration because discovery & scraping are two separate concerns in - # Prometheus. The discovery auth config is automatic if Prometheus runs inside - # the cluster. Otherwise, more config options have to be provided within the - # . - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - # If your node certificates are self-signed or use a different CA to the - # master CA, then you need to disable certificate verification. Note that - # certificate verification is an integral part of a secure infrastructure - # so this should only be disabled in a controlled environment. You can - # enable certificate verification by commenting the line below. - # - insecure_skip_verify: true - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - kubernetes_sd_configs: - - role: node - # This configuration will work only on kubelet 1.7.3+ - # As the scrape endpoints for cAdvisor have changed - # if you are using older version you need to change the replacement to - # replacement: /api/v1/nodes/$1:4194/proxy/metrics - # more info here https://github.com/coreos/prometheus-operator/issues/633 - relabel_configs: - - action: labelmap - regex: __meta_kubernetes_node_label_(.+) - - target_label: __address__ - replacement: kubernetes.default.svc:443 - - source_labels: [ __meta_kubernetes_node_name ] - regex: (.+) - target_label: __metrics_path__ - replacement: /api/v1/nodes/$1/proxy/metrics/cadvisor - # ignore timestamps of cadvisor's metrics by default - # more info here https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4697#issuecomment-1656540535 - honor_timestamps: false - # -- Scrape config for service endpoints. - # - # The relabeling allows the actual service scrape endpoint to be configured - # via the following annotations: - # - # * `prometheus.io/scrape`: Only scrape services that have a value of `true` - # * `prometheus.io/scheme`: If the metrics endpoint is secured then you will need - # to set this to `https` & most likely set the `tls_config` of the scrape config. - # * `prometheus.io/path`: If the metrics path is not `/metrics` override this. - # * `prometheus.io/port`: If the metrics are exposed on a different port to the - # service then set this appropriately. - # -- Scrape rule using kubernetes service discovery for endpoints - - job_name: "kubernetes-service-endpoints" - kubernetes_sd_configs: - - role: endpoints - relabel_configs: - - action: drop - source_labels: [ __meta_kubernetes_pod_container_init ] - regex: true - - action: keep_if_equal - source_labels: [ __meta_kubernetes_service_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number ] - - source_labels: - [ __meta_kubernetes_service_annotation_prometheus_io_scrape ] - action: keep - regex: true - - source_labels: - [ __meta_kubernetes_service_annotation_prometheus_io_scheme ] - action: replace - target_label: __scheme__ - regex: (https?) - - source_labels: - [ __meta_kubernetes_service_annotation_prometheus_io_path ] - action: replace - target_label: __metrics_path__ - regex: (.+) - - source_labels: - [ - __address__, - __meta_kubernetes_service_annotation_prometheus_io_port, - ] - action: replace - target_label: __address__ - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) - - source_labels: [ __meta_kubernetes_namespace ] - action: replace - target_label: kubernetes_namespace - - source_labels: [ __meta_kubernetes_service_name ] - action: replace - target_label: kubernetes_name - - source_labels: [ __meta_kubernetes_pod_node_name ] - action: replace - target_label: kubernetes_node - # -- Scrape config for slow service endpoints; same as above, but with a larger - # timeout and a larger interval - # - # The relabeling allows the actual service scrape endpoint to be configured - # via the following annotations: - # - # * `prometheus.io/scrape-slow`: Only scrape services that have a value of `true` - # * `prometheus.io/scheme`: If the metrics endpoint is secured then you will need - # to set this to `https` & most likely set the `tls_config` of the scrape config. - # * `prometheus.io/path`: If the metrics path is not `/metrics` override this. - # * `prometheus.io/port`: If the metrics are exposed on a different port to the - # service then set this appropriately. - - job_name: "kubernetes-service-endpoints-slow" - scrape_interval: 5m - scrape_timeout: 30s - kubernetes_sd_configs: - - role: endpoints - relabel_configs: - - action: drop - source_labels: [ __meta_kubernetes_pod_container_init ] - regex: true - - action: keep_if_equal - source_labels: [ __meta_kubernetes_service_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number ] - - source_labels: - [ __meta_kubernetes_service_annotation_prometheus_io_scrape_slow ] - action: keep - regex: true - - source_labels: - [ __meta_kubernetes_service_annotation_prometheus_io_scheme ] - action: replace - target_label: __scheme__ - regex: (https?) - - source_labels: - [ __meta_kubernetes_service_annotation_prometheus_io_path ] - action: replace - target_label: __metrics_path__ - regex: (.+) - - source_labels: - [ - __address__, - __meta_kubernetes_service_annotation_prometheus_io_port, - ] - action: replace - target_label: __address__ - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) - - source_labels: [ __meta_kubernetes_namespace ] - action: replace - target_label: kubernetes_namespace - - source_labels: [ __meta_kubernetes_service_name ] - action: replace - target_label: kubernetes_name - - source_labels: [ __meta_kubernetes_pod_node_name ] - action: replace - target_label: kubernetes_node - # -- Example scrape config for probing services via the Blackbox Exporter. - # - # The relabeling allows the actual service scrape endpoint to be configured - # via the following annotations: - # - # * `prometheus.io/probe`: Only probe services that have a value of `true` - - job_name: "kubernetes-services" - metrics_path: /probe - params: - module: [ http_2xx ] - kubernetes_sd_configs: - - role: service - relabel_configs: - - source_labels: - [ __meta_kubernetes_service_annotation_prometheus_io_probe ] - action: keep - regex: true - - source_labels: [ __address__ ] - target_label: __param_target - - target_label: __address__ - replacement: blackbox - - source_labels: [ __param_target ] - target_label: instance - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) - - source_labels: [ __meta_kubernetes_namespace ] - target_label: kubernetes_namespace - - source_labels: [ __meta_kubernetes_service_name ] - target_label: kubernetes_name - # -- Example scrape config for pods - # - # The relabeling allows the actual pod scrape endpoint to be configured via the - # following annotations: - # - # * `prometheus.io/scrape`: Only scrape pods that have a value of `true` - # * `prometheus.io/path`: If the metrics path is not `/metrics` override this. - # * `prometheus.io/port`: Scrape the pod on the indicated port instead of the default of `9102`. - - job_name: "kubernetes-pods" - kubernetes_sd_configs: - - role: pod - relabel_configs: - - action: drop - source_labels: [ __meta_kubernetes_pod_container_init ] - regex: true - - action: keep_if_equal - source_labels: [ __meta_kubernetes_pod_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number ] - - source_labels: [ __meta_kubernetes_pod_annotation_prometheus_io_scrape ] - action: keep - regex: true - - source_labels: [ __meta_kubernetes_pod_annotation_prometheus_io_path ] - action: replace - target_label: __metrics_path__ - regex: (.+) - - source_labels: - [ __address__, __meta_kubernetes_pod_annotation_prometheus_io_port ] - action: replace - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - target_label: __address__ - - action: labelmap - regex: __meta_kubernetes_pod_label_(.+) - - source_labels: [ __meta_kubernetes_namespace ] - action: replace - target_label: kubernetes_namespace - - source_labels: [ __meta_kubernetes_pod_name ] - action: replace - target_label: kubernetes_pod_name - ## End of COPY - - # -- Extra scrape configs that will be appended to `server.scrape.config` - extraScrapeConfigs: [] - -# -- Add extra specs dynamically to this chart -extraObjects: [] - -# -- Enterprise license key configuration for VictoriaMetrics enterprise. -# Required only for VictoriaMetrics enterprise. -# Documentation - https://docs.victoriametrics.com/enterprise.html, -# for more information, visit https://victoriametrics.com/products/enterprise/ . -# To request a trial license, go to https://victoriametrics.com/products/enterprise/trial/ -# Supported starting from VictoriaMetrics v1.94.0 -license: - # -- License key - key: "" - - # -- Use existing secret with license key - secret: - # -- Existing secret name - name: "" - # -- Key in secret with license key - key: "" diff --git a/thunder_deployment/infra/beta9/templates/_helpers.tpl b/thunder_deployment/infra/beta9/templates/_helpers.tpl deleted file mode 100644 index 0a92753d7..000000000 --- a/thunder_deployment/infra/beta9/templates/_helpers.tpl +++ /dev/null @@ -1,120 +0,0 @@ -{{- define "beta9.init" -}} - {{/* Hack to disable main controller */}} - {{- $_ := include "beta9.disable-main-controller" . | fromYaml | merge .Values -}} - - {{/* Make sure all variables are set properly */}} - {{- include "bjw-s.common.loader.init" . }} - - {{/* Enforce default values */}} - {{- $_ := include "beta9" . | fromYaml | merge .Values -}} -{{- end -}} - - -{{/* Disable main controller */}} -{{- define "beta9.disable-main-controller" -}} -controllers: - main: - enabled: false -service: - main: - enabled: false -ingress: - main: - enabled: false -route: - main: - enabled: false -serviceMonitor: - main: - enabled: false -networkpolicies: - main: - enabled: false -{{- end -}} - - -{{/* Define hard coded defaults */}} -{{- define "beta9" -}} -controllers: - gateway: - type: deployment - pod: - annotations: - secret-hash: {{ include "sha256sum" (toYaml .Values.config) }} - containers: - main: - command: - - /usr/local/bin/gateway - image: - repository: {{ .Values.images.gateway.repository }} - tag: "{{ .Values.images.gateway.tag | default .Chart.AppVersion }}" - pullPolicy: {{ .Values.images.gateway.pullPolicy | default "IfNotPresent" }} - probes: - readiness: - enabled: true - custom: true - spec: - initialDelaySeconds: 5 - successThreshold: 2 - failureThreshold: 2 - periodSeconds: 3 - timeoutSeconds: 1 - grpc: - port: 1993 - service: readiness - liveness: - enabled: true - custom: true - spec: - initialDelaySeconds: 10 - successThreshold: 1 - failureThreshold: 10 - periodSeconds: 3 - timeoutSeconds: 1 - grpc: - port: 1993 - service: liveness - startup: - enabled: true - custom: true - spec: - periodSeconds: 3 - timeoutSeconds: 1 - failureThreshold: 100 - grpc: - port: 1993 - service: liveness - securityContext: - privileged: true - hostNetwork: true -service: - gateway: - controller: gateway -ingress: - gateway: - controller: gateway -serviceAccount: - create: true -persistence: - config-helm: - enabled: {{ if .Values.config }}true{{ else }}false{{ end }} - type: secret - name: beta9-config-helm - globalMounts: - - path: /etc/beta9.d/config.yaml - subPath: config.yaml - readOnly: true -{{- end -}} - - -{{/*Adds labels to custom manifests.*/}} -{{- define "manifests.metadata" -}} -metadata: - labels: - {{ include "bjw-s.common.lib.metadata.allLabels" . | nindent 4 }} -{{- end -}} - - -{{- define "sha256sum" -}} -{{- printf "%s" (. | sha256sum) | quote -}} -{{- end -}} diff --git a/thunder_deployment/infra/beta9/templates/cache-server-daemonset.yaml b/thunder_deployment/infra/beta9/templates/cache-server-daemonset.yaml deleted file mode 100644 index 1e78f0e0b..000000000 --- a/thunder_deployment/infra/beta9/templates/cache-server-daemonset.yaml +++ /dev/null @@ -1,111 +0,0 @@ -{{- if .Values.cacheServer.enabled -}} -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: {{ .Release.Name }}-cache-server - labels: - {{- include "bjw-s.common.lib.metadata.allLabels" . | nindent 4 }} - app.kubernetes.io/component: cache-server -spec: - selector: - matchLabels: - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: cache-server - template: - metadata: - labels: - {{- include "bjw-s.common.lib.metadata.allLabels" . | nindent 8 }} - app.kubernetes.io/component: cache-server - spec: - serviceAccountName: {{ .Values.serviceAccount.name }} - automountServiceAccountToken: true - terminationGracePeriodSeconds: 60 - {{- with .Values.cacheServer.priorityClassName }} - priorityClassName: {{ . | quote }} - {{- end }} - {{- if .Values.cacheServer.hostNetwork }} - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - {{- end }} - {{- with .Values.cacheServer.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.cacheServer.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.cacheServer.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.defaultPodOptions.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - containers: - - name: worker - image: {{ .Values.cacheServer.image.repository | default .Values.images.worker.repository }}:{{ .Values.cacheServer.image.tag | default .Values.images.worker.tag | default .Chart.AppVersion }} - imagePullPolicy: {{ .Values.cacheServer.image.pullPolicy | default .Values.images.worker.pullPolicy | default "IfNotPresent" }} - command: - - /usr/bin/tini - - -g - - -- - - /usr/local/bin/worker - {{- with .Values.cacheServer.securityContext }} - securityContext: - {{- toYaml . | nindent 10 }} - {{- end }} - env: - - name: CONFIG_PATH - value: /etc/beta9/config.yaml - - name: CACHE_SERVER_ONLY - value: "true" - - name: WORKER_POOL_NAME - value: {{ .Values.cacheServer.poolName | quote }} - - name: CACHE_LOCALITY - value: {{ .Values.cacheServer.locality | quote }} - - name: CACHE_NODE_ID - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: POD_UID - valueFrom: - fieldRef: - fieldPath: metadata.uid - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - - name: CACHE_HOST_NETWORK - value: {{ .Values.cacheServer.hostNetwork | quote }} - - name: CACHE_SERVER_PORT - value: {{ .Values.cacheServer.serverPort | quote }} - - name: WORKER_ID - value: cache-server-$(CACHE_NODE_ID) - ports: - - name: cache - containerPort: {{ .Values.cacheServer.serverPort }} - {{- if .Values.cacheServer.hostNetwork }} - hostPort: {{ .Values.cacheServer.serverPort }} - {{- end }} - volumeMounts: - - name: config - mountPath: /etc/beta9/config.yaml - subPath: config.yaml - readOnly: true - - name: cache - mountPath: {{ .Values.cacheServer.mountPath }} - {{- with .Values.cacheServer.resources }} - resources: - {{- toYaml . | nindent 10 }} - {{- end }} - volumes: - - name: config - secret: - secretName: {{ .Values.cacheServer.configSecretName }} - - name: cache - hostPath: - path: {{ .Values.cacheServer.hostPath }} - type: DirectoryOrCreate -{{- end -}} diff --git a/thunder_deployment/infra/beta9/templates/clusterrole.yaml b/thunder_deployment/infra/beta9/templates/clusterrole.yaml deleted file mode 100644 index 27951a732..000000000 --- a/thunder_deployment/infra/beta9/templates/clusterrole.yaml +++ /dev/null @@ -1,29 +0,0 @@ -{{- if .Values.serviceAccount.create -}} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ .Values.serviceAccount.name }}-role - labels: - {{- include "bjw-s.common.lib.metadata.allLabels" . | nindent 4 }} -rules: -- apiGroups: ["*"] - resources: ["*"] - verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ .Values.serviceAccount.name }}-role-binding - labels: - {{- include "bjw-s.common.lib.metadata.allLabels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ .Values.serviceAccount.name }}-role -subjects: -- kind: ServiceAccount - name: {{ .Values.serviceAccount.name }} - namespace: {{ .Release.Namespace }} ---- -{{- end -}} diff --git a/thunder_deployment/infra/beta9/templates/common.yaml b/thunder_deployment/infra/beta9/templates/common.yaml deleted file mode 100644 index e374dca62..000000000 --- a/thunder_deployment/infra/beta9/templates/common.yaml +++ /dev/null @@ -1,6 +0,0 @@ ---- -{{/* Set all variables properly */}} -{{- include "beta9.init" . -}} - -{{/* Render the templates */}} -{{- include "bjw-s.common.loader.all" . -}} diff --git a/thunder_deployment/infra/beta9/templates/manifests.yaml b/thunder_deployment/infra/beta9/templates/manifests.yaml deleted file mode 100644 index 70fc03f38..000000000 --- a/thunder_deployment/infra/beta9/templates/manifests.yaml +++ /dev/null @@ -1,9 +0,0 @@ -{{- $template := fromYaml (include "manifests.metadata" .) -}} -{{- range .Values.manifests.resources }} ---- -{{ toYaml (merge . $template) -}} -{{- end }} -{{- range $i, $t := .Values.manifests.templates }} ---- -{{ toYaml (merge (tpl $t $ | fromYaml) $template) -}} -{{- end }} diff --git a/thunder_deployment/infra/beta9/templates/registry.yaml b/thunder_deployment/infra/beta9/templates/registry.yaml deleted file mode 100644 index bcd44df08..000000000 --- a/thunder_deployment/infra/beta9/templates/registry.yaml +++ /dev/null @@ -1,83 +0,0 @@ -{{- if .Values.registry.enabled }} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: beta9-registry - labels: - {{- include "bjw-s.common.lib.metadata.allLabels" . | nindent 4 }} -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: {{ .Values.registry.persistence.size | quote }} - {{- if .Values.registry.persistence.storageClass }} - storageClassName: {{ .Values.registry.persistence.storageClass | quote }} - {{- end }} ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: beta9-registry - labels: - {{- include "bjw-s.common.lib.metadata.allLabels" . | nindent 4 }} - app.kubernetes.io/component: registry -spec: - replicas: 1 - selector: - matchLabels: - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/name: {{ include "bjw-s.common.lib.chart.names.name" . }} - app.kubernetes.io/component: registry - template: - metadata: - labels: - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/name: {{ include "bjw-s.common.lib.chart.names.name" . }} - app.kubernetes.io/component: registry - spec: - {{- with .Values.registry.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - containers: - - name: registry - image: {{ .Values.registry.image.repository }}:{{ .Values.registry.image.tag }} - imagePullPolicy: {{ .Values.registry.image.pullPolicy | default "IfNotPresent" }} - ports: - - name: registry - containerPort: 5000 - protocol: TCP - env: - - name: REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY - value: /var/lib/registry - volumeMounts: - - name: data - mountPath: /var/lib/registry - volumes: - - name: data - persistentVolumeClaim: - claimName: beta9-registry ---- -apiVersion: v1 -kind: Service -metadata: - name: beta9-registry - labels: - {{- include "bjw-s.common.lib.metadata.allLabels" . | nindent 4 }} - app.kubernetes.io/component: registry -spec: - type: {{ .Values.registry.service.type | default "ClusterIP" }} - selector: - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/name: {{ include "bjw-s.common.lib.chart.names.name" . }} - app.kubernetes.io/component: registry - ports: - - name: registry - port: {{ .Values.registry.service.port | default 5000 }} - targetPort: 5000 - protocol: TCP - {{- if eq (.Values.registry.service.type | default "ClusterIP") "NodePort" }} - nodePort: {{ .Values.registry.service.nodePort }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/templates/secret.yaml b/thunder_deployment/infra/beta9/templates/secret.yaml deleted file mode 100644 index 983b74ab9..000000000 --- a/thunder_deployment/infra/beta9/templates/secret.yaml +++ /dev/null @@ -1,11 +0,0 @@ -{{ if .Values.config }} -apiVersion: v1 -kind: Secret -type: Opaque -metadata: - name: beta9-config-helm - annotations: - config-hash: {{ include "sha256sum" (toYaml .Values.config) }} -data: - config.yaml: {{ .Values.config | toYaml | b64enc }} -{{- end }} diff --git a/thunder_deployment/infra/beta9/values.yaml b/thunder_deployment/infra/beta9/values.yaml deleted file mode 100644 index 7f7a4d15b..000000000 --- a/thunder_deployment/infra/beta9/values.yaml +++ /dev/null @@ -1,475 +0,0 @@ -# -- See the common values.yaml for all the options you can set. -# https://github.com/bjw-s/helm-charts/blob/common-2.5.0/charts/library/common/values.yaml -global: - labels: {} - annotations: {} - nameOverride: beta9 - -# -- Beta9's configuration. -# https://github.com/beam-cloud/beta9/blob/main/pkg/common/config.default.yaml -config: - gateway: - host: beta9-gateway - grpc: - externalHost: 100.73.254.107 - externalPort: 31993 - tls: false - port: 1993 - http: - externalHost: 100.73.254.107 - externalPort: 31994 - tls: false - port: 1994 - database: - postgres: - host: postgresql - port: 5432 - username: root - password: password - name: main - timezone: UTC - encryptionKey: sk_pKz38fK8v7lz01AneJI8MJnR70akmP2CtDNf1IufKcY= - redis: - mode: single - addrs: - - redis-master:6379 - password: "" - enableTLS: false - insecureSkipVerify: false - dialTimeout: 3s - storage: - mode: juicefs - fsName: beta9-fs - fsPath: /data - juicefs: - redisURI: redis://juicefs-redis-master:6379/0 - awsS3Bucket: http://localstack:4566/juicefs - worker: - imageRegistry: public.ecr.aws/n4e0e1y0 - imageName: beta9-worker - imageTag: 0.1.682 - hostNetwork: true - jobResourcesEnforced: true - imagePVCName: "" - pools: - default: - mode: local - priority: 1 - imagesPath: /var/lib/beta9/images - containerRuntime: gvisor - containerStartConcurrency: 32 - containerRuntimeConfig: - gvisorPlatform: systrap - gvisorRoot: /run/gvisor - gvisorExtraArgs: - - --overlay2=none - - --file-access=shared - networkPreallocation: true - networkSlotPoolSize: 32 - jobSpec: - nodeSelector: {} - criuEnabled: true - poolSizing: - defaultWorkerCPU: 2000m - defaultWorkerGPUType: "" - defaultWorkerMemory: 1Gi - minFreeCPU: 0 - minFreeGPU: 0 - minFreeMemory: 0 - build: - mode: local - requiresPoolSelector: true - imagesPath: /var/lib/beta9/images - containerRuntime: runc - containerRuntimeConfig: - gvisorPlatform: systrap - gvisorRoot: /run/gvisor - gvisorExtraArgs: - - --overlay2=none - - --file-access=shared - networkPreallocation: true - networkSlotPoolSize: 32 - tmpSizeLimit: 50Gi - jobSpec: - nodeSelector: - beta9.node-role: master - env: - - name: POD_HOSTNAME - value: 10.42.0.0 - poolSizing: - defaultWorkerCPU: 8000m - defaultWorkerGPUType: "" - defaultWorkerMemory: 32Gi - minFreeCPU: 8000m - minFreeGPU: 0 - minFreeMemory: 32Gi - sharedMemoryLimitPct: 100% - a6000: - mode: local - priority: 100 - imagesPath: /var/lib/beta9/images - gpuType: A6000 - runtime: nvidia - containerRuntime: runc - containerStartConcurrency: 8 - containerRuntimeConfig: - gvisorPlatform: systrap - gvisorRoot: /run/gvisor - gvisorExtraArgs: - - --overlay2=none - - --file-access=shared - networkPreallocation: true - networkSlotPoolSize: 32 - jobSpec: - nodeSelector: - beta9.node-role: gpu - beta9.gpu-type: A6000 - env: - - name: POD_HOSTNAME - value: 10.42.2.0 - poolSizing: - defaultWorkerCPU: 8000m - defaultWorkerGPUType: A6000 - defaultWorkerGPUCount: "1" - defaultWorkerMemory: 32Gi - minFreeCPU: 0 - minFreeGPU: 0 - minFreeMemory: 0 - sharedMemoryLimitPct: 100% - monitoring: - metricsCollector: none - prometheus: - scrapeWorkers: false - port: 9090 - - imageService: - registryStore: s3 - registries: - s3: - bucketName: beta9-images - region: us-east-1 - accessKey: test - secretKey: test - endpoint: http://localstack:4566 - forcePathStyle: true - runner: - baseImageRegistry: public.ecr.aws/n4e0e1y0 - buildRegistry: 100.73.254.107:32000 - buildRegistryInsecure: true - buildRepositoryName: beta9-users - managedCompute: - billableMarginPct: 0.10 - byoc: - pricing: - memoryHourlyMicrosPerGB: 4500 - cpuHourlyMicrosPerVCPU: 9500 - aws: - templateUrl: "" - billing: - mode: noop - endpoint: "" - authToken: "" - required: false - timeout: 5s - reconcileInterval: 1m - minimumCreditCents: 2500 - -registry: - enabled: true - image: - repository: registry - tag: 2.8.3 - pullPolicy: IfNotPresent - nodeSelector: - beta9.node-role: master - service: - type: NodePort - port: 5000 - nodePort: 32000 - persistence: - enabled: true - storageClass: local-path - size: 100Gi - -images: - gateway: - repository: public.ecr.aws/n4e0e1y0/beta9-gateway - tag: 0.1.714 - pullPolicy: # Defaults to IfNotPresent - worker: - repository: public.ecr.aws/n4e0e1y0/beta9-worker - tag: 0.1.682 - pullPolicy: # Defaults to IfNotPresent - -cacheServer: - enabled: false - configSecretName: beta9-config-helm - poolName: default - locality: default - serverPort: 2050 - hostPath: /var/lib/beta9/cache - mountPath: /var/lib/beta9/cache - hostNetwork: true - priorityClassName: - image: - repository: # Defaults to images.worker.repository - tag: # Defaults to images.worker.tag or chart app version - pullPolicy: # Defaults to images.worker.pullPolicy or IfNotPresent - nodeSelector: {} - affinity: {} - tolerations: [] - securityContext: - privileged: true - resources: - requests: - cpu: 250m - memory: 512Mi - limits: - cpu: "2" - memory: 2Gi - -controllers: - gateway: - annotations: {} - labels: {} - replicas: 1 - pod: - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - nodeSelector: - beta9.node-role: master - # 180s gateway shutdownTimeout + 10s readiness propagation + 5s buffer. - terminationGracePeriodSeconds: "195" - strategy: RollingUpdate - rollingUpdate: - unavailable: 1 - surge: "0" - containers: - main: - probes: - liveness: - enabled: false - readiness: - enabled: false - startup: - enabled: false - initContainers: - wait-on-backends: - image: - repository: busybox - tag: 1.37.0 - command: - - sh - - -c - - | - until nc -z postgresql 5432; do echo "Waiting on PostgreSQL..."; sleep 2; done; - until nc -z redis-master 6379; do echo "Waiting on Redis..."; sleep 2; done; - until nc -z juicefs-redis-master 6379; do echo "Waiting on Redis (JuiceFS)..."; sleep 2; done; - echo "All systems ready!" - -persistence: - images: - enabled: false - type: persistentVolumeClaim - size: 50Gi - storageClass: local-path - accessMode: ReadWriteOnce - -service: - gateway: - annotations: - prometheus.io/scrape: "true" - prometheus.io/port: "9090" - labels: {} - ports: - grpc: - port: 1993 - targetPort: 1993 - protocol: TCP - nodePort: 31993 - http: - primary: true - port: 1994 - targetPort: 1994 - protocol: TCP - nodePort: 31994 - metrics: - port: 9090 - targetPort: 9090 - protocol: TCP - type: NodePort - -ingress: - gateway: - enabled: false - annotations: {} - labels: {} - -serviceAccount: - name: beta9 - annotations: {} - labels: {} - -# -- In-memory cache for container images. -# https://github.com/beam-cloud/blobcache/deploy/charts/blobcache/values.yaml -blobcache: - enabled: false - -# -- Needed by Gateway -redis: - enabled: true - nameOverride: redis - fullnameOverride: redis - architecture: standalone - auth: - enabled: false - image: - tag: latest - volumePermissions: - image: - tag: latest - sysctl: - image: - tag: latest - master: - configuration: | - activedefrag yes - notify-keyspace-events AKE - persistence: - size: 1Gi - -# -- Needed by Gateway -postgresql: - enabled: true - nameOverride: postgresql - fullnameOverride: postgresql - image: - tag: latest - global: - postgresql: - auth: - username: root - password: password - database: main - primary: - extendedConfiguration: | - max_connections=400 - shared_buffers='400MB' - volumePermissions: - enabled: true - image: - tag: latest - persistence: - enabled: true - size: 1Gi - -# -- Needed by Gateway's file system -juicefs-redis: - enabled: true - nameOverride: juicefs-redis - fullnameOverride: juicefs-redis - architecture: standalone - auth: - enabled: false - image: - tag: latest - volumePermissions: - image: - tag: latest - sysctl: - image: - tag: latest - master: - persistence: - size: 1Gi - -# -- Enables deployment of victoria-metrics and grafana -metrics: - enabled: false - -grafana: - nameOverride: grafana - fullnameOverride: grafana - datasources: - datasources.yaml: - apiVersion: 1 - datasources: - - name: Victoria Metrics - type: prometheus - url: http://victoria-metrics-single:8428 - access: proxy - isDefault: true - -victoria-metrics-agent: - nameOverride: victoria-metrics-agent - fullnameOverride: victoria-metrics-agent - remoteWriteUrls: - - http://victoria-metrics-single:8428/api/v1/write - extraScrapeConfigs: - - job_name: beta9-pods - metrics_path: /metrics - scheme: http - honor_labels: true - scrape_timeout: 10s - scrape_interval: 15s - kubernetes_sd_configs: - - role: pod - namespaces: - names: - - beta9 - relabel_configs: - - source_labels: [__meta_kubernetes_pod_label_prometheus_io_scrape] - action: keep - regex: true - - source_labels: [__meta_kubernetes_pod_container_port_number] - action: keep - regex: 9090 - -victoria-metrics-single: - server: - fullnameOverride: victoria-metrics-single - -# -- Used to add any custom manifests -manifests: - resources: - - apiVersion: helm.cattle.io/v1 - kind: HelmChart - metadata: - name: localstack - spec: - repo: https://localstack.github.io/helm-charts - chart: localstack - createNamespace: false - version: 0.6.5 - valuesContent: |- - image: - tag: 3.8.1 - extraEnvVars: - - name: SERVICES - value: s3 - enableStartupScripts: true - startupScriptContent: | - #!/bin/bash - awslocal s3 mb s3://juicefs - awslocal s3 mb s3://beta9-images - persistence: - enabled: true - storageClass: local-path - accessModes: - - ReadWriteOnce - size: 50Gi - - apiVersion: v1 - kind: Service - metadata: - name: postgres-postgresql - spec: - type: ClusterIP - ports: - - name: tcp-postgresql - port: 5432 - targetPort: tcp-postgresql - selector: - app.kubernetes.io/component: primary - app.kubernetes.io/instance: beta9 - app.kubernetes.io/name: postgresql - templates: [] diff --git a/thunder_deployment/infra/gpu-node-labels.yaml b/thunder_deployment/infra/gpu-node-labels.yaml deleted file mode 100644 index a0a58f1bc..000000000 --- a/thunder_deployment/infra/gpu-node-labels.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: v1 -kind: Node -metadata: - name: REPLACE_WITH_GPU_NODE_NAME - labels: - beta9.node-role: gpu - beta9.gpu: "true" - beta9.gpu-type: A6000 - beta9.gpu-count: "8" diff --git a/thunder_deployment/infra/nvidia-runtimeclass/Chart.yaml b/thunder_deployment/infra/nvidia-runtimeclass/Chart.yaml deleted file mode 100644 index c54179695..000000000 --- a/thunder_deployment/infra/nvidia-runtimeclass/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -name: nvidia-runtimeclass -description: NVIDIA RuntimeClass for containers with GPU requirements, including gVisor support -type: application -version: 0.2.0 -appVersion: "1.0.0" \ No newline at end of file diff --git a/thunder_deployment/infra/nvidia-runtimeclass/templates/_helpers.tpl b/thunder_deployment/infra/nvidia-runtimeclass/templates/_helpers.tpl deleted file mode 100644 index 55c395524..000000000 --- a/thunder_deployment/infra/nvidia-runtimeclass/templates/_helpers.tpl +++ /dev/null @@ -1,49 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "nvidia-runtimeclass.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -*/}} -{{- define "nvidia-runtimeclass.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "nvidia-runtimeclass.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "nvidia-runtimeclass.labels" -}} -helm.sh/chart: {{ include "nvidia-runtimeclass.chart" . }} -{{ include "nvidia-runtimeclass.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "nvidia-runtimeclass.selectorLabels" -}} -app.kubernetes.io/name: {{ include "nvidia-runtimeclass.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} \ No newline at end of file diff --git a/thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-ctk-installer-daemonset.yaml b/thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-ctk-installer-daemonset.yaml deleted file mode 100644 index 4d5263c89..000000000 --- a/thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-ctk-installer-daemonset.yaml +++ /dev/null @@ -1,66 +0,0 @@ -{{- if .Values.devicePlugin.installer.enabled }} -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: nvidia-ctk-installer - namespace: kube-system - labels: - app.kubernetes.io/name: nvidia-ctk-installer - app.kubernetes.io/managed-by: {{ .Release.Service }} - helm.sh/chart: {{ include "nvidia-runtimeclass.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} -spec: - selector: - matchLabels: - name: nvidia-ctk-installer - updateStrategy: - type: RollingUpdate - template: - metadata: - labels: - name: nvidia-ctk-installer - spec: - hostPID: true - {{- with .Values.devicePlugin.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - tolerations: - - key: nvidia.com/gpu - operator: Exists - effect: NoSchedule - priorityClassName: "system-node-critical" - containers: - - name: nvidia-ctk-installer - image: {{ .Values.devicePlugin.installer.image }} - command: - - bash - - -c - - | - nvidia-ctk runtime configure --runtime=containerd --config=/etc/containerd/config.toml --set-as-default - nsenter --mount=/host/proc/1/ns/mnt -- systemctl restart containerd || true - echo "NVIDIA runtime configured successfully" - # Keep the container running - sleep infinity - {{- with .Values.devicePlugin.installer.securityContext }} - securityContext: - {{- toYaml . | nindent 10 }} - {{- end }} - {{- with .Values.devicePlugin.installer.volumeMounts }} - volumeMounts: - {{- toYaml . | nindent 8 }} - {{- end }} - volumes: - - name: host-root - hostPath: - path: / - type: Directory - - name: containerd-config - hostPath: - path: /etc/containerd - type: Directory - - name: containerd-socket - hostPath: - path: /run/containerd/containerd.sock - type: Socket -{{- end }} diff --git a/thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-device-plugin-daemonset.yaml b/thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-device-plugin-daemonset.yaml deleted file mode 100644 index 5f5e1cd79..000000000 --- a/thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-device-plugin-daemonset.yaml +++ /dev/null @@ -1,54 +0,0 @@ -{{- if .Values.devicePlugin.enabled }} -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: nvidia-device-plugin-daemonset - namespace: kube-system - labels: - app.kubernetes.io/name: nvidia-device-plugin - app.kubernetes.io/managed-by: {{ .Release.Service }} - helm.sh/chart: {{ include "nvidia-runtimeclass.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} -spec: - selector: - matchLabels: - name: nvidia-device-plugin-ds - updateStrategy: - type: RollingUpdate - template: - metadata: - labels: - name: nvidia-device-plugin-ds - spec: - {{- with .Values.devicePlugin.runtimeClassName }} - runtimeClassName: {{ . }} - {{- end }} - {{- with .Values.devicePlugin.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - tolerations: - - key: nvidia.com/gpu - operator: Exists - effect: NoSchedule - priorityClassName: "system-node-critical" - containers: - - image: {{ .Values.devicePlugin.image }} - name: nvidia-device-plugin-ctr - {{- with .Values.devicePlugin.env }} - env: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.devicePlugin.securityContext }} - securityContext: - {{- toYaml . | nindent 10 }} - {{- end }} - {{- with .Values.devicePlugin.volumeMounts }} - volumeMounts: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.devicePlugin.volumes }} - volumes: - {{- toYaml . | nindent 6 }} - {{- end }} -{{- end }} diff --git a/thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-runtimeclass.yaml b/thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-runtimeclass.yaml deleted file mode 100644 index 62e2138d5..000000000 --- a/thunder_deployment/infra/nvidia-runtimeclass/templates/nvidia-runtimeclass.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if .Values.enabled }} -apiVersion: node.k8s.io/v1 -kind: RuntimeClass -metadata: - name: nvidia - labels: - app.kubernetes.io/name: nvidia-runtimeclass - app.kubernetes.io/managed-by: {{ .Release.Service }} - helm.sh/chart: {{ include "nvidia-runtimeclass.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} -handler: {{ .Values.handler }} -{{- end }} \ No newline at end of file diff --git a/thunder_deployment/infra/nvidia-runtimeclass/values.yaml b/thunder_deployment/infra/nvidia-runtimeclass/values.yaml deleted file mode 100644 index 3aafc54aa..000000000 --- a/thunder_deployment/infra/nvidia-runtimeclass/values.yaml +++ /dev/null @@ -1,75 +0,0 @@ -# Default values for nvidia-runtimeclass. -# This is a YAML-formatted file. - -# Enable/disable the RuntimeClass deployment -enabled: true - -# RuntimeClass handler name -handler: nvidia - -# Enable/disable device plugin -devicePlugin: - enabled: true - runtimeClassName: nvidia - image: nvcr.io/nvidia/k8s-device-plugin:v0.18.2 - nodeSelector: - beta9.node-role: gpu - env: - - name: FAIL_ON_INIT_ERROR - value: "false" - - name: PASS_DEVICE_SPECS - value: "true" - - name: NVIDIA_VISIBLE_DEVICES - value: "all" - - name: NVIDIA_DRIVER_CAPABILITIES - value: "compute,utility" - securityContext: - allowPrivilegeEscalation: true - privileged: true - capabilities: - add: - - SYS_ADMIN - volumeMounts: - - name: device-plugin - mountPath: /var/lib/kubelet/device-plugins - - name: dev - mountPath: /dev - - name: containerd-config - mountPath: /etc/containerd - - name: containerd-socket - mountPath: /run/containerd/containerd.sock - volumes: - - name: device-plugin - hostPath: - path: /var/lib/kubelet/device-plugins - - name: dev - hostPath: - path: /dev - - name: containerd-config - hostPath: - path: /etc/containerd - type: Directory - - name: containerd-socket - hostPath: - path: /run/containerd/containerd.sock - type: Socket - - name: host-root - hostPath: - path: / - type: Directory - # NVIDIA Container Toolkit installer - installer: - enabled: true - image: nvcr.io/nvidia/k8s/container-toolkit:v1.17.4-ubuntu20.04 - securityContext: - privileged: true - volumeMounts: - - name: host-root - mountPath: /host - - name: containerd-config - mountPath: /etc/containerd - - name: containerd-socket - mountPath: /run/containerd/containerd.sock - -nameOverride: "" -fullnameOverride: "" diff --git a/thunder_deployment/provision/main.go b/thunder_deployment/provision/main.go deleted file mode 100644 index 79e587b5a..000000000 --- a/thunder_deployment/provision/main.go +++ /dev/null @@ -1,302 +0,0 @@ -package main - -import ( - "errors" - "flag" - "fmt" - "os" - "os/exec" - "path/filepath" - "strings" -) - -type nodeRole string -type runMode string - -const ( - roleMaster nodeRole = "master" - roleGPU nodeRole = "gpu" - roleCPU nodeRole = "cpu" - - modeCheck runMode = "check" - modeInstall runMode = "install" -) - -type options struct { - role nodeRole - mode runMode - host string - user string - keyPath string - remoteDir string - noCopy bool - k3sURL string - k3sToken string - k3sTLSSAN string - nodeName string - nodeIP string - flannelIface string - flannelBackend string - tailscaleAuthKey string - beamRegistry string - gpuType string - gpuCount string -} - -func main() { - opts := parseFlags() - if err := opts.validate(); err != nil { - fatal(err) - } - - root, err := deploymentRoot() - if err != nil { - fatal(err) - } - - if isLocal(opts.host) { - if err := runLocal(root, opts); err != nil { - fatal(err) - } - return - } - - if err := runRemote(root, opts); err != nil { - fatal(err) - } -} - -func parseFlags() options { - var opts options - flag.Var((*roleValue)(&opts.role), "role", "node role: master, gpu, or cpu") - flag.Var((*modeValue)(&opts.mode), "mode", "run mode: check or install") - flag.StringVar(&opts.host, "host", "local", "target host; use local, localhost, or 127.0.0.1 for this machine") - flag.StringVar(&opts.user, "user", os.Getenv("USER"), "ssh user for remote hosts") - flag.StringVar(&opts.keyPath, "key", "", "ssh private key for remote hosts") - flag.StringVar(&opts.remoteDir, "remote-dir", "/tmp/beam-deployment", "remote deployment directory") - flag.BoolVar(&opts.noCopy, "no-copy", false, "skip copying scripts and infra before running") - flag.StringVar(&opts.k3sURL, "k3s-url", os.Getenv("K3S_URL"), "k3s server URL for cpu/gpu workers, for example https://100.73.254.107:6443") - flag.StringVar(&opts.k3sToken, "k3s-token", os.Getenv("K3S_TOKEN"), "k3s node token for cpu/gpu workers") - flag.StringVar(&opts.k3sTLSSAN, "k3s-tls-san", os.Getenv("K3S_TLS_SAN"), "extra TLS SAN for the k3s server, usually the master Tailscale IP") - flag.StringVar(&opts.nodeName, "node-name", os.Getenv("K3S_NODE_NAME"), "Kubernetes node name to register") - flag.StringVar(&opts.nodeIP, "node-ip", os.Getenv("K3S_NODE_IP"), "Kubernetes node IP to advertise, usually this node's Tailscale IP") - flag.StringVar(&opts.flannelIface, "flannel-iface", os.Getenv("K3S_FLANNEL_IFACE"), "network interface for flannel traffic, for example tailscale0") - flag.StringVar(&opts.flannelBackend, "flannel-backend", os.Getenv("K3S_FLANNEL_BACKEND"), "server-side flannel backend, for example wireguard-native") - flag.StringVar(&opts.tailscaleAuthKey, "ts-authkey", os.Getenv("TS_AUTHKEY"), "optional Tailscale auth key for first-time login") - flag.StringVar(&opts.beamRegistry, "beam-registry", os.Getenv("BEAM_REGISTRY"), "optional registry prefix for image reachability checks") - flag.StringVar(&opts.gpuType, "gpu-type", os.Getenv("GPU_TYPE"), "GPU type label to apply on gpu nodes, default A6000") - flag.StringVar(&opts.gpuCount, "gpu-count", os.Getenv("GPU_COUNT"), "GPU count label and expected allocatable value on gpu nodes, default 8") - flag.Parse() - if opts.mode == "" { - opts.mode = modeCheck - } - return opts -} - -func (o options) validate() error { - switch o.role { - case roleMaster, roleGPU, roleCPU: - default: - return fmt.Errorf("unsupported role %q; expected master, gpu, or cpu", o.role) - } - switch o.mode { - case modeCheck, modeInstall: - default: - return fmt.Errorf("unsupported mode %q; expected check or install", o.mode) - } - if !isLocal(o.host) && strings.TrimSpace(o.user) == "" { - return errors.New("remote user is required") - } - if o.mode == modeInstall && (o.role == roleGPU || o.role == roleCPU) { - if strings.TrimSpace(o.k3sURL) == "" || strings.TrimSpace(o.k3sToken) == "" { - return errors.New("--k3s-url and --k3s-token are required when installing cpu/gpu worker nodes") - } - } - return nil -} - -func deploymentRoot() (string, error) { - exe, err := os.Executable() - if err == nil { - if root := findRoot(filepath.Dir(exe)); root != "" { - return root, nil - } - } - wd, err := os.Getwd() - if err != nil { - return "", err - } - if root := findRoot(wd); root != "" { - return root, nil - } - return "", errors.New("could not find deployment root containing scripts/run.sh") -} - -func findRoot(start string) string { - dir, _ := filepath.Abs(start) - for { - if fileExists(filepath.Join(dir, "scripts", "run.sh")) { - return dir - } - next := filepath.Dir(dir) - if next == dir { - return "" - } - dir = next - } -} - -func runLocal(root string, opts options) error { - script := filepath.Join(root, "scripts", "run.sh") - args := []string{"--role", string(opts.role), "--mode", string(opts.mode)} - return runCommandEnv("", opts.envPairs(), "bash", append([]string{script}, args...)...) -} - -func runRemote(root string, opts options) error { - target := opts.user + "@" + opts.host - if !opts.noCopy { - if err := runCommand("", "ssh", append(sshArgs(opts), target, "mkdir -p "+shellQuote(opts.remoteDir))...); err != nil { - return err - } - for _, name := range []string{"scripts", "infra"} { - src := filepath.Join(root, name) - if !dirExists(src) { - continue - } - dest := target + ":" + strings.TrimRight(opts.remoteDir, "/") + "/" - if err := runCommand("", "scp", append(scpArgs(opts), "-r", src, dest)...); err != nil { - return err - } - } - } - remoteScript := strings.TrimRight(opts.remoteDir, "/") + "/scripts/run.sh" - remoteCmd := fmt.Sprintf("%s bash %s --role %s --mode %s", opts.remoteEnvPrefix(), shellQuote(remoteScript), shellQuote(string(opts.role)), shellQuote(string(opts.mode))) - return runCommand("", "ssh", append(sshArgs(opts), target, strings.TrimSpace(remoteCmd))...) -} - -func (o options) remoteEnvPrefix() string { - return strings.Join(shellEnvAssignments(o.envPairs()), " ") -} - -func (o options) envPairs() []string { - values := map[string]string{ - "K3S_URL": o.k3sURL, - "K3S_TOKEN": o.k3sToken, - "K3S_TLS_SAN": o.k3sTLSSAN, - "K3S_NODE_NAME": o.nodeName, - "K3S_NODE_IP": o.nodeIP, - "K3S_FLANNEL_IFACE": o.flannelIface, - "K3S_FLANNEL_BACKEND": o.flannelBackend, - "TS_AUTHKEY": o.tailscaleAuthKey, - "BEAM_REGISTRY": o.beamRegistry, - "GPU_TYPE": o.gpuType, - "GPU_COUNT": o.gpuCount, - } - order := []string{"K3S_URL", "K3S_TOKEN", "K3S_TLS_SAN", "K3S_NODE_NAME", "K3S_NODE_IP", "K3S_FLANNEL_IFACE", "K3S_FLANNEL_BACKEND", "TS_AUTHKEY", "BEAM_REGISTRY", "GPU_TYPE", "GPU_COUNT"} - pairs := []string{} - for _, key := range order { - if strings.TrimSpace(values[key]) == "" { - continue - } - pairs = append(pairs, key+"="+values[key]) - } - return pairs -} - -func shellEnvAssignments(pairs []string) []string { - parts := []string{} - for _, pair := range pairs { - key, value, ok := strings.Cut(pair, "=") - if !ok || strings.TrimSpace(value) == "" { - continue - } - parts = append(parts, key+"="+shellQuote(value)) - } - return parts -} - -func sshArgs(opts options) []string { - args := []string{"-o", "StrictHostKeyChecking=accept-new"} - if opts.keyPath != "" { - args = append(args, "-i", expandHome(opts.keyPath)) - } - return args -} - -func scpArgs(opts options) []string { - args := []string{"-o", "StrictHostKeyChecking=accept-new"} - if opts.keyPath != "" { - args = append(args, "-i", expandHome(opts.keyPath)) - } - return args -} - -func runCommand(dir string, name string, args ...string) error { - return runCommandEnv(dir, nil, name, args...) -} - -func runCommandEnv(dir string, env []string, name string, args ...string) error { - cmd := exec.Command(name, args...) - cmd.Dir = dir - if len(env) > 0 { - cmd.Env = append(os.Environ(), env...) - } - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - cmd.Stdin = os.Stdin - return cmd.Run() -} - -func isLocal(host string) bool { - host = strings.TrimSpace(strings.ToLower(host)) - return host == "" || host == "local" || host == "localhost" || host == "127.0.0.1" || host == "0.0.0.0" || host == "::1" -} - -func fileExists(path string) bool { - info, err := os.Stat(path) - return err == nil && !info.IsDir() -} - -func dirExists(path string) bool { - info, err := os.Stat(path) - return err == nil && info.IsDir() -} - -func expandHome(path string) string { - if path == "~" { - if home, err := os.UserHomeDir(); err == nil { - return home - } - } - if strings.HasPrefix(path, "~/") { - if home, err := os.UserHomeDir(); err == nil { - return filepath.Join(home, strings.TrimPrefix(path, "~/")) - } - } - return path -} - -func shellQuote(s string) string { - return "'" + strings.ReplaceAll(s, "'", "'\\''") + "'" -} - -func fatal(err error) { - fmt.Fprintln(os.Stderr, "error:", err) - os.Exit(1) -} - -type roleValue nodeRole - -func (v *roleValue) String() string { return string(*v) } -func (v *roleValue) Set(s string) error { - *v = roleValue(strings.TrimSpace(strings.ToLower(s))) - return nil -} - -type modeValue runMode - -func (v *modeValue) String() string { return string(*v) } -func (v *modeValue) Set(s string) error { - *v = modeValue(strings.TrimSpace(strings.ToLower(s))) - return nil -} diff --git a/thunder_deployment/scripts/00-host-baseline.sh b/thunder_deployment/scripts/00-host-baseline.sh deleted file mode 100755 index 09b2a7b6a..000000000 --- a/thunder_deployment/scripts/00-host-baseline.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env bash -set -uo pipefail -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -. "$SCRIPT_DIR/common.sh" -parse_common_args "$@" - -record_fact role "$ROLE" -record_fact hostname "$(hostname -s)" -record_fact fqdn "$(hostname -f 2>/dev/null || hostname)" -record_fact kernel "$(uname -r)" -record_fact arch "$(uname -m)" - -if [ -r /etc/os-release ]; then - . /etc/os-release - record_fact os_id "${ID:-unknown}" - record_fact os_version "${VERSION_ID:-unknown}" - case "${ID:-}" in - ubuntu|debian) log_pass "supported OS family: ${ID:-unknown} ${VERSION_ID:-}" ;; - *) log_warn "untested OS family: ${ID:-unknown} ${VERSION_ID:-}" ;; - esac -else - log_warn "/etc/os-release not readable" -fi - -for cmd in bash sh awk sed grep cut sort uniq tr date hostname uname df free id; do - need_cmd "$cmd" || true -done - -for cmd in curl jq tar systemctl; do - if ! have_cmd "$cmd"; then - if require_install_mode "$cmd"; then - if have_cmd apt-get; then - run_sudo apt-get update - run_sudo apt-get install -y "$cmd" - else - log_fail "cannot install $cmd: apt-get not available" - fi - fi - else - log_pass "command available: $cmd" - fi -done - -root_avail_kb="$(df -Pk / | awk 'NR==2 {print $4}')" -record_fact root_available_kb "$root_avail_kb" -if [ "${root_avail_kb:-0}" -lt 10485760 ]; then - log_warn "root filesystem has less than 10GiB available" -else - log_pass "root filesystem free space is acceptable" -fi - -mem_mb="$(free -m | awk '/^Mem:/ {print $2}')" -record_fact memory_mb "${mem_mb:-0}" -if is_gpu && [ "${mem_mb:-0}" -lt 32768 ]; then - log_warn "GPU node has less than 32GiB RAM" -else - log_pass "memory check complete" -fi - -if timedatectl show -p NTPSynchronized --value >/tmp/beam-ntp 2>/dev/null; then - ntp="$(cat /tmp/beam-ntp)" - record_fact ntp_synchronized "$ntp" - [ "$ntp" = "yes" ] && log_pass "time synchronization enabled" || log_warn "time synchronization is not confirmed" -else - log_warn "timedatectl unavailable or not reporting NTP state" -fi - diff --git a/thunder_deployment/scripts/01-tailscale.sh b/thunder_deployment/scripts/01-tailscale.sh deleted file mode 100755 index 31b1226d9..000000000 --- a/thunder_deployment/scripts/01-tailscale.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env bash -set -uo pipefail -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -. "$SCRIPT_DIR/common.sh" -parse_common_args "$@" - -if ! have_cmd tailscale; then - if require_install_mode "tailscale"; then - if have_cmd curl; then - curl -fsSL https://tailscale.com/install.sh | sh - else - log_fail "curl is required to install tailscale" - fi - fi -fi - -if ! have_cmd tailscale; then - log_fail "tailscale command is unavailable" - exit 1 -fi - -log_pass "tailscale command available" - -if systemctl is-active --quiet tailscaled 2>/dev/null; then - log_pass "tailscaled service is active" -else - if is_install; then - run_sudo systemctl enable --now tailscaled || log_fail "failed to start tailscaled" - else - log_fail "tailscaled service is not active" - fi -fi - -ip="$(tailscale ip -4 2>/dev/null | head -n1 || true)" -if [ -z "$ip" ] && is_install && [ -n "${TS_AUTHKEY:-}" ]; then - run_sudo tailscale up --auth-key "$TS_AUTHKEY" --ssh || log_fail "tailscale authentication failed" - ip="$(tailscale ip -4 2>/dev/null | head -n1 || true)" -fi - -if [ -n "$ip" ]; then - record_fact tailscale_ip "$ip" - log_pass "tailscale IPv4 detected: $ip" -else - log_warn "tailscale is installed but not authenticated or no IPv4 address is assigned" -fi - -status="$(tailscale status --json 2>/dev/null || true)" -if [ -n "$status" ] && have_cmd jq; then - dns="$(printf '%s' "$status" | jq -r '.Self.DNSName // empty')" - if [ -n "$dns" ]; then - record_fact tailscale_dns "$dns" - log_pass "tailscale DNS detected: $dns" - fi -fi - diff --git a/thunder_deployment/scripts/02-k3s-server.sh b/thunder_deployment/scripts/02-k3s-server.sh deleted file mode 100755 index 4670fad8a..000000000 --- a/thunder_deployment/scripts/02-k3s-server.sh +++ /dev/null @@ -1,129 +0,0 @@ -#!/usr/bin/env bash -set -uo pipefail -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -. "$SCRIPT_DIR/common.sh" -parse_common_args "$@" -use_k3s_kubeconfig - -if ! is_master; then - log_skip "k3s server checks apply only to master nodes" - exit 0 -fi - -build_server_args() { - tls_san_args="" - if [ -n "${K3S_TLS_SAN:-}" ]; then - tls_san_args="--tls-san $K3S_TLS_SAN" - fi - - node_name_args="" - if [ -n "${K3S_NODE_NAME:-}" ]; then - node_name_args="--node-name $K3S_NODE_NAME" - fi - - network_args="" - if [ -n "${K3S_NODE_IP:-}" ]; then - network_args="$network_args --node-ip $K3S_NODE_IP" - fi - if [ -n "${K3S_FLANNEL_IFACE:-}" ]; then - network_args="$network_args --flannel-iface $K3S_FLANNEL_IFACE" - fi - if [ -n "${K3S_FLANNEL_BACKEND:-}" ]; then - network_args="$network_args --flannel-backend $K3S_FLANNEL_BACKEND" - fi - - SERVER_ARGS="server --write-kubeconfig-mode 0644 --node-label beta9.node-role=master $tls_san_args $node_name_args $network_args" -} - -install_or_reconcile_dropin() { - build_server_args - if [ -z "${K3S_NODE_IP:-}${K3S_FLANNEL_IFACE:-}${K3S_FLANNEL_BACKEND:-}${K3S_TLS_SAN:-}${K3S_NODE_NAME:-}" ]; then - return 0 - fi - - tmp="$(mktemp)" - { - printf '%s\n' '[Service]' - printf '%s\n' 'ExecStart=' - printf 'ExecStart=/usr/local/bin/k3s %s\n' "$SERVER_ARGS" - } > "$tmp" - - dropin_dir=/etc/systemd/system/k3s.service.d - dropin="$dropin_dir/10-beam-network.conf" - if ! run_sudo test -f "$dropin" || ! run_sudo cmp -s "$tmp" "$dropin"; then - run_sudo mkdir -p "$dropin_dir" - run_sudo cp "$tmp" "$dropin" - run_sudo systemctl daemon-reload - if systemctl is-active --quiet k3s 2>/dev/null; then - if [ "${K3S_FLANNEL_BACKEND:-}" = "wireguard-native" ] || [ "${K3S_FLANNEL_BACKEND:-}" = "wireguard" ]; then - run_sudo ip link delete flannel.1 2>/dev/null || true - iface="${K3S_FLANNEL_IFACE:-tailscale0}" - ip route show | awk -v iface="$iface" '$1 ~ /^10[.]42[.]/ && $0 ~ ("dev " iface) {print}' | while IFS= read -r route; do - [ -n "$route" ] && run_sudo ip route del $route 2>/dev/null || true - done - fi - run_sudo systemctl restart k3s - fi - log_pass "k3s server systemd drop-in reconciled" - else - log_pass "k3s server systemd drop-in already matches" - fi - rm -f "$tmp" -} - -if ! have_cmd k3s; then - if require_install_mode "k3s server"; then - build_server_args - curl -sfL https://get.k3s.io | sh -s - $SERVER_ARGS - fi -fi - -if is_install; then - install_or_reconcile_dropin -fi - -have_cmd k3s || { log_fail "k3s is not installed"; exit 1; } -log_pass "k3s command available" - -if systemctl is-active --quiet k3s 2>/dev/null; then - log_pass "k3s server service is active" -else - log_fail "k3s server service is not active" -fi - -if [ -r /etc/rancher/k3s/k3s.yaml ]; then - record_fact kubeconfig /etc/rancher/k3s/k3s.yaml - log_pass "k3s kubeconfig exists" -else - log_fail "missing /etc/rancher/k3s/k3s.yaml" -fi - -if run_sudo test -r /var/lib/rancher/k3s/server/node-token; then - record_fact k3s_node_token_path /var/lib/rancher/k3s/server/node-token - log_pass "k3s node token exists" -else - log_fail "missing k3s node token" -fi - -if have_cmd kubectl; then - if kubectl get nodes >/dev/null 2>&1; then - log_pass "kubectl can reach the cluster" - else - log_fail "kubectl cannot reach the cluster" - fi - - node="${K3S_NODE_NAME:-$(hostname -s)}" - if [ -n "${K3S_NODE_IP:-}" ]; then - internal_ip="$(kubectl get node "$node" -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}' 2>/dev/null || true)" - [ "$internal_ip" = "$K3S_NODE_IP" ] && log_pass "node advertises requested InternalIP: $K3S_NODE_IP" || log_warn "node InternalIP is ${internal_ip:-unknown}, expected $K3S_NODE_IP" - fi - if [ -n "${K3S_FLANNEL_BACKEND:-}" ]; then - backend="$(kubectl get node "$node" -o jsonpath='{.metadata.annotations.flannel\.alpha\.coreos\.com/backend-type}' 2>/dev/null || true)" - case "$K3S_FLANNEL_BACKEND:$backend" in - wireguard-native:wireguard|wireguard:wireguard|host-gw:host-gw|vxlan:vxlan) log_pass "flannel backend is $backend" ;; - *) log_warn "flannel backend is ${backend:-unknown}, expected $K3S_FLANNEL_BACKEND" ;; - esac - fi -else - log_warn "kubectl is not installed as a standalone command; k3s kubectl may still work" -fi diff --git a/thunder_deployment/scripts/03-k3s-agent.sh b/thunder_deployment/scripts/03-k3s-agent.sh deleted file mode 100755 index aba044b6f..000000000 --- a/thunder_deployment/scripts/03-k3s-agent.sh +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/env bash -set -uo pipefail -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -. "$SCRIPT_DIR/common.sh" -parse_common_args "$@" - -if is_master; then - log_skip "k3s agent checks are skipped on master nodes" - exit 0 -fi - -build_agent_args() { - gpu_type="${GPU_TYPE:-A6000}" - gpu_count="${GPU_COUNT:-8}" - install_args="agent --node-label beta9.node-role=cpu" - if is_gpu; then - install_args="agent --node-label beta9.node-role=gpu --node-label beta9.gpu=true --node-label beta9.gpu-type=$gpu_type --node-label beta9.gpu-count=$gpu_count" - fi - if [ -n "${K3S_NODE_NAME:-}" ]; then - install_args="$install_args --node-name $K3S_NODE_NAME" - fi - if [ -n "${K3S_NODE_IP:-}" ]; then - install_args="$install_args --node-ip $K3S_NODE_IP" - fi - if [ -n "${K3S_FLANNEL_IFACE:-}" ]; then - install_args="$install_args --flannel-iface $K3S_FLANNEL_IFACE" - fi - AGENT_ARGS="$install_args" -} - -reconcile_agent_dropin() { - build_agent_args - if [ -z "${K3S_NODE_IP:-}${K3S_FLANNEL_IFACE:-}${K3S_NODE_NAME:-}${GPU_TYPE:-}${GPU_COUNT:-}" ]; then - return 0 - fi - - tmp="$(mktemp)" - { - printf '%s\n' '[Service]' - printf '%s\n' 'ExecStart=' - printf 'ExecStart=/usr/local/bin/k3s %s\n' "$AGENT_ARGS" - } > "$tmp" - - dropin_dir=/etc/systemd/system/k3s-agent.service.d - dropin="$dropin_dir/10-beam-network.conf" - if ! run_sudo test -f "$dropin" || ! run_sudo cmp -s "$tmp" "$dropin"; then - run_sudo mkdir -p "$dropin_dir" - run_sudo cp "$tmp" "$dropin" - run_sudo systemctl daemon-reload - if systemctl is-active --quiet k3s-agent 2>/dev/null; then - run_sudo systemctl restart k3s-agent - fi - log_pass "k3s agent systemd drop-in reconciled" - else - log_pass "k3s agent systemd drop-in already matches" - fi - rm -f "$tmp" -} - -cleanup_stale_cni_state() { - [ "$MODE" = "install" ] || return 0 - - if run_sudo test -d /etc/cni/net.d; then - stale="$(run_sudo find /etc/cni/net.d -maxdepth 1 -type f \( -name '*cilium*' -o -name '05-cilium.conflist' \) -print 2>/dev/null || true)" - if [ -n "$stale" ]; then - backup_dir="/etc/cni/net.d/beam-backup-$(date -u +%Y%m%d%H%M%S)" - run_sudo mkdir -p "$backup_dir" - printf '%s\n' "$stale" | while IFS= read -r file; do - [ -n "$file" ] && run_sudo mv "$file" "$backup_dir/" - done - log_pass "stale Cilium CNI configs moved to $backup_dir" - fi - fi - - flannel_conf=/var/lib/rancher/k3s/agent/etc/cni/net.d/10-flannel.conflist - if run_sudo test -f "$flannel_conf"; then - run_sudo mkdir -p /etc/cni/net.d - run_sudo cp "$flannel_conf" /etc/cni/net.d/10-flannel.conflist - log_pass "k3s flannel CNI config installed in /etc/cni/net.d" - fi - - cni_dir=/var/lib/rancher/k3s/data/cni - if run_sudo test -d "$cni_dir"; then - run_sudo mkdir -p /opt/cni/bin - for plugin in "$cni_dir"/*; do - [ -e "$plugin" ] || continue - name="$(basename "$plugin")" - if ! run_sudo test -e "/opt/cni/bin/$name"; then - run_sudo ln -s "$plugin" "/opt/cni/bin/$name" - fi - done - log_pass "k3s CNI plugin binaries are available under /opt/cni/bin" - fi - - if [ "${K3S_FLANNEL_BACKEND:-}" = "wireguard-native" ] || [ "${K3S_FLANNEL_BACKEND:-}" = "wireguard" ]; then - run_sudo ip link delete flannel.1 2>/dev/null || true - iface="${K3S_FLANNEL_IFACE:-tailscale0}" - ip route show | awk -v iface="$iface" '$1 ~ /^10[.]42[.]/ && $0 ~ ("dev " iface) {print}' | while IFS= read -r route; do - [ -n "$route" ] && run_sudo ip route del $route 2>/dev/null || true - done - log_pass "stale flannel vxlan/host-gw routes cleaned for wireguard backend" - fi -} - -if ! have_cmd k3s; then - if is_install; then - if [ -z "${K3S_URL:-}" ] || [ -z "${K3S_TOKEN:-}" ]; then - log_fail "K3S_URL and K3S_TOKEN are required to install/join k3s agent" - exit 1 - fi - - build_agent_args - curl -sfL https://get.k3s.io | K3S_URL="$K3S_URL" K3S_TOKEN="$K3S_TOKEN" sh -s - $AGENT_ARGS - else - log_fail "k3s agent is not installed" - exit 1 - fi -fi - -if is_install; then - cleanup_stale_cni_state - reconcile_agent_dropin -fi - -log_pass "k3s command available" - -if systemctl is-active --quiet k3s-agent 2>/dev/null; then - log_pass "k3s-agent service is active" -else - log_fail "k3s-agent service is not active" -fi - -if [ -f /etc/systemd/system/k3s-agent.service.env ]; then - log_pass "k3s agent environment file exists" -else - log_warn "k3s agent environment file was not found" -fi diff --git a/thunder_deployment/scripts/04-container-runtime.sh b/thunder_deployment/scripts/04-container-runtime.sh deleted file mode 100755 index 4176a9075..000000000 --- a/thunder_deployment/scripts/04-container-runtime.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env bash -set -uo pipefail -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -. "$SCRIPT_DIR/common.sh" -parse_common_args "$@" - -if have_cmd crictl; then - log_pass "crictl command available" -else - log_warn "crictl not found; k3s may still include it under /var/lib/rancher/k3s/data" -fi - -if have_cmd docker; then - log_pass "docker command available" - if systemctl is-active --quiet docker 2>/dev/null; then - log_pass "docker service is active" - else - log_warn "docker command exists but service is not active" - fi -else - if is_gpu; then - log_warn "docker is not installed; required only for agent-backed worker-container mode, not local k3s pools" - else - log_skip "docker not required for role=$ROLE local k3s path" - fi -fi - -if [ -S /run/k3s/containerd/containerd.sock ] || [ -S /run/containerd/containerd.sock ]; then - log_pass "containerd socket detected" -else - log_warn "containerd socket not detected" -fi - -if is_gpu; then - if have_cmd nvidia-ctk; then - log_pass "nvidia-ctk command available" - else - log_warn "nvidia-ctk missing; NVIDIA container toolkit may be incomplete" - fi -else - log_skip "NVIDIA runtime checks are skipped for role=$ROLE" -fi - diff --git a/thunder_deployment/scripts/05-nvidia.sh b/thunder_deployment/scripts/05-nvidia.sh deleted file mode 100755 index 347b42d8b..000000000 --- a/thunder_deployment/scripts/05-nvidia.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env bash -set -uo pipefail -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -. "$SCRIPT_DIR/common.sh" -parse_common_args "$@" - -if ! is_gpu; then - log_skip "NVIDIA checks apply only to gpu nodes" - exit 0 -fi - -if ! have_cmd nvidia-smi; then - log_fail "nvidia-smi is missing; install NVIDIA driver before continuing" - exit 1 -fi - -log_pass "nvidia-smi command available" - -expected_gpu_count="${GPU_COUNT:-8}" -expected_gpu_type="${GPU_TYPE:-A6000}" -gpu_count="$(nvidia-smi -L 2>/dev/null | grep -c '^GPU ' || true)" -record_fact gpu_count "$gpu_count" -if [ "$gpu_count" -eq "$expected_gpu_count" ]; then - log_pass "detected $expected_gpu_count NVIDIA GPUs" -else - log_fail "expected $expected_gpu_count NVIDIA GPUs, detected $gpu_count" -fi - -if nvidia-smi -L | grep -qi "$expected_gpu_type"; then - record_fact gpu_type "$expected_gpu_type" - log_pass "detected $expected_gpu_type GPU model" -else - log_fail "$expected_gpu_type GPU model was not detected" -fi - -driver="$(nvidia-smi --query-gpu=driver_version --format=csv,noheader 2>/dev/null | head -n1 || true)" -record_fact nvidia_driver_version "$driver" -[ -n "$driver" ] && log_pass "NVIDIA driver version: $driver" || log_warn "could not determine NVIDIA driver version" - -if have_cmd docker; then - if docker info >/dev/null 2>&1; then - log_pass "docker daemon is reachable" - if docker run --rm --gpus all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi >/tmp/beam-docker-nvidia-smi.out 2>/tmp/beam-docker-nvidia-smi.err; then - log_pass "docker GPU smoke test passed" - else - log_warn "docker GPU smoke test failed; local k3s GPU scheduling can still work if containerd is configured" - fi - else - log_warn "docker exists but daemon is not reachable" - fi -else - log_skip "docker GPU smoke test skipped because docker is unavailable" -fi - diff --git a/thunder_deployment/scripts/06-k8s-gpu-device-plugin.sh b/thunder_deployment/scripts/06-k8s-gpu-device-plugin.sh deleted file mode 100755 index 2699b37d3..000000000 --- a/thunder_deployment/scripts/06-k8s-gpu-device-plugin.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env bash -set -uo pipefail -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -. "$SCRIPT_DIR/common.sh" -parse_common_args "$@" -use_k3s_kubeconfig - -if is_cpu; then - log_skip "Kubernetes GPU device plugin checks skipped on cpu nodes" - exit 0 -fi - -if is_gpu; then - if have_cmd kubectl; then - node="${K3S_NODE_NAME:-$(hostname -s)}" - alloc="$(kubectl get node "$node" -o jsonpath='{.status.allocatable.nvidia\.com/gpu}' 2>/dev/null || true)" - expected_gpu_count="${GPU_COUNT:-8}" - if [ "$alloc" = "$expected_gpu_count" ]; then - log_pass "node advertises nvidia.com/gpu=$expected_gpu_count" - elif [ -n "$alloc" ]; then - log_fail "node advertises nvidia.com/gpu=$alloc, expected $expected_gpu_count" - else - log_warn "could not read this node's GPU allocatable value; run this check from a kubeconfig-capable host or verify from master" - fi - else - log_skip "kubectl unavailable on gpu node; master-side verification required" - fi - exit 0 -fi - -if is_master; then - if ! have_cmd kubectl; then - log_fail "kubectl is required on master to verify/install the NVIDIA runtime chart" - exit 1 - fi - - if kubectl get runtimeclass nvidia >/dev/null 2>&1; then - log_pass "nvidia RuntimeClass is installed" - else - log_warn "nvidia RuntimeClass is not installed" - fi - - if kubectl -n kube-system get ds nvidia-device-plugin-daemonset >/dev/null 2>&1; then - log_pass "NVIDIA device plugin daemonset is installed" - else - log_warn "NVIDIA device plugin daemonset is not installed" - fi - - if kubectl -n kube-system get ds nvidia-ctk-installer >/dev/null 2>&1; then - log_pass "NVIDIA container toolkit installer daemonset is installed" - else - log_warn "NVIDIA container toolkit installer daemonset is not installed" - fi - - if is_install; then - if ! have_cmd helm; then - log_fail "helm is required to install infra/nvidia-runtimeclass" - exit 1 - fi - - chart_dir="$(cd "$SCRIPT_DIR/.." && pwd)/infra/nvidia-runtimeclass" - if ! helm -n kube-system status nvidia-runtimeclass >/dev/null 2>&1 \ - && kubectl get runtimeclass nvidia >/dev/null 2>&1; then - kubectl delete runtimeclass nvidia || { log_fail "failed to remove unmanaged nvidia RuntimeClass"; exit 1; } - fi - helm upgrade --install nvidia-runtimeclass "$chart_dir" \ - --namespace kube-system \ - --create-namespace || { log_fail "failed to install NVIDIA runtime chart"; exit 1; } - fi -fi - diff --git a/thunder_deployment/scripts/07-registry-access.sh b/thunder_deployment/scripts/07-registry-access.sh deleted file mode 100755 index 520d5d6bc..000000000 --- a/thunder_deployment/scripts/07-registry-access.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env bash -set -uo pipefail -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -. "$SCRIPT_DIR/common.sh" -parse_common_args "$@" - -registry="${BEAM_REGISTRY:-}" -if [ -z "$registry" ]; then - log_warn "BEAM_REGISTRY is not set; skipping registry pull checks" - exit 0 -fi - -record_fact beam_registry "$registry" - -if have_cmd docker && docker info >/dev/null 2>&1; then - image="$registry/beta9-worker:latest" - if is_master; then - image="$registry/beta9-gateway:latest" - fi - if docker manifest inspect "$image" >/dev/null 2>&1 || docker pull "$image" >/dev/null 2>&1; then - log_pass "registry image reachable: $image" - else - log_warn "could not verify registry image: $image" - fi -else - log_skip "docker unavailable; registry checks should be performed through Kubernetes image pulls" -fi - diff --git a/thunder_deployment/scripts/08-beta9-readiness.sh b/thunder_deployment/scripts/08-beta9-readiness.sh deleted file mode 100755 index b1262360a..000000000 --- a/thunder_deployment/scripts/08-beta9-readiness.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env bash -set -uo pipefail -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -. "$SCRIPT_DIR/common.sh" -parse_common_args "$@" -use_k3s_kubeconfig - -if ! is_master; then - log_skip "Beta9 cluster readiness checks are master-side only" - exit 0 -fi - -if ! have_cmd kubectl; then - log_fail "kubectl is required for Beta9 readiness checks" - exit 1 -fi - -if is_install; then - if ! have_cmd helm; then - log_fail "helm is required to install infra/beta9" - exit 1 - fi - - chart_dir="$(cd "$SCRIPT_DIR/.." && pwd)/infra/beta9" - helm repo add bjw-s-labs https://bjw-s-labs.github.io/helm-charts --force-update >/dev/null \ - || { log_fail "failed to configure bjw-s-labs Helm repo"; exit 1; } - helm repo add bitnami https://charts.bitnami.com/bitnami --force-update >/dev/null \ - || { log_fail "failed to configure bitnami Helm repo"; exit 1; } - helm repo add grafana https://grafana.github.io/helm-charts --force-update >/dev/null \ - || { log_fail "failed to configure grafana Helm repo"; exit 1; } - helm repo add victoria-metrics https://victoriametrics.github.io/helm-charts --force-update >/dev/null \ - || { log_fail "failed to configure victoria-metrics Helm repo"; exit 1; } - helm repo update || { log_fail "failed to update Helm repos"; exit 1; } - helm dependency build "$chart_dir" || { log_fail "failed to build Beta9 chart dependencies"; exit 1; } - helm upgrade --install beta9 "$chart_dir" \ - --namespace beta9 \ - --create-namespace \ - --wait \ - --timeout 15m || { log_fail "failed to install Beta9 chart"; exit 1; } -fi - -if kubectl get namespace beta9 >/dev/null 2>&1; then - log_pass "beta9 namespace exists" -else - log_warn "beta9 namespace does not exist yet" - exit 0 -fi - -if kubectl -n beta9 get deploy beta9-gateway >/dev/null 2>&1; then - available="$(kubectl -n beta9 get deploy beta9-gateway -o jsonpath='{.status.availableReplicas}' 2>/dev/null || true)" - if [ "${available:-0}" -ge 1 ]; then - log_pass "beta9 gateway deployment has an available replica" - else - log_fail "beta9 gateway deployment is not available" - fi -else - log_warn "beta9 gateway deployment not found" -fi - -kubectl -n beta9 get secret beta9-config-helm >/dev/null 2>&1 \ - && log_pass "beta9 Helm config secret exists" \ - || log_warn "beta9 Helm config secret not found" - -kubectl -n beta9 get pods >/tmp/beam-beta9-pods.txt 2>/dev/null && log_pass "listed beta9 pods" || log_warn "could not list beta9 pods" - diff --git a/thunder_deployment/scripts/common.sh b/thunder_deployment/scripts/common.sh deleted file mode 100755 index 5ad245b4d..000000000 --- a/thunder_deployment/scripts/common.sh +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env bash -set -uo pipefail - -ROLE="" -MODE="check" -VERBOSE=0 -FAILURES=0 -WARNINGS=0 -FACT_DIR="${FACT_DIR:-/tmp/beam-deployment-state}" -FACT_FILE="" - -usage_common() { - cat <<'EOF' -Usage: run.sh --role master|gpu|cpu [--mode check|install] [--verbose] - -Modes: - check Verify prerequisites only. This is the default. - install Install or configure missing prerequisites where the script supports it. -EOF -} - -parse_common_args() { - while [ "$#" -gt 0 ]; do - case "$1" in - --role) - ROLE="${2:-}" - shift 2 - ;; - --mode) - MODE="${2:-}" - shift 2 - ;; - --check) - MODE="check" - shift - ;; - --install) - MODE="install" - shift - ;; - --verbose|-v) - VERBOSE=1 - shift - ;; - --help|-h) - usage_common - exit 0 - ;; - *) - log_fail "unknown argument: $1" - usage_common - exit 2 - ;; - esac - done - - case "$ROLE" in - master|gpu|cpu) ;; - "") - log_fail "--role is required" - exit 2 - ;; - *) - log_fail "unsupported role: $ROLE" - exit 2 - ;; - esac - - case "$MODE" in - check|install) ;; - *) - log_fail "unsupported mode: $MODE" - exit 2 - ;; - esac - - mkdir -p "$FACT_DIR" - FACT_FILE="$FACT_DIR/$(hostname -s).facts.env" -} - -init_fact_file() { - mkdir -p "$FACT_DIR" - : > "$FACT_FILE" -} - -ts() { - date -u +"%Y-%m-%dT%H:%M:%SZ" -} - -log() { - printf '%s [%s] %s\n' "$(ts)" "$1" "$2" -} - -log_info() { log INFO "$*"; } -log_pass() { log PASS "$*"; } -log_skip() { log SKIP "$*"; } -log_warn() { WARNINGS=$((WARNINGS + 1)); log WARN "$*"; } -log_fail() { FAILURES=$((FAILURES + 1)); log FAIL "$*"; } - -debug() { - if [ "$VERBOSE" -eq 1 ]; then - log DEBUG "$*" - fi -} - -have_cmd() { - command -v "$1" >/dev/null 2>&1 -} - -need_cmd() { - if have_cmd "$1"; then - log_pass "command available: $1" - return 0 - fi - log_fail "missing command: $1" - return 1 -} - -run_sudo() { - if [ "$(id -u)" -eq 0 ]; then - "$@" - else - sudo "$@" - fi -} - -is_master() { [ "$ROLE" = "master" ]; } -is_gpu() { [ "$ROLE" = "gpu" ]; } -is_cpu() { [ "$ROLE" = "cpu" ]; } -is_install() { [ "$MODE" = "install" ]; } - -require_install_mode() { - if ! is_install; then - log_warn "$1 missing; rerun with --mode install to let scripts attempt installation" - return 1 - fi - return 0 -} - -use_k3s_kubeconfig() { - if [ -z "${KUBECONFIG:-}" ] && [ -r /etc/rancher/k3s/k3s.yaml ]; then - export KUBECONFIG=/etc/rancher/k3s/k3s.yaml - debug "using KUBECONFIG=$KUBECONFIG" - fi -} - -record_fact() { - key="$1" - value="$2" - printf '%s=%q\n' "$key" "$value" >> "$FACT_FILE" -} - -summary_and_exit() { - log_info "facts written to $FACT_FILE" - if [ "$WARNINGS" -gt 0 ]; then - log_warn "warnings: $WARNINGS" - fi - if [ "$FAILURES" -gt 0 ]; then - log_fail "failed checks: $FAILURES" - exit 1 - fi - log_pass "all required checks passed" -} - diff --git a/thunder_deployment/scripts/run.sh b/thunder_deployment/scripts/run.sh deleted file mode 100755 index 0cb4e88ce..000000000 --- a/thunder_deployment/scripts/run.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash -set -uo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -. "$SCRIPT_DIR/common.sh" - -parse_common_args "$@" -init_fact_file - -log_info "starting beam node preflight role=$ROLE mode=$MODE host=$(hostname -f 2>/dev/null || hostname)" - -checks=( - "00-host-baseline.sh" - "01-tailscale.sh" - "02-k3s-server.sh" - "03-k3s-agent.sh" - "04-container-runtime.sh" - "05-nvidia.sh" - "06-k8s-gpu-device-plugin.sh" - "07-registry-access.sh" - "08-beta9-readiness.sh" -) - -for check in "${checks[@]}"; do - path="$SCRIPT_DIR/$check" - if [ ! -x "$path" ]; then - log_fail "script is missing or not executable: $path" - continue - fi - log_info "running $check" - "$path" --role "$ROLE" --mode "$MODE" - status=$? - if [ "$status" -ne 0 ]; then - log_fail "$check failed with exit code $status" - fi -done - -summary_and_exit - From 92acd9e4de2689f23bee02c684f38307498edc8b Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Tue, 21 Jul 2026 22:19:13 +0000 Subject: [PATCH 05/26] added curl installer for sandbox setup --- pkg/worker/lifecycle.go | 12 +- pkg/worker/lifecycle_test.go | 10 +- pkg/worker/nvidia.go | 5 - pkg/worker/thunder.go | 352 +++++++++++++++++------------------ pkg/worker/thunder_test.go | 187 +++++++++---------- 5 files changed, 275 insertions(+), 291 deletions(-) diff --git a/pkg/worker/lifecycle.go b/pkg/worker/lifecycle.go index d48d36bd0..a91b3f6a9 100644 --- a/pkg/worker/lifecycle.go +++ b/pkg/worker/lifecycle.go @@ -1108,11 +1108,6 @@ func (s *Worker) spawn(request *types.ContainerRequest, spec *specs.Spec, output return } - if err := gpuManager.PrepareContainerFilesystem(request, spec.Root.Path); err != nil { - log.Error().Str("container_id", request.ContainerId).Msgf("failed to prepare GPU container filesystem: %v", err) - return - } - if request.RequiresPhysicalGPU() { // Only use CDI if runtime supports it if s.runtime.Capabilities().CDI { @@ -1508,6 +1503,13 @@ func (s *Worker) runContainer(ctx context.Context, request *types.ContainerReque runtimeStart := time.Now() handleRuntimeStarted := func(pid int) { + if request.GpuVirtualized { + if err := s.installThunderClient(ctx, request); err != nil { + log.Error().Err(err).Str("container_id", request.ContainerId).Msg("failed to install Thunder client") + s.stopContainer(request.ContainerId, false) + return + } + } if err := s.publishContainerAddresses(ctx, request, startupPortBindings); err != nil { log.Error().Err(err).Str("container_id", request.ContainerId).Msg("failed to publish container address") s.stopContainer(request.ContainerId, false) diff --git a/pkg/worker/lifecycle_test.go b/pkg/worker/lifecycle_test.go index 1724abe1e..2368bc002 100644 --- a/pkg/worker/lifecycle_test.go +++ b/pkg/worker/lifecycle_test.go @@ -1819,6 +1819,11 @@ func envListToMap(env []string) map[string]string { } // Mock runtime for testing +type mockExecCall struct { + containerID string + proc specs.Process +} + type mockRuntime struct { name string capabilities runtime.Capabilities @@ -1826,6 +1831,8 @@ type mockRuntime struct { signals []syscall.Signal killOpts []*runtime.KillOpts killErr error + execCalls []mockExecCall + execErr error } func (m *mockRuntime) Name() string { @@ -1845,7 +1852,8 @@ func (m *mockRuntime) Run(ctx context.Context, containerID, bundlePath string, o } func (m *mockRuntime) Exec(ctx context.Context, containerID string, proc specs.Process, opts *runtime.ExecOpts) error { - return nil + m.execCalls = append(m.execCalls, mockExecCall{containerID: containerID, proc: proc}) + return m.execErr } func (m *mockRuntime) Kill(ctx context.Context, containerID string, sig syscall.Signal, opts *runtime.KillOpts) error { diff --git a/pkg/worker/nvidia.go b/pkg/worker/nvidia.go index 7dc57aa92..7dbeaa274 100644 --- a/pkg/worker/nvidia.go +++ b/pkg/worker/nvidia.go @@ -54,7 +54,6 @@ type GPUManager interface { InjectEnvVars(env []string) []string InjectAssignedEnvVars(env []string, assignedDevices []int) []string InjectMounts(mounts []specs.Mount) []specs.Mount - PrepareContainerFilesystem(request *types.ContainerRequest, rootPath string) error } type ContainerNvidiaManager struct { @@ -472,7 +471,3 @@ func injectCudaMounts(mounts []specs.Mount) []specs.Mount { func (c *ContainerNvidiaManager) InjectMounts(mounts []specs.Mount) []specs.Mount { return injectCudaMounts(mounts) } - -func (c *ContainerNvidiaManager) PrepareContainerFilesystem(request *types.ContainerRequest, rootPath string) error { - return nil -} diff --git a/pkg/worker/thunder.go b/pkg/worker/thunder.go index afa2b47bb..518668f6d 100644 --- a/pkg/worker/thunder.go +++ b/pkg/worker/thunder.go @@ -2,12 +2,11 @@ package worker import ( "bytes" + "context" "encoding/json" "fmt" - "io" "net/http" "os" - "path/filepath" "strings" "time" @@ -18,19 +17,13 @@ import ( ) const ( - thunderAPIURLEnv = "THUNDER_API_URL" - thunderAPITokenEnv = "THUNDER_API_TOKEN" - thunderRegisterClientPath = "/register-client" - thunderDeleteClientPath = "/delete-client" - thunderLibraryAssetPath = "/assets/libthunder.so" - thunderRequestAttempts = 3 - thunderRetryDelay = time.Second -) - -const ( - thunderConfigPath = "/etc/thunder/config.json" - thunderTokenPath = "/etc/thunder/token" - thunderLibraryPath = "/etc/thunder/libthunder.so" + thunderAPIURLEnv = "THUNDER_API_URL" + thunderAPITokenEnv = "THUNDER_API_TOKEN" + thunderZoneIDEnv = "THUNDER_ZONE_ID" + thunderEnrollmentTokenPath = "/api/v1/enrollment-token" + thunderEnrollmentTokenNodePath = "/api/v1/enrollment-tokens/%s/node" + thunderEnrollmentRoleClient = "client" + thunderEnrollmentExpiresSecond = 604800 ) type ContainerThunderManager struct { @@ -41,32 +34,40 @@ type ContainerThunderManager struct { } type thunderAllocation struct { - Token string -} - -type thunderRegisterClientRequest struct { - DeviceID string `json:"deviceId"` - GPUType string `json:"gpuType"` - GPUCount int `json:"gpuCount"` + EnrollmentTokenID string + EnrollmentToken string + APIURL string + APIToken string + Response thunderEnrollmentTokenResponse } -type thunderRegisterClientResponse struct { - Token string `json:"token"` +type thunderEnrollmentTokenRequest struct { + OrgID string `json:"orgId"` + ZoneID string `json:"zoneId"` + Role string `json:"role"` + GPUType string `json:"gpuType"` + GPUCount int `json:"gpuCount"` + ExpiresInSeconds int `json:"expiresInSeconds"` } -type thunderDeleteClientRequest struct { - DeviceID string `json:"deviceId"` - Token string `json:"token"` +type thunderEnrollmentTokenResponse struct { + EnrollmentTokenID string `json:"enrollmentTokenId"` + EnrollmentToken string `json:"enrollmentToken"` + OrgID string `json:"orgId"` + ZoneID string `json:"zoneId"` + Role string `json:"role"` + GPUType string `json:"gpuType"` + GPUCount int `json:"gpuCount"` + ExpiresAt time.Time `json:"expiresAt"` } -type thunderConfigFile struct { - DeviceID string `json:"deviceId"` - GPUCount int `json:"gpuCount"` - GPUType string `json:"gpuType"` - EnableGRPCTLS bool `json:"enableGrpcTls"` - CentralApiUrl string `json:"centralApiUrl"` - CentralZoneId string `json:"centralZoneId"` - CentralApiToken string `json:"centralApiToken"` +type thunderDeleteEnrollmentTokenNodeResponse struct { + EnrollmentTokenID string `json:"enrollmentTokenId"` + Role string `json:"role"` + ClientID string `json:"clientId"` + HostID string `json:"hostId"` + NodeDeleted bool `json:"nodeDeleted"` + DeletedAt time.Time `json:"deletedAt"` } func NewContainerThunderManagerFromEnv() GPUManager { @@ -89,25 +90,41 @@ func (c *ContainerThunderManager) AssignGPUDevices(request *types.ContainerReque if request == nil { return nil, fmt.Errorf("missing container request") } - if c.apiURL == "" { + + apiURL, apiToken := c.thunderCredentials(request) + if apiURL == "" { return nil, fmt.Errorf("%s is required for virtualized GPU requests", thunderAPIURLEnv) } - if c.apiToken == "" { + if apiToken == "" { return nil, fmt.Errorf("%s is required for virtualized GPU requests", thunderAPITokenEnv) } - payload := thunderRegisterClientRequest{ - DeviceID: request.ContainerId, - GPUType: thunderGPUType(request), - GPUCount: int(thunderGPUCount(request)), + zoneID := thunderZoneID(request) + if zoneID == "" { + return nil, fmt.Errorf("%s is required for virtualized GPU requests", thunderZoneIDEnv) + } + + payload := thunderEnrollmentTokenRequest{ + OrgID: "", + ZoneID: zoneID, + Role: thunderEnrollmentRoleClient, + GPUType: strings.ToLower(thunderGPUType(request)), + GPUCount: int(thunderGPUCount(request)), + ExpiresInSeconds: thunderEnrollmentExpiresSecond, } - var response thunderRegisterClientResponse - if err := c.doThunderRequest(http.MethodPost, thunderRegisterClientPath, payload, &response); err != nil { + var response thunderEnrollmentTokenResponse + if err := c.doThunderRequest(http.MethodPost, apiURL, apiToken, thunderEnrollmentTokenPath, payload, &response); err != nil { return nil, err } - c.allocations.Set(request.ContainerId, thunderAllocation{Token: response.Token}) + c.allocations.Set(request.ContainerId, thunderAllocation{ + EnrollmentTokenID: response.EnrollmentTokenID, + EnrollmentToken: response.EnrollmentToken, + APIURL: apiURL, + APIToken: apiToken, + Response: response, + }) return []int{}, nil } @@ -120,9 +137,14 @@ func (c *ContainerThunderManager) UnassignGPUDevices(containerId string) { if !ok { return } + if strings.TrimSpace(allocation.EnrollmentTokenID) == "" { + log.Error().Str("container_id", containerId).Msg("missing Thunder enrollment token id for virtual GPU unenrollment") + c.allocations.Delete(containerId) + return + } - payload := thunderDeleteClientRequest{DeviceID: containerId, Token: allocation.Token} - if err := c.doThunderRequest(http.MethodPost, thunderDeleteClientPath, payload, nil); err != nil { + path := fmt.Sprintf(thunderEnrollmentTokenNodePath, allocation.EnrollmentTokenID) + if err := c.doThunderRequest(http.MethodDelete, allocation.APIURL, allocation.APIToken, path, nil, nil); err != nil { log.Error().Str("container_id", containerId).Err(err).Msg("failed to unregister Thunder virtual GPU client") } c.allocations.Delete(containerId) @@ -133,7 +155,7 @@ func (c *ContainerThunderManager) CDIDevices(assignedDevices []int) []string { } func (c *ContainerThunderManager) InjectEnvVars(env []string) []string { - return withLDPreload(injectCudaEnvVars(env), thunderLibraryPath) + return injectCudaEnvVars(env) } func (c *ContainerThunderManager) InjectAssignedEnvVars(env []string, assignedDevices []int) []string { @@ -144,54 +166,58 @@ func (c *ContainerThunderManager) InjectMounts(mounts []specs.Mount) []specs.Mou return injectCudaMounts(mounts) } -func (c *ContainerThunderManager) doThunderRequest(method, path string, payload any, response any) error { - endpoint, err := c.thunderEndpoint(path) +func (c *ContainerThunderManager) doThunderRequest(method, apiURL, apiToken, path string, payload any, response any) error { + endpoint, err := thunderEndpoint(apiURL, path) if err != nil { return err } - body, err := json.Marshal(payload) - if err != nil { - return err - } - - var lastErr error - for attempt := 1; attempt <= thunderRequestAttempts; attempt++ { - req, err := http.NewRequest(method, endpoint, bytes.NewReader(body)) + var bodyReader *bytes.Reader + if payload != nil { + body, err := json.Marshal(payload) if err != nil { return err } - req.Header.Set("Authorization", "Bearer "+c.apiToken) - req.Header.Set("Content-Type", "application/json") - - resp, err := c.client.Do(req) - if err == nil && resp != nil { - if resp.StatusCode >= 200 && resp.StatusCode < 300 { - defer resp.Body.Close() - if response == nil { - return nil - } - return json.NewDecoder(resp.Body).Decode(response) - } - resp.Body.Close() - lastErr = fmt.Errorf("Thunder API %s %s returned status %d", method, path, resp.StatusCode) - } else if err != nil { - lastErr = err - } + bodyReader = bytes.NewReader(body) + } else { + bodyReader = bytes.NewReader(nil) + } - if attempt < thunderRequestAttempts { - time.Sleep(thunderRetryDelay) - } + req, err := http.NewRequest(method, endpoint, bodyReader) + if err != nil { + return err + } + req.Header.Set("Authorization", "Bearer "+apiToken) + if payload != nil { + req.Header.Set("Content-Type", "application/json") } - return lastErr + resp, err := c.client.Do(req) + if err != nil { + log.Error().Str("method", method).Str("path", path).Err(err).Msg("Thunder API request failed") + return err + } + defer resp.Body.Close() + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + err = fmt.Errorf("Thunder API %s %s returned status %d", method, path, resp.StatusCode) + log.Error().Str("method", method).Str("path", path).Int("status_code", resp.StatusCode).Msg("Thunder API request failed") + return err + } + if response == nil { + return nil + } + if err := json.NewDecoder(resp.Body).Decode(response); err != nil { + log.Error().Str("method", method).Str("path", path).Err(err).Msg("Thunder API response decode failed") + return err + } + return nil } -func (c *ContainerThunderManager) thunderEndpoint(path string) (string, error) { +func thunderEndpoint(apiURL, path string) (string, error) { if !strings.HasPrefix(path, "/") { path = "/" + path } - return c.apiURL + path, nil + return strings.TrimRight(apiURL, "/") + path, nil } func thunderGPUType(request *types.ContainerRequest) string { @@ -222,132 +248,90 @@ func thunderGPUCount(request *types.ContainerRequest) uint32 { return 0 } -func (c *ContainerThunderManager) PrepareContainerFilesystem(request *types.ContainerRequest, rootPath string) error { - return c.InjectThunderFiles(request, rootPath) -} - -func (c *ContainerThunderManager) InjectThunderFiles(request *types.ContainerRequest, rootPath string) error { +func (c *ContainerThunderManager) thunderCredentials(request *types.ContainerRequest) (string, string) { + apiURL := strings.TrimSpace(c.apiURL) + apiToken := strings.TrimSpace(c.apiToken) if request == nil { - return fmt.Errorf("missing container request") - } - if rootPath == "" { - return fmt.Errorf("missing container root path") + return apiURL, apiToken } - allocation, err := c.thunderAllocationForRequest(request) - if err != nil { - return err + if value, ok := thunderRequestEnv(request.Env, thunderAPIURLEnv); ok { + apiURL = value } - - if err := c.createThunderLibrary(rootPath); err != nil { - return err - } - if err := createThunderToken(rootPath, allocation.Token); err != nil { - return err - } - if err := c.createThunderConfig(rootPath, request); err != nil { - return err + if value, ok := thunderRequestEnv(request.Env, thunderAPITokenEnv); ok { + apiToken = value } - return nil + return apiURL, apiToken } -func (c *ContainerThunderManager) thunderAllocationForRequest(request *types.ContainerRequest) (thunderAllocation, error) { - allocation, ok := c.allocations.Get(request.ContainerId) - if ok { - return allocation, nil - } - - if _, err := c.AssignGPUDevices(request); err != nil { - return thunderAllocation{}, err +func thunderZoneID(request *types.ContainerRequest) string { + zoneID := strings.TrimSpace(os.Getenv(thunderZoneIDEnv)) + if request == nil { + return zoneID } - allocation, ok = c.allocations.Get(request.ContainerId) - if !ok { - return thunderAllocation{}, fmt.Errorf("missing Thunder allocation for container %s", request.ContainerId) + if value, ok := thunderRequestEnv(request.Env, thunderZoneIDEnv); ok { + zoneID = value } - return allocation, nil + return zoneID } -func (c *ContainerThunderManager) createThunderLibrary(rootPath string) error { - contents, err := c.downloadThunderAsset(thunderLibraryAssetPath) - if err != nil { - return err +func thunderRequestEnv(env []string, key string) (string, bool) { + prefix := key + "=" + for _, item := range env { + if strings.HasPrefix(item, prefix) { + return strings.TrimSpace(strings.TrimPrefix(item, prefix)), true + } } - return writeThunderFile(rootPath, thunderLibraryPath, contents, 0644) -} - -func createThunderToken(rootPath string, token string) error { - return writeThunderFile(rootPath, thunderTokenPath, []byte(token), 0644) + return "", false } -func (c *ContainerThunderManager) createThunderConfig(rootPath string, request *types.ContainerRequest) error { - config := thunderConfigFile{ - DeviceID: request.ContainerId, - GPUCount: int(thunderGPUCount(request)), - GPUType: thunderGPUType(request), - EnableGRPCTLS: false, - CentralApiUrl: c.apiURL, - CentralZoneId: "thunder-beam", - CentralApiToken: c.apiToken, +func (s *Worker) installThunderClient(ctx context.Context, request *types.ContainerRequest) error { + if s == nil || request == nil || !request.GpuVirtualized { + return nil } - - contents, err := json.Marshal(config) - if err != nil { - return err + manager, ok := s.containerThunderManager.(*ContainerThunderManager) + if !ok || manager == nil { + return fmt.Errorf("thunder manager unavailable") } - return writeThunderFile(rootPath, thunderConfigPath, contents, 0644) -} - -func writeThunderFile(rootPath string, containerPath string, contents []byte, perm os.FileMode) error { - targetPath := thunderHostPath(rootPath, containerPath) - if err := os.MkdirAll(filepath.Dir(targetPath), 0755); err != nil { - return err + allocation, ok := manager.allocations.Get(request.ContainerId) + if !ok || strings.TrimSpace(allocation.EnrollmentToken) == "" { + return fmt.Errorf("missing Thunder enrollment token for container %s", request.ContainerId) } - return os.WriteFile(targetPath, contents, perm) -} - -func thunderHostPath(rootPath string, containerPath string) string { - cleanPath := filepath.Clean(containerPath) - cleanPath = strings.TrimPrefix(cleanPath, string(os.PathSeparator)) - return filepath.Join(rootPath, cleanPath) -} - -func (c *ContainerThunderManager) downloadThunderAsset(path string) ([]byte, error) { - if c.apiURL == "" { - return nil, fmt.Errorf("%s is required for Thunder asset download", thunderAPIURLEnv) + instance, ok := s.containerInstances.Get(request.ContainerId) + if !ok || instance == nil || instance.Runtime == nil { + return fmt.Errorf("container runtime unavailable for Thunder install") } - endpoint, err := c.thunderEndpoint(path) - if err != nil { - return nil, err + env := append([]string(nil), instance.Spec.Process.Env...) + if !containsEnvKey(env, "PATH") { + env = append(env, "PATH="+strings.Join(defaultContainerPath, ":")) } - - var lastErr error - for attempt := 1; attempt <= thunderRequestAttempts; attempt++ { - req, err := http.NewRequest(http.MethodGet, endpoint, nil) - if err != nil { - return nil, err - } - - resp, err := c.client.Do(req) - if err == nil && resp != nil { - if resp.StatusCode >= 200 && resp.StatusCode < 300 { - contents, readErr := io.ReadAll(resp.Body) - resp.Body.Close() - if readErr != nil { - return nil, readErr - } - return contents, nil - } - resp.Body.Close() - lastErr = fmt.Errorf("Thunder asset GET %s returned status %d", path, resp.StatusCode) - } else if err != nil { - lastErr = err + cwd := "/" + if instance.Spec != nil && instance.Spec.Process != nil { + if instance.Spec.Process.Cwd != "" { + cwd = instance.Spec.Process.Cwd } + } + cmd := "curl -fsSL https://get.thundercompute.com/install.sh | sudo THUNDER_INSTALL_MODE=client THUNDER_AUTH_TOKEN=" + common.ShellQuote(allocation.EnrollmentToken) + " sh" + proc := specs.Process{ + Args: []string{"sh", "-c", cmd}, + Cwd: cwd, + Env: env, + } + installCtx, cancel := context.WithTimeout(ctx, 2*time.Minute) + defer cancel() + if err := instance.Runtime.Exec(installCtx, request.ContainerId, proc, nil); err != nil { + return fmt.Errorf("failed to install Thunder client: %w", err) + } + return nil +} - if attempt < thunderRequestAttempts { - time.Sleep(thunderRetryDelay) +func containsEnvKey(env []string, key string) bool { + prefix := key + "=" + for _, item := range env { + if strings.HasPrefix(item, prefix) { + return true } } - - return nil, lastErr + return false } diff --git a/pkg/worker/thunder_test.go b/pkg/worker/thunder_test.go index 7613623ca..68ffbe26f 100644 --- a/pkg/worker/thunder_test.go +++ b/pkg/worker/thunder_test.go @@ -1,22 +1,25 @@ package worker import ( + "context" "encoding/json" + "fmt" "net/http" "net/http/httptest" - "os" "sync/atomic" "testing" + common "github.com/beam-cloud/beta9/pkg/common" "github.com/beam-cloud/beta9/pkg/types" + "github.com/opencontainers/runtime-spec/specs-go" "github.com/tj/assert" ) func TestThunderAssignRegistersClientAndLeavesAssignedEnvUnchanged(t *testing.T) { - var registerPayload thunderRegisterClientRequest + var registerPayload thunderEnrollmentTokenRequest server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.Path != thunderRegisterClientPath { - t.Fatalf("path = %s, want %s", r.URL.Path, thunderRegisterClientPath) + if r.URL.Path != thunderEnrollmentTokenPath { + t.Fatalf("path = %s, want %s", r.URL.Path, thunderEnrollmentTokenPath) } if r.Method != http.MethodPost { t.Fatalf("method = %s, want POST", r.Method) @@ -27,11 +30,12 @@ func TestThunderAssignRegistersClientAndLeavesAssignedEnvUnchanged(t *testing.T) if err := json.NewDecoder(r.Body).Decode(®isterPayload); err != nil { t.Fatal(err) } - _ = json.NewEncoder(w).Encode(thunderRegisterClientResponse{Token: "client-token"}) + _ = json.NewEncoder(w).Encode(thunderEnrollmentTokenResponse{EnrollmentTokenID: "token-id", EnrollmentToken: "client-token", ZoneID: "zone-123", Role: thunderEnrollmentRoleClient, GPUType: "a100", GPUCount: 2}) })) defer server.Close() manager := NewContainerThunderManager(server.URL, "central-token", server.Client()) + t.Setenv(thunderZoneIDEnv, "zone-123") request := &types.ContainerRequest{ ContainerId: "container-123", Gpu: "A100", @@ -44,37 +48,29 @@ func TestThunderAssignRegistersClientAndLeavesAssignedEnvUnchanged(t *testing.T) t.Fatal(err) } assert.Equal(t, []int{}, assigned) - assert.Equal(t, thunderRegisterClientRequest{DeviceID: "container-123", GPUType: "A100", GPUCount: 2}, registerPayload) + assert.Equal(t, thunderEnrollmentTokenRequest{OrgID: "", ZoneID: "zone-123", Role: thunderEnrollmentRoleClient, GPUType: "a100", GPUCount: 2, ExpiresInSeconds: thunderEnrollmentExpiresSecond}, registerPayload) env := manager.InjectAssignedEnvVars([]string{"A=1", "NVIDIA_VISIBLE_DEVICES=void", "WORKER_GPU_DEVICES=0"}, assigned) assert.Equal(t, []string{"A=1", "NVIDIA_VISIBLE_DEVICES=void", "WORKER_GPU_DEVICES=0"}, env) } -func TestThunderInjectEnvVarsMergesLDPreload(t *testing.T) { - manager := NewContainerThunderManager("https://thunder.example", "central-token", nil) - env := manager.InjectEnvVars([]string{"LD_PRELOAD=/existing.so"}) - assert.Contains(t, env, "LD_PRELOAD=/existing.so:/etc/thunder/libthunder.so") -} - -func TestThunderUnassignUsesPostDeleteClient(t *testing.T) { - var deletePayload thunderDeleteClientRequest +func TestThunderUnassignUsesDeleteEnrollmentTokenNode(t *testing.T) { + var deletePath string var sawDelete bool server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { - case thunderRegisterClientPath: - _ = json.NewEncoder(w).Encode(thunderRegisterClientResponse{Token: "client-token"}) - case thunderDeleteClientPath: + case thunderEnrollmentTokenPath: + _ = json.NewEncoder(w).Encode(thunderEnrollmentTokenResponse{EnrollmentTokenID: "token-id", EnrollmentToken: "client-token", ZoneID: "zone-123", Role: thunderEnrollmentRoleClient, GPUType: "a100", GPUCount: 2}) + case fmt.Sprintf(thunderEnrollmentTokenNodePath, "token-id"): sawDelete = true - if r.Method != http.MethodPost { - t.Fatalf("method = %s, want POST", r.Method) + deletePath = r.URL.Path + if r.Method != http.MethodDelete { + t.Fatalf("method = %s, want DELETE", r.Method) } if r.Header.Get("Authorization") != "Bearer central-token" { t.Fatalf("authorization header = %q", r.Header.Get("Authorization")) } - if err := json.NewDecoder(r.Body).Decode(&deletePayload); err != nil { - t.Fatal(err) - } - _ = json.NewEncoder(w).Encode(map[string]bool{"success": true}) + _ = json.NewEncoder(w).Encode(thunderDeleteEnrollmentTokenNodeResponse{EnrollmentTokenID: "token-id", Role: thunderEnrollmentRoleClient, ClientID: "client-id", NodeDeleted: true}) default: t.Fatalf("unexpected path %s", r.URL.Path) } @@ -82,6 +78,7 @@ func TestThunderUnassignUsesPostDeleteClient(t *testing.T) { defer server.Close() manager := NewContainerThunderManager(server.URL, "central-token", server.Client()) + t.Setenv(thunderZoneIDEnv, "zone-123") request := &types.ContainerRequest{ContainerId: "container-123", Gpu: "H100", GpuCount: 1, GpuVirtualized: true} _, err := manager.AssignGPUDevices(request) if err != nil { @@ -90,29 +87,59 @@ func TestThunderUnassignUsesPostDeleteClient(t *testing.T) { manager.UnassignGPUDevices(request.ContainerId) if !sawDelete { - t.Fatal("delete-client was not called") + t.Fatal("delete enrollment-token node was not called") + } + assert.Equal(t, fmt.Sprintf(thunderEnrollmentTokenNodePath, "token-id"), deletePath) +} + +func TestInstallThunderClientExecutesInstaller(t *testing.T) { + rt := &mockRuntime{name: "runc"} + manager := NewContainerThunderManager("https://worker-default.example", "worker-default-token", nil) + manager.allocations.Set("container-123", thunderAllocation{ + EnrollmentToken: "enroll-token", + APIURL: "https://worker-default.example", + APIToken: "worker-default-token", + }) + instances := common.NewSafeMap[*ContainerInstance]() + instances.Set("container-123", &ContainerInstance{ + Runtime: rt, + Spec: &specs.Spec{Process: &specs.Process{Cwd: "/workspace", Env: []string{"A=1"}}}, + }) + worker := &Worker{ + containerThunderManager: manager, + containerInstances: instances, + } + + err := worker.installThunderClient(context.Background(), &types.ContainerRequest{ContainerId: "container-123", GpuVirtualized: true}) + if err != nil { + t.Fatal(err) + } + if len(rt.execCalls) != 1 { + t.Fatalf("execCalls = %d, want 1", len(rt.execCalls)) } - assert.Equal(t, thunderDeleteClientRequest{DeviceID: "container-123", Token: "client-token"}, deletePayload) + call := rt.execCalls[0] + assert.Equal(t, "container-123", call.containerID) + assert.Equal(t, "/workspace", call.proc.Cwd) + assert.Equal(t, []string{"sh", "-c", "curl -fsSL https://get.thundercompute.com/install.sh | sudo THUNDER_INSTALL_MODE=client THUNDER_AUTH_TOKEN='enroll-token' sh"}, call.proc.Args) + assert.Contains(t, call.proc.Env, "A=1") + assert.Contains(t, call.proc.Env, "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin") } -func TestThunderAssignRetriesUnsuccessfulStatus(t *testing.T) { +func TestThunderAssignReturnsErrorOnUnsuccessfulStatus(t *testing.T) { var attempts int32 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - attempt := atomic.AddInt32(&attempts, 1) - if attempt < 3 { - w.WriteHeader(http.StatusInternalServerError) - return - } - _ = json.NewEncoder(w).Encode(thunderRegisterClientResponse{Token: "client-token"}) + atomic.AddInt32(&attempts, 1) + w.WriteHeader(http.StatusInternalServerError) })) defer server.Close() manager := NewContainerThunderManager(server.URL, "central-token", server.Client()) + t.Setenv(thunderZoneIDEnv, "zone-123") _, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container-123", GpuRequest: []string{"H100"}, GpuVirtualized: true}) - if err != nil { - t.Fatal(err) + if err == nil { + t.Fatal("expected Thunder enrollment error") } - assert.Equal(t, int32(3), atomic.LoadInt32(&attempts)) + assert.Equal(t, int32(1), atomic.LoadInt32(&attempts)) } func TestThunderAssignRequiresWorkerEnv(t *testing.T) { @@ -123,79 +150,47 @@ func TestThunderAssignRequiresWorkerEnv(t *testing.T) { } } -func TestThunderPrepareContainerFilesystemWritesThunderFiles(t *testing.T) { - const libraryContents = "libthunder-bytes" - var registerPayload thunderRegisterClientRequest - var assetRequested bool +func TestThunderAssignRequiresZoneID(t *testing.T) { + manager := NewContainerThunderManager("https://thunder.example", "central-token", nil) + _, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container-123", Gpu: "A100", GpuVirtualized: true}) + if err == nil { + t.Fatal("expected missing Thunder zone id error") + } +} +func TestThunderAssignUsesRequestScopedCredentials(t *testing.T) { + var authHeader string server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - switch r.URL.Path { - case thunderRegisterClientPath: - if r.Method != http.MethodPost { - t.Fatalf("register method = %s, want POST", r.Method) - } - if r.Header.Get("Authorization") != "Bearer central-token" { - t.Fatalf("authorization header = %q", r.Header.Get("Authorization")) - } - if err := json.NewDecoder(r.Body).Decode(®isterPayload); err != nil { - t.Fatal(err) - } - _ = json.NewEncoder(w).Encode(thunderRegisterClientResponse{Token: "client-token"}) - case thunderLibraryAssetPath: - assetRequested = true - if r.Method != http.MethodGet { - t.Fatalf("asset method = %s, want GET", r.Method) - } - _, _ = w.Write([]byte(libraryContents)) - default: - t.Fatalf("unexpected path %s", r.URL.Path) - } + authHeader = r.Header.Get("Authorization") + _ = json.NewEncoder(w).Encode(thunderEnrollmentTokenResponse{EnrollmentTokenID: "token-id", EnrollmentToken: "client-token", ZoneID: "zone-123", Role: thunderEnrollmentRoleClient, GPUType: "a100", GPUCount: 2}) })) defer server.Close() - manager := NewContainerThunderManager(server.URL, "central-token", server.Client()) + manager := NewContainerThunderManager("https://worker-default.example", "worker-default-token", server.Client()) + t.Setenv(thunderZoneIDEnv, "zone-worker") request := &types.ContainerRequest{ ContainerId: "container-123", Gpu: "A100", - GpuCount: 2, + GpuCount: 1, GpuVirtualized: true, - } - rootPath := t.TempDir() - - if err := manager.PrepareContainerFilesystem(request, rootPath); err != nil { - t.Fatal(err) + Env: []string{ + thunderAPIURLEnv + "=" + server.URL, + thunderAPITokenEnv + "=request-token", + thunderZoneIDEnv + "=zone-request", + }, } - assert.Equal(t, thunderRegisterClientRequest{DeviceID: "container-123", GPUType: "A100", GPUCount: 2}, registerPayload) - assert.True(t, assetRequested) - - library, err := os.ReadFile(thunderHostPath(rootPath, thunderLibraryPath)) - if err != nil { - t.Fatal(err) - } - assert.Equal(t, libraryContents, string(library)) - - token, err := os.ReadFile(thunderHostPath(rootPath, thunderTokenPath)) - if err != nil { - t.Fatal(err) - } - assert.Equal(t, "client-token", string(token)) - - configBytes, err := os.ReadFile(thunderHostPath(rootPath, thunderConfigPath)) + _, err := manager.AssignGPUDevices(request) if err != nil { t.Fatal(err) } - var config thunderConfigFile - if err := json.Unmarshal(configBytes, &config); err != nil { - t.Fatal(err) - } - assert.Equal(t, thunderConfigFile{ - DeviceID: "container-123", - GPUCount: 2, - GPUType: "A100", - EnableGRPCTLS: false, - CentralApiUrl: server.URL, - CentralZoneId: "thunder-beam", - CentralApiToken: "central-token", - }, config) + assert.Equal(t, "Bearer request-token", authHeader) + + allocation, ok := manager.allocations.Get(request.ContainerId) + assert.True(t, ok) + assert.Equal(t, server.URL, allocation.APIURL) + assert.Equal(t, "request-token", allocation.APIToken) + assert.Equal(t, "token-id", allocation.EnrollmentTokenID) + assert.Equal(t, "client-token", allocation.EnrollmentToken) + assert.Equal(t, "zone-123", allocation.Response.ZoneID) } From a9669d5a4fa3d56c4d646fdea2a937e30bd9380e Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Thu, 23 Jul 2026 00:59:51 +0000 Subject: [PATCH 06/26] added more logs for debugging --- pkg/abstractions/pod/pod.go | 9 ++++++++ pkg/gateway/services/stub.go | 17 +++++++++++++++ pkg/worker/thunder.go | 42 +++++++++++++++++++++++++++++++++++- pkg/worker/worker.go | 8 ++++++- 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/pkg/abstractions/pod/pod.go b/pkg/abstractions/pod/pod.go index 15f7597ac..3eaf8ff15 100644 --- a/pkg/abstractions/pod/pod.go +++ b/pkg/abstractions/pod/pod.go @@ -404,6 +404,15 @@ func (s *GenericPodService) run(ctx context.Context, authInfo *auth.AuthInfo, st gpuCount = 1 } + log.Info(). + Str("stub_id", stub.ExternalId). + Str("container_id", containerId). + Str("gpu", stubConfig.Runtime.Gpu.String()). + Strs("gpu_request", gpuRequest). + Uint32("gpu_count", uint32(gpuCount)). + Bool("gpu_virtualized", stubConfig.Runtime.GpuVirtualized). + Msg("pod service built sandbox run request from stub config") + checkpointEnabled := stubConfig.CheckpointEnabled if gpuCount > 1 { checkpointEnabled = false diff --git a/pkg/gateway/services/stub.go b/pkg/gateway/services/stub.go index 5178b514e..10e1ef086 100644 --- a/pkg/gateway/services/stub.go +++ b/pkg/gateway/services/stub.go @@ -38,6 +38,15 @@ func (gws *GatewayService) GetOrCreateStub(ctx context.Context, in *pb.GetOrCrea autoscaler := autoscalerFromProto(in.Autoscaler) + log.Info(). + Str("stub_name", in.Name). + Str("stub_type", in.StubType). + Str("workspace_id", authInfo.Workspace.ExternalId). + Strs("gpus", types.GpuTypesToStrings(gpus)). + Uint32("gpu_count", in.GpuCount). + Bool("gpu_virtualized", in.GpuVirtualized). + Msg("gateway received GetOrCreateStub request") + keepWarmSeconds := normalizeKeepWarmSeconds(in.KeepWarmSeconds, types.StubType(in.StubType)) // Pod keep-warm semantics: @@ -158,6 +167,14 @@ func (gws *GatewayService) GetOrCreateStub(ctx context.Context, in *pb.GetOrCrea stubConfig.Runtime.GpuCount = 1 } + log.Info(). + Str("stub_name", in.Name). + Str("stub_type", in.StubType). + Strs("gpus", types.GpuTypesToStrings(gpus)). + Uint32("gpu_count", stubConfig.Runtime.GpuCount). + Bool("gpu_virtualized", stubConfig.Runtime.GpuVirtualized). + Msg("gateway built stub config") + if stubConfig.RequiresGPU() { if gws.computeService != nil { if err := gws.computeService.ValidatePrivatePoolGPURequest(ctx, authInfo.Workspace.ExternalId, poolConfigName(resourcePolicy.pool), gpus); err != nil { diff --git a/pkg/worker/thunder.go b/pkg/worker/thunder.go index 518668f6d..f5a49ac4a 100644 --- a/pkg/worker/thunder.go +++ b/pkg/worker/thunder.go @@ -20,7 +20,7 @@ const ( thunderAPIURLEnv = "THUNDER_API_URL" thunderAPITokenEnv = "THUNDER_API_TOKEN" thunderZoneIDEnv = "THUNDER_ZONE_ID" - thunderEnrollmentTokenPath = "/api/v1/enrollment-token" + thunderEnrollmentTokenPath = "/api/v1/enrollment-tokens" thunderEnrollmentTokenNodePath = "/api/v1/enrollment-tokens/%s/node" thunderEnrollmentRoleClient = "client" thunderEnrollmentExpiresSecond = 604800 @@ -113,8 +113,22 @@ func (c *ContainerThunderManager) AssignGPUDevices(request *types.ContainerReque ExpiresInSeconds: thunderEnrollmentExpiresSecond, } + log.Info(). + Str("container_id", request.ContainerId). + Str("zone_id", payload.ZoneID). + Str("gpu_type", payload.GPUType). + Int("gpu_count", payload.GPUCount). + Msg("requesting Thunder enrollment token") + var response thunderEnrollmentTokenResponse if err := c.doThunderRequest(http.MethodPost, apiURL, apiToken, thunderEnrollmentTokenPath, payload, &response); err != nil { + log.Error(). + Str("container_id", request.ContainerId). + Str("zone_id", payload.ZoneID). + Str("gpu_type", payload.GPUType). + Int("gpu_count", payload.GPUCount). + Err(err). + Msg("failed to assign Thunder virtual GPU") return nil, err } @@ -125,6 +139,14 @@ func (c *ContainerThunderManager) AssignGPUDevices(request *types.ContainerReque APIToken: apiToken, Response: response, }) + + log.Info(). + Str("container_id", request.ContainerId). + Str("enrollment_token_id", response.EnrollmentTokenID). + Str("zone_id", response.ZoneID). + Str("gpu_type", response.GPUType). + Int("gpu_count", response.GPUCount). + Msg("assigned Thunder virtual GPU") return []int{}, nil } @@ -135,6 +157,7 @@ func (c *ContainerThunderManager) GetContainerGPUDevices(containerId string) []i func (c *ContainerThunderManager) UnassignGPUDevices(containerId string) { allocation, ok := c.allocations.Get(containerId) if !ok { + log.Debug().Str("container_id", containerId).Msg("skipping Thunder virtual GPU unassign because no allocation was recorded") return } if strings.TrimSpace(allocation.EnrollmentTokenID) == "" { @@ -144,8 +167,17 @@ func (c *ContainerThunderManager) UnassignGPUDevices(containerId string) { } path := fmt.Sprintf(thunderEnrollmentTokenNodePath, allocation.EnrollmentTokenID) + log.Info(). + Str("container_id", containerId). + Str("enrollment_token_id", allocation.EnrollmentTokenID). + Msg("unassigning Thunder virtual GPU") if err := c.doThunderRequest(http.MethodDelete, allocation.APIURL, allocation.APIToken, path, nil, nil); err != nil { log.Error().Str("container_id", containerId).Err(err).Msg("failed to unregister Thunder virtual GPU client") + } else { + log.Info(). + Str("container_id", containerId). + Str("enrollment_token_id", allocation.EnrollmentTokenID). + Msg("unassigned Thunder virtual GPU") } c.allocations.Delete(containerId) } @@ -320,9 +352,17 @@ func (s *Worker) installThunderClient(ctx context.Context, request *types.Contai } installCtx, cancel := context.WithTimeout(ctx, 2*time.Minute) defer cancel() + log.Info(). + Str("container_id", request.ContainerId). + Str("enrollment_token_id", allocation.EnrollmentTokenID). + Msg("installing Thunder client in sandbox") if err := instance.Runtime.Exec(installCtx, request.ContainerId, proc, nil); err != nil { return fmt.Errorf("failed to install Thunder client: %w", err) } + log.Info(). + Str("container_id", request.ContainerId). + Str("enrollment_token_id", allocation.EnrollmentTokenID). + Msg("installed Thunder client in sandbox") return nil } diff --git a/pkg/worker/worker.go b/pkg/worker/worker.go index 0ca394482..ac65ab0ff 100644 --- a/pkg/worker/worker.go +++ b/pkg/worker/worker.go @@ -521,7 +521,13 @@ containerRequestStream: if request.MachineId == "" { request.MachineId = s.machineID } - log.Info().Str("worker_id", s.workerId).Str("container_id", request.ContainerId).Msg("worker received container request") + log.Info(). + Str("worker_id", s.workerId). + Str("container_id", request.ContainerId). + Str("gpu", request.Gpu). + Uint32("gpu_count", request.GpuCount). + Bool("gpu_virtualized", request.GpuVirtualized). + Msg("worker received container request") if !request.Timestamp.IsZero() { s.recordContainerLifecycle(s.ctx, request, containerLifecycleFromDuration(types.ContainerLifecycleWorkerQueueReceive, request, request.Timestamp, time.Since(request.Timestamp), true, map[string]string{ "worker_id": s.workerId, From ac65b5571cd9f88f8a557baefadcb58ee08fbda0 Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Thu, 23 Jul 2026 11:02:20 +0000 Subject: [PATCH 07/26] added correct thunder install hook --- pkg/worker/lifecycle.go | 40 ++++++++++++++++++++++++++++-------- pkg/worker/lifecycle_test.go | 5 +++++ 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/pkg/worker/lifecycle.go b/pkg/worker/lifecycle.go index a91b3f6a9..8f8966dd6 100644 --- a/pkg/worker/lifecycle.go +++ b/pkg/worker/lifecycle.go @@ -1263,6 +1263,7 @@ func (s *Worker) spawn(request *types.ContainerRequest, spec *specs.Spec, output startedChan := make(chan int, 1) checkpointPIDChan := make(chan int, 1) monitorPIDChan := make(chan int, 1) + thunderInstallResult := make(chan error, 1) defer func() { // Close in reverse order of dependency @@ -1323,6 +1324,22 @@ func (s *Worker) spawn(request *types.ContainerRequest, spec *specs.Spec, output return } + if request.GpuVirtualized { + if err := s.installThunderClient(ctx, request); err != nil { + log.Error().Err(err).Str("container_id", request.ContainerId).Msg("failed to install Thunder client") + s.stopContainer(request.ContainerId, false) + select { + case thunderInstallResult <- err: + default: + } + return + } + select { + case thunderInstallResult <- nil: + default: + } + } + if request.DockerEnabled { go s.startDockerDaemon(ctx, containerId, instance) } @@ -1336,7 +1353,7 @@ func (s *Worker) spawn(request *types.ContainerRequest, spec *specs.Spec, output s.setupOOMWatcher(ctx, containerId, pid, spec, request, outputLogger, &isOOMKilled) }() - exitCode, _ = s.runContainer(ctx, request, outputLogger, outputWriter, startedChan, checkpointPIDChan, opts.StartupStartedAt, opts.StartupPortBindings) + exitCode, _ = s.runContainer(ctx, request, outputLogger, outputWriter, startedChan, checkpointPIDChan, thunderInstallResult, opts.StartupStartedAt, opts.StartupPortBindings) stopReason := types.StopContainerReasonUnknown containerInstance, exists = s.containerInstances.Get(containerId) @@ -1441,7 +1458,7 @@ func eventStopReason(stopReason types.StopContainerReason) string { return string(stopReason) } -func (s *Worker) runContainer(ctx context.Context, request *types.ContainerRequest, outputLogger *slog.Logger, outputWriter *common.OutputWriter, startedChan chan int, checkpointPIDChan chan int, startupStartedAt time.Time, startupPortBindings []PortBinding) (int, error) { +func (s *Worker) runContainer(ctx context.Context, request *types.ContainerRequest, outputLogger *slog.Logger, outputWriter *common.OutputWriter, startedChan chan int, checkpointPIDChan chan int, thunderInstallResult chan error, startupStartedAt time.Time, startupPortBindings []PortBinding) (int, error) { instance, exists := s.containerInstances.Get(request.ContainerId) if !exists { return -1, fmt.Errorf("container instance not found") @@ -1503,13 +1520,6 @@ func (s *Worker) runContainer(ctx context.Context, request *types.ContainerReque runtimeStart := time.Now() handleRuntimeStarted := func(pid int) { - if request.GpuVirtualized { - if err := s.installThunderClient(ctx, request); err != nil { - log.Error().Err(err).Str("container_id", request.ContainerId).Msg("failed to install Thunder client") - s.stopContainer(request.ContainerId, false) - return - } - } if err := s.publishContainerAddresses(ctx, request, startupPortBindings); err != nil { log.Error().Err(err).Str("container_id", request.ContainerId).Msg("failed to publish container address") s.stopContainer(request.ContainerId, false) @@ -1537,6 +1547,18 @@ func (s *Worker) runContainer(ctx context.Context, request *types.ContainerReque case <-ctx.Done(): return } + + if request.Stub.Type.Kind() == types.StubTypeSandbox && request.GpuVirtualized { + select { + case err := <-thunderInstallResult: + if err != nil { + return + } + case <-ctx.Done(): + return + } + } + s.markContainerRunning(ctx, request, startupStartedAt) } diff --git a/pkg/worker/lifecycle_test.go b/pkg/worker/lifecycle_test.go index 2368bc002..31d67d4c6 100644 --- a/pkg/worker/lifecycle_test.go +++ b/pkg/worker/lifecycle_test.go @@ -833,6 +833,7 @@ func TestRunContainerDoesNotCancelRuntimeRunWithWorkerContext(t *testing.T) { common.NewOutputWriter(func(string) {}), make(chan int, 1), make(chan int, 1), + nil, time.Now(), nil, ) @@ -906,6 +907,7 @@ func TestRunContainerRestorePublishesAddressFromStartedHandler(t *testing.T) { common.NewOutputWriter(func(string) {}), make(chan int, 1), make(chan int, 1), + nil, time.Now(), []PortBinding{{HostPort: 30001, ContainerPort: 8001}}, ) @@ -991,6 +993,7 @@ func TestRunContainerRestoreWaitsForRestoredRuntimeExit(t *testing.T) { common.NewOutputWriter(func(string) {}), make(chan int, 1), make(chan int, 1), + nil, time.Now(), []PortBinding{{HostPort: 30001, ContainerPort: 8001}}, ) @@ -1135,6 +1138,7 @@ func TestRunContainerRestoreFailureCleansRuntimeBeforeFallback(t *testing.T) { common.NewOutputWriter(func(string) {}), make(chan int, 1), make(chan int, 1), + nil, time.Now(), []PortBinding{{HostPort: 30001, ContainerPort: 8001}}, ) @@ -1201,6 +1205,7 @@ func TestRunContainerMaterializeFailureFallsBackWithoutRestore(t *testing.T) { common.NewOutputWriter(func(string) {}), make(chan int, 1), make(chan int, 1), + nil, time.Now(), []PortBinding{{HostPort: 30001, ContainerPort: 8001}}, ) From fa7fb7b971e69dc1d97600aad12bc3f08ca60c6d Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Thu, 23 Jul 2026 11:21:16 +0000 Subject: [PATCH 08/26] merge --- pkg/worker/nvidia.go | 12 ++---------- pkg/worker/thunder.go | 26 ++++++++++++++++---------- pkg/worker/thunder_test.go | 2 +- 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/pkg/worker/nvidia.go b/pkg/worker/nvidia.go index 7dbeaa274..c577efc5c 100644 --- a/pkg/worker/nvidia.go +++ b/pkg/worker/nvidia.go @@ -354,7 +354,7 @@ func upsertEnvVars(env []string, updates []string) []string { return env } -func injectCudaEnvVars(env []string) []string { +func (c *ContainerNvidiaManager) InjectEnvVars(env []string) []string { cudaEnvVarDefaults := map[string]string{ "NVIDIA_DRIVER_CAPABILITIES": "compute,utility,graphics,ngx,video", "NVIDIA_REQUIRE_CUDA": "", @@ -418,10 +418,6 @@ func injectCudaEnvVars(env []string) []string { return modifiedEnv } -func (c *ContainerNvidiaManager) InjectEnvVars(env []string) []string { - return injectCudaEnvVars(env) -} - func mergePaths(pathName string, initEnv map[string]string, mergeIn []string) { if initEnv[pathName] == "" { initEnv[pathName] = strings.Join(mergeIn, ":") @@ -441,7 +437,7 @@ func mergePaths(pathName string, initEnv map[string]string, mergeIn []string) { initEnv[pathName] = strings.Join(pathMembers, ":") } -func injectCudaMounts(mounts []specs.Mount) []specs.Mount { +func (c *ContainerNvidiaManager) InjectMounts(mounts []specs.Mount) []specs.Mount { cudaPaths := []string{fmt.Sprintf("/usr/local/cuda-%s", defaultContainerCudaVersion), "/usr/local/nvidia/lib64"} for _, path := range cudaPaths { @@ -467,7 +463,3 @@ func injectCudaMounts(mounts []specs.Mount) []specs.Mount { return mounts } - -func (c *ContainerNvidiaManager) InjectMounts(mounts []specs.Mount) []specs.Mount { - return injectCudaMounts(mounts) -} diff --git a/pkg/worker/thunder.go b/pkg/worker/thunder.go index f5a49ac4a..745675e10 100644 --- a/pkg/worker/thunder.go +++ b/pkg/worker/thunder.go @@ -187,7 +187,7 @@ func (c *ContainerThunderManager) CDIDevices(assignedDevices []int) []string { } func (c *ContainerThunderManager) InjectEnvVars(env []string) []string { - return injectCudaEnvVars(env) + return (&ContainerNvidiaManager{}).InjectEnvVars(env) } func (c *ContainerThunderManager) InjectAssignedEnvVars(env []string, assignedDevices []int) []string { @@ -195,7 +195,7 @@ func (c *ContainerThunderManager) InjectAssignedEnvVars(env []string, assignedDe } func (c *ContainerThunderManager) InjectMounts(mounts []specs.Mount) []specs.Mount { - return injectCudaMounts(mounts) + return (&ContainerNvidiaManager{}).InjectMounts(mounts) } func (c *ContainerThunderManager) doThunderRequest(method, apiURL, apiToken, path string, payload any, response any) error { @@ -344,20 +344,26 @@ func (s *Worker) installThunderClient(ctx context.Context, request *types.Contai cwd = instance.Spec.Process.Cwd } } - cmd := "curl -fsSL https://get.thundercompute.com/install.sh | sudo THUNDER_INSTALL_MODE=client THUNDER_AUTH_TOKEN=" + common.ShellQuote(allocation.EnrollmentToken) + " sh" - proc := specs.Process{ - Args: []string{"sh", "-c", cmd}, - Cwd: cwd, - Env: env, - } + cmd := "curl -fsSL https://get.thundercompute.com/install.sh | sudo THUNDER_NOWARN=1 THUNDER_INSTALL_MODE=client THUNDER_CENTRAL_URL=" + common.ShellQuote(allocation.APIURL) + " THUNDER_ENROLLMENT_TOKEN=" + common.ShellQuote(allocation.EnrollmentToken) + " sh" installCtx, cancel := context.WithTimeout(ctx, 2*time.Minute) defer cancel() log.Info(). Str("container_id", request.ContainerId). Str("enrollment_token_id", allocation.EnrollmentTokenID). Msg("installing Thunder client in sandbox") - if err := instance.Runtime.Exec(installCtx, request.ContainerId, proc, nil); err != nil { - return fmt.Errorf("failed to install Thunder client: %w", err) + if instance.SandboxProcessManager != nil && instance.SandboxProcessManagerReady { + if err := runSandboxProcessManagerCommand(installCtx, instance.SandboxProcessManager, []string{"sh", "-c", cmd}, cwd, env, "Thunder client install"); err != nil { + return fmt.Errorf("failed to install Thunder client: %w", err) + } + } else { + proc := specs.Process{ + Args: []string{"sh", "-c", cmd}, + Cwd: cwd, + Env: env, + } + if err := instance.Runtime.Exec(installCtx, request.ContainerId, proc, nil); err != nil { + return fmt.Errorf("failed to install Thunder client: %w", err) + } } log.Info(). Str("container_id", request.ContainerId). diff --git a/pkg/worker/thunder_test.go b/pkg/worker/thunder_test.go index 68ffbe26f..b9b9e05e6 100644 --- a/pkg/worker/thunder_test.go +++ b/pkg/worker/thunder_test.go @@ -120,7 +120,7 @@ func TestInstallThunderClientExecutesInstaller(t *testing.T) { call := rt.execCalls[0] assert.Equal(t, "container-123", call.containerID) assert.Equal(t, "/workspace", call.proc.Cwd) - assert.Equal(t, []string{"sh", "-c", "curl -fsSL https://get.thundercompute.com/install.sh | sudo THUNDER_INSTALL_MODE=client THUNDER_AUTH_TOKEN='enroll-token' sh"}, call.proc.Args) + assert.Equal(t, []string{"sh", "-c", "curl -fsSL https://get.thundercompute.com/install.sh | sudo THUNDER_NOWARN=1 THUNDER_INSTALL_MODE=client THUNDER_CENTRAL_URL='https://worker-default.example' THUNDER_ENROLLMENT_TOKEN='enroll-token' sh"}, call.proc.Args) assert.Contains(t, call.proc.Env, "A=1") assert.Contains(t, call.proc.Env, "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin") } From ff399387a65b5bdd95d35b50cf8a3817e24480dd Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Thu, 23 Jul 2026 16:20:07 +0000 Subject: [PATCH 09/26] rebuilt protos --- proto/container_repo.pb.go | 2 +- proto/container_repo_grpc.pb.go | 2 +- proto/gateway.pb.go | 3947 ++++++++++++++++--------------- proto/gateway_grpc.pb.go | 2 +- proto/pod.pb.go | 2 +- proto/pod_grpc.pb.go | 2 +- proto/types.pb.go | 192 +- proto/worker_repo.pb.go | 2 +- proto/worker_repo_grpc.pb.go | 2 +- 9 files changed, 2099 insertions(+), 2054 deletions(-) diff --git a/proto/container_repo.pb.go b/proto/container_repo.pb.go index a4473526e..66b37d836 100644 --- a/proto/container_repo.pb.go +++ b/proto/container_repo.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.25.1 +// protoc v3.21.12 // source: container_repo.proto package proto diff --git a/proto/container_repo_grpc.pb.go b/proto/container_repo_grpc.pb.go index b8ef145ce..5d3ae449a 100644 --- a/proto/container_repo_grpc.pb.go +++ b/proto/container_repo_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.1 +// - protoc v3.21.12 // source: container_repo.proto package proto diff --git a/proto/gateway.pb.go b/proto/gateway.pb.go index 0a1693d3e..ae0f1b612 100644 --- a/proto/gateway.pb.go +++ b/proto/gateway.pb.go @@ -13962,2020 +13962,2053 @@ var file_gateway_proto_rawDesc = []byte{ 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x67, 0x70, 0x75, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x22, 0x76, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, - 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x19, - 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x4d, 0x73, 0x67, 0x22, 0x5a, 0x0a, 0x11, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, - 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, - 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x6f, - 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x22, 0xdd, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x23, 0x0a, 0x0d, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, - 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, - 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, - 0x4d, 0x73, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x6d, 0x73, 0x67, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x4d, 0x73, 0x67, 0x12, 0x25, - 0x0a, 0x0e, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9b, 0x04, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x75, - 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, - 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x75, 0x62, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, - 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, - 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x0b, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x15, 0x0a, - 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, - 0x70, 0x70, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x65, 0x6e, 0x76, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x76, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, - 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, 0x29, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x79, 0x0a, - 0x17, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, - 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, - 0x67, 0x12, 0x35, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x27, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x70, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x22, 0x41, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, - 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, - 0x72, 0x4d, 0x73, 0x67, 0x22, 0x28, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x42, - 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, - 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, - 0x73, 0x67, 0x22, 0x48, 0x0a, 0x16, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x42, 0x0a, 0x17, - 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, - 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, - 0x22, 0x29, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x43, 0x0a, 0x18, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, - 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, - 0x22, 0xec, 0x02, 0x0a, 0x04, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, - 0x65, 0x65, 0x47, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x6e, - 0x46, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, - 0x65, 0x65, 0x43, 0x70, 0x75, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x6e, - 0x46, 0x72, 0x65, 0x65, 0x43, 0x70, 0x75, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x46, 0x72, - 0x65, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x2a, 0x0a, - 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x43, 0x70, - 0x75, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x43, 0x70, 0x75, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x34, 0x0a, 0x15, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x47, 0x70, 0x75, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x2c, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x50, - 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, - 0xbb, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, 0x29, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x61, 0x0a, - 0x11, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x64, 0x22, 0xfc, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, + 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, + 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, + 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, + 0x19, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x4d, 0x73, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x75, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x5f, 0x67, 0x70, 0x75, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x75, + 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x47, 0x70, 0x75, 0x73, 0x12, 0x30, + 0x0a, 0x14, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, + 0x22, 0x5a, 0x0a, 0x11, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x22, 0xdd, 0x01, 0x0a, + 0x12, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x02, 0x6f, 0x6b, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x5f, 0x75, 0x72, 0x6c, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x55, 0x72, + 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x77, 0x61, + 0x72, 0x6e, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x61, + 0x72, 0x6e, 0x4d, 0x73, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, + 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, + 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9b, 0x04, 0x0a, + 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, + 0x09, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x73, 0x74, 0x75, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 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, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4b, 0x69, 0x6e, 0x64, + 0x12, 0x38, 0x0a, 0x18, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x16, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x76, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x76, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x16, 0x4c, + 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x79, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, + 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x35, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, + 0x27, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x41, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x23, 0x0a, 0x05, 0x70, - 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, - 0x22, 0xf9, 0x02, 0x0a, 0x0a, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, - 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, - 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x67, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x67, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x6d, 0x69, 0x6e, - 0x52, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x61, 0x6c, - 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x61, 0x6c, - 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x22, 0xd2, 0x04, 0x0a, - 0x09, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, - 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, - 0x6f, 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x4d, - 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, 0x12, 0x2c, 0x0a, 0x12, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, - 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x09, 0x20, 0x01, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x28, 0x0a, 0x16, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x42, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, + 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x48, 0x0a, 0x16, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x73, 0x22, 0x42, 0x0a, 0x17, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, + 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x29, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x22, 0x43, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, + 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xec, 0x02, 0x0a, 0x04, 0x50, 0x6f, 0x6f, 0x6c, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x10, 0x0a, 0x03, + 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1e, + 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x12, 0x1e, + 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x43, 0x70, 0x75, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x43, 0x70, 0x75, 0x12, 0x24, + 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x43, 0x70, 0x75, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x43, 0x70, 0x75, + 0x12, 0x30, 0x0a, 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, + 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x12, 0x34, 0x0a, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x65, 0x72, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, + 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xbb, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, + 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x61, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, + 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, + 0x73, 0x67, 0x12, 0x23, 0x0a, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, + 0x52, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x22, 0xf9, 0x02, 0x0a, 0x0a, 0x50, 0x6f, 0x6f, 0x6c, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, + 0x75, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x14, 0x0a, 0x05, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x70, 0x65, 0x6e, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x70, 0x65, 0x6e, + 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, + 0x5f, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x0e, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, + 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x66, 0x66, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, + 0x72, 0x49, 0x64, 0x22, 0xd2, 0x04, 0x0a, 0x09, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, + 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x23, 0x0a, + 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, + 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, + 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, + 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, + 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, 0x12, 0x2c, 0x0a, + 0x12, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, + 0x72, 0x6f, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x68, 0x6f, 0x75, 0x72, 0x6c, + 0x79, 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x72, + 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, + 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4d, 0x62, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x2e, + 0x0a, 0x13, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, + 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, + 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x22, 0xfb, 0x05, 0x0a, 0x10, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, + 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, + 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, + 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, - 0x63, 0x72, 0x6f, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x69, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, - 0x6d, 0x62, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x4d, 0x62, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, - 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, - 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, - 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x67, 0x69, 0x6f, - 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, - 0x75, 0x64, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, - 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, - 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, - 0x65, 0x22, 0xfb, 0x05, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, - 0x19, 0x0a, 0x08, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x2c, 0x0a, 0x12, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, - 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x68, 0x6f, 0x75, - 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x09, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x0a, - 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x48, 0x0a, 0x12, 0x62, - 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x5f, 0x61, - 0x74, 0x18, 0x0b, 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, 0x10, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x65, - 0x77, 0x61, 0x6c, 0x41, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x12, - 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x6f, - 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, - 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x13, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, - 0x72, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, - 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4d, 0x62, 0x22, - 0xad, 0x04, 0x0a, 0x0b, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, - 0x2b, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3d, 0x0a, 0x0c, - 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x72, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6d, - 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4d, 0x69, 0x63, 0x72, 0x6f, - 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x09, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, + 0x63, 0x72, 0x6f, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 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, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, - 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, - 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, - 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, - 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x6f, - 0x64, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, 0x43, - 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x22, - 0x40, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x70, 0x6f, 0x6f, - 0x6c, 0x22, 0x6d, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, - 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, - 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2a, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, - 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, - 0x22, 0x5a, 0x0a, 0x19, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, - 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0xde, 0x01, 0x0a, - 0x1a, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, - 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, - 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, - 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x1d, - 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, - 0x0e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x43, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x61, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xc9, 0x01, - 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, - 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x07, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6f, 0x0a, 0x18, 0x4c, 0x69, 0x73, - 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2a, - 0x0a, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, - 0x6f, 0x6f, 0x6c, 0x52, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x22, 0x9d, 0x02, 0x0a, 0x15, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, + 0x41, 0x74, 0x12, 0x48, 0x0a, 0x12, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, + 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x5f, 0x61, 0x74, 0x18, 0x0b, 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, 0x10, 0x62, 0x69, 0x6c, 0x6c, + 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x41, 0x74, 0x12, 0x25, 0x0a, 0x0e, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x11, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, + 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, + 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, + 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x70, 0x75, + 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x15, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x4d, 0x62, 0x22, 0xad, 0x04, 0x0a, 0x0b, 0x50, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x3d, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x5f, + 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x70, 0x65, + 0x6e, 0x64, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, + 0x74, 0x18, 0x0a, 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x23, + 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x72, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x04, 0x62, 0x79, + 0x6f, 0x63, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x22, 0x40, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, + 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x27, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x6d, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, + 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, + 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2a, 0x0a, 0x06, 0x6f, + 0x66, 0x66, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, + 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x22, 0x5a, 0x0a, 0x19, 0x4c, 0x61, 0x75, 0x6e, 0x63, + 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, + 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, + 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x22, 0xde, 0x01, 0x0a, 0x1a, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, + 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, + 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, + 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, + 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x43, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, + 0x65, 0x6e, 0x74, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x47, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, + 0x4f, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x6f, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, + 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, + 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, + 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2a, 0x0a, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x05, 0x70, 0x6f, 0x6f, 0x6c, + 0x73, 0x22, 0x9d, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, + 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, + 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x4e, 0x6f, + 0x64, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0xfc, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, + 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, + 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, + 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, + 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x74, 0x75, 0x70, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x72, + 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x55, 0x72, 0x6c, 0x12, 0x2a, 0x0a, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, + 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, + 0x22, 0xd8, 0x05, 0x0a, 0x0d, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1d, + 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, - 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, - 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, - 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, - 0x70, 0x75, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, - 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xfc, 0x01, 0x0a, 0x16, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, - 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, - 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x75, - 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x74, - 0x75, 0x70, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x2a, 0x0a, - 0x04, 0x62, 0x79, 0x6f, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x22, 0xd8, 0x05, 0x0a, 0x0d, 0x42, 0x59, - 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x23, - 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, - 0x79, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x73, - 0x74, 0x72, 0x6f, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, - 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, - 0x29, 0x0a, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, - 0x78, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x61, - 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, - 0x73, 0x50, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x12, - 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, 0x72, - 0x6f, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, - 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, - 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x48, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, 0x63, - 0x72, 0x6f, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x63, - 0x61, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x12, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x45, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x13, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x31, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, - 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, - 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xff, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, - 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, - 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, - 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, - 0x04, 0x62, 0x79, 0x6f, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x22, 0x75, 0x0a, 0x14, 0x53, 0x63, 0x61, - 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x1f, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x14, + 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, + 0x68, 0x61, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x64, 0x65, 0x73, + 0x69, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, + 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, + 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x5f, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, + 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x5f, 0x70, + 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x73, + 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x50, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, + 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, + 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x10, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, 0x63, 0x72, 0x6f, + 0x73, 0x12, 0x37, 0x0a, 0x18, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x6c, + 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x11, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x48, 0x6f, 0x75, 0x72, 0x6c, 0x79, + 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x53, 0x63, 0x61, 0x6c, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x10, 0x0a, 0x03, + 0x67, 0x70, 0x75, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, + 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x31, 0x0a, 0x12, 0x47, + 0x65, 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, - 0x0a, 0x0d, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4e, 0x6f, - 0x64, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x73, - 0x22, 0x96, 0x01, 0x0a, 0x15, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, - 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, - 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, - 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x2a, 0x0a, - 0x04, 0x62, 0x79, 0x6f, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x22, 0xe2, 0x04, 0x0a, 0x12, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, - 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, - 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, - 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, - 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 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, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x0c, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xff, + 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, + 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, + 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, + 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, - 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, - 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9a, - 0x05, 0x0a, 0x10, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, - 0x66, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x11, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x23, - 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, - 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x72, - 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x72, - 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, 0x12, - 0x17, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x67, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x06, 0x64, 0x69, 0x73, 0x6b, 0x47, 0x62, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, - 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x11, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, + 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, + 0x22, 0x75, 0x0a, 0x14, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, + 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x64, 0x65, + 0x73, 0x69, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, + 0x78, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, + 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x15, 0x53, 0x63, 0x61, 0x6c, + 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, + 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, + 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, + 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x2a, 0x0a, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, + 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, + 0x22, 0xe2, 0x04, 0x0a, 0x12, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x6c, 0x6c, 0x65, + 0x72, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, + 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, + 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, + 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x12, 0x36, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, - 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, - 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xb2, 0x02, 0x0a, 0x1f, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, 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, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, + 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x36, 0x0a, + 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, + 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, + 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9a, 0x05, 0x0a, 0x10, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x6c, + 0x6c, 0x65, 0x72, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, + 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, + 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, + 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, + 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, + 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x08, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x67, + 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x64, 0x69, 0x73, 0x6b, 0x47, 0x62, 0x12, + 0x24, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x69, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x11, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x36, 0x0a, 0x18, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, + 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0xb2, 0x02, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, + 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, + 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, + 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x36, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, + 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, + 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, + 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, + 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x35, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x52, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x93, 0x03, 0x0a, + 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, - 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x70, - 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, - 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, - 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, - 0x22, 0x82, 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x35, - 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x6c, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x93, 0x03, 0x0a, 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, - 0x70, 0x75, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, - 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, - 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, - 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x72, 0x65, + 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, + 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x01, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, + 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, + 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x48, + 0x02, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, + 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, + 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, - 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, - 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, - 0x62, 0x6c, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x42, 0x1b, - 0x0a, 0x19, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, - 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x20, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, - 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x35, 0x0a, 0x07, 0x6c, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x22, 0x40, 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x49, 0x64, 0x22, 0x4b, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, - 0x36, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, - 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, - 0x72, 0x4d, 0x73, 0x67, 0x12, 0x37, 0x0a, 0x08, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x52, 0x08, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x53, 0x0a, - 0x20, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, - 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, - 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, - 0x74, 0x6c, 0x22, 0xb7, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, - 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, - 0x67, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, - 0x05, 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0x46, 0x0a, 0x1c, - 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, - 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x67, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x22, 0x7b, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x31, - 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, - 0x73, 0x22, 0x3b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x22, 0x77, - 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, + 0x74, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, + 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, + 0x12, 0x35, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x07, + 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x40, 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x22, 0x4b, 0x0a, 0x20, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2f, 0x0a, 0x05, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, - 0x52, 0x05, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x22, 0x88, 0x03, 0x0a, 0x11, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, - 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, - 0x70, 0x75, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, - 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, - 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, - 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x36, 0x0a, 0x18, 0x70, 0x72, - 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, - 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x70, 0x72, - 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0x7b, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x7e, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x32, 0x0a, 0x06, 0x72, - 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x06, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x22, - 0x1f, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x7f, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x36, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x83, + 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x72, - 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x37, 0x0a, 0x08, 0x6c, + 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x6c, 0x69, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x22, 0x53, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0xb7, 0x01, 0x0a, 0x21, 0x47, 0x65, + 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, 0x6e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, + 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, + 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x05, 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, + 0x73, 0x41, 0x74, 0x22, 0x46, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x7b, 0x0a, 0x1d, 0x4c, + 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, + 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, + 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, + 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x31, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x22, 0x3b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x49, 0x64, 0x22, 0x77, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2f, 0x0a, + 0x05, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, - 0x73, 0x22, 0x3d, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, + 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x22, 0x88, + 0x03, 0x0a, 0x11, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, + 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x36, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, + 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, + 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x7b, 0x0a, 0x1e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, + 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, + 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, + 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x7e, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, + 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, + 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, + 0x73, 0x67, 0x12, 0x32, 0x0a, 0x06, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x06, + 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x22, 0x1f, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7f, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, + 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, + 0x73, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, + 0x07, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x22, 0x3d, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, + 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, + 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x49, 0x64, 0x22, 0x4a, 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, + 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, + 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, + 0x4d, 0x73, 0x67, 0x22, 0xc8, 0x01, 0x0a, 0x1b, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, + 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x49, 0x64, - 0x22, 0x4a, 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x72, + 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, + 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x65, 0x6e, 0x76, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x22, 0xf2, + 0x01, 0x0a, 0x1c, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, + 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, + 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, + 0x75, 0x62, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x5f, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, + 0x68, 0x65, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x22, 0x55, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x78, 0x0a, 0x1f, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, + 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, + 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x73, 0x22, 0x5a, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, + 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, + 0x67, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, + 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x63, + 0x70, 0x75, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, + 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, + 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, + 0x73, 0x67, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x3c, 0x0a, + 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x67, 0x0a, 0x12, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, + 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, + 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, + 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, + 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3d, 0x0a, + 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xc8, 0x01, 0x0a, - 0x1b, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, - 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0d, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x22, 0xf2, 0x01, 0x0a, 0x1c, 0x4c, 0x61, 0x75, 0x6e, - 0x63, 0x68, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, - 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, - 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x10, 0x0a, - 0x03, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, - 0x23, 0x0a, 0x0d, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x55, 0x0a, 0x1e, - 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x22, 0x78, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, - 0x2c, 0x0a, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x5a, 0x0a, - 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, - 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x21, - 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x21, - 0x0a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x22, 0x83, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x39, 0x0a, 0x0a, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x3c, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x70, - 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, - 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x67, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, - 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x5e, 0x0a, 0x19, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, + 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, + 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x22, 0x6f, 0x0a, 0x1a, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x27, 0x0a, - 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3d, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, - 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x5e, 0x0a, 0x19, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, - 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, - 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6d, 0x61, 0x78, - 0x53, 0x70, 0x65, 0x6e, 0x64, 0x22, 0x6f, 0x0a, 0x1a, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, - 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, - 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, - 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x4b, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x74, 0x74, 0x6c, 0x22, 0x97, 0x01, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, - 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, - 0x18, 0x04, 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0x32, 0x0a, - 0x1a, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x22, 0x46, 0x0a, 0x1b, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, - 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, - 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x4a, 0x0a, 0x19, 0x47, 0x65, 0x74, - 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0xb0, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, - 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x18, 0x0a, - 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, 0x0a, - 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x05, 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, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0x4c, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, - 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x71, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, - 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2c, 0x0a, 0x08, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, - 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x94, 0x05, 0x0a, 0x14, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, - 0x74, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, 0x55, 0x72, 0x6c, 0x12, 0x2a, 0x0a, 0x11, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x68, 0x6f, 0x73, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x47, 0x72, 0x70, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, - 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, - 0x67, 0x72, 0x70, 0x63, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x54, 0x6c, 0x73, 0x12, 0x21, - 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, - 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, - 0x62, 0x61, 0x63, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, - 0x62, 0x61, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x10, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x74, - 0x6f, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x69, - 0x70, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x10, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x69, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x39, 0x0a, 0x19, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, - 0x43, 0x61, 0x63, 0x68, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x09, - 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, - 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, - 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x12, 0x35, 0x0a, 0x07, 0x62, 0x69, 0x6c, - 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, - 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, - 0x22, 0xe2, 0x01, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, - 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x75, 0x73, 0x61, 0x67, 0x65, - 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x75, 0x73, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1f, - 0x0a, 0x0b, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x73, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x2c, 0x0a, 0x12, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x73, - 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x26, 0x0a, - 0x0f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x62, 0x69, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x11, 0x62, 0x69, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x72, 0x67, - 0x69, 0x6e, 0x50, 0x63, 0x74, 0x22, 0xc7, 0x01, 0x0a, 0x14, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, - 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, - 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x35, 0x0a, - 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, - 0x65, 0x74, 0x72, 0x79, 0x53, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, - 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x53, 0x69, 0x6e, - 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0x81, 0x01, 0x0a, 0x18, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, - 0x72, 0x79, 0x53, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, - 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x23, - 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x22, 0xba, 0x04, 0x0a, 0x10, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6a, 0x6f, 0x69, 0x6e, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6a, 0x6f, - 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2f, 0x0a, 0x13, 0x6d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x46, 0x69, 0x6e, - 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x6f, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x63, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x63, 0x70, 0x75, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, - 0x6d, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x4d, 0x62, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x3a, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x18, 0x0a, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x52, 0x09, 0x70, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x12, 0x20, 0x0a, - 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x63, - 0x70, 0x75, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, - 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x70, 0x75, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0e, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x06, 0x67, 0x70, 0x75, 0x49, 0x64, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6c, 0x6f, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x3e, 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, - 0x22, 0xf9, 0x01, 0x0a, 0x11, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, - 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1f, - 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x3b, 0x0a, 0x09, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x22, 0x6f, 0x0a, 0x13, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x22, 0xb9, 0x03, - 0x0a, 0x0a, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, - 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x72, 0x6f, 0x75, 0x74, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, - 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, - 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, - 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x67, 0x0a, 0x26, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, - 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, - 0x72, 0x74, 0x22, 0xc8, 0x01, 0x0a, 0x27, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, - 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x68, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x75, 0x74, 0x68, 0x4b, - 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x55, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x39, 0x0a, - 0x16, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2b, 0x0a, 0x06, - 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, - 0x65, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x22, 0xad, 0x02, 0x0a, 0x1d, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, - 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x72, 0x6f, 0x75, 0x74, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, - 0x0c, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x47, 0x0a, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x74, - 0x74, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x1a, - 0x38, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x72, 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, 0x22, 0x49, 0x0a, 0x1e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, + 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x4b, 0x0a, + 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, + 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0x97, 0x01, 0x0a, 0x1b, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, + 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, + 0x4d, 0x73, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, + 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x04, 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, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x65, 0x73, 0x41, 0x74, 0x22, 0x32, 0x0a, 0x1a, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, + 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x46, 0x0a, 0x1b, 0x52, 0x65, 0x76, 0x6f, + 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, + 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, + 0x22, 0x4a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0xb0, 0x01, 0x0a, + 0x1a, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, - 0x72, 0x4d, 0x73, 0x67, 0x22, 0x8a, 0x06, 0x0a, 0x0f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, - 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, - 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x70, 0x75, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x21, 0x0a, 0x0c, 0x77, - 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x33, - 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x70, - 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6c, 0x6f, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x3e, 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x63, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, - 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x57, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x73, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x13, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, - 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x21, - 0x0a, 0x0c, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x53, 0x65, - 0x74, 0x22, 0x35, 0x0a, 0x12, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x9b, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x72, 0x4d, 0x73, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, + 0x61, 0x74, 0x18, 0x05, 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, + 0x4c, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, + 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x71, 0x0a, + 0x18, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, + 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, + 0x73, 0x67, 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, + 0x22, 0x94, 0x05, 0x0a, 0x14, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, + 0x72, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, + 0x55, 0x72, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, + 0x72, 0x70, 0x63, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x12, + 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, + 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x74, 0x6c, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, + 0x70, 0x63, 0x54, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, + 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, + 0x1a, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x11, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x69, + 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x19, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x61, 0x63, 0x68, 0x65, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, + 0x12, 0x35, 0x0a, 0x07, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, + 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0xe2, 0x01, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, + 0x0a, 0x0e, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x75, 0x73, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x73, 0x61, 0x67, + 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x68, + 0x6f, 0x6f, 0x6b, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x45, 0x6e, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x6f, + 0x6b, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, + 0x6f, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2e, 0x0a, 0x13, + 0x62, 0x69, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, + 0x70, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x62, 0x69, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x50, 0x63, 0x74, 0x22, 0xc7, 0x01, 0x0a, + 0x14, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x12, 0x35, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x53, 0x69, 0x6e, 0x6b, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x74, 0x72, 0x79, 0x53, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x18, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x53, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0xdd, 0x04, 0x0a, 0x10, 0x4a, + 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2f, + 0x0a, 0x13, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x6f, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, + 0x72, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x63, 0x68, 0x12, + 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x08, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x08, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, + 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, + 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x66, + 0x6c, 0x69, 0x67, 0x68, 0x74, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x66, 0x6c, + 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x09, 0x70, 0x72, 0x65, 0x66, 0x6c, + 0x69, 0x67, 0x68, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, + 0x6f, 0x72, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x4d, + 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x70, 0x75, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x67, 0x70, 0x75, 0x49, + 0x64, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x6c, + 0x6f, 0x74, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6c, 0x6f, 0x74, 0x50, + 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3e, 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x19, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, + 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, + 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x22, 0xf9, 0x01, 0x0a, 0x11, 0x4a, + 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2b, 0x0a, 0x06, 0x72, 0x6f, 0x75, - 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x06, - 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6c, 0x6f, 0x74, 0x52, - 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x22, 0xb7, 0x01, 0x0a, 0x0e, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, - 0x65, 0x76, 0x65, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, - 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, - 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x75, 0x6e, - 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, - 0x22, 0xb4, 0x04, 0x0a, 0x13, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x70, 0x75, 0x5f, - 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x26, - 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, - 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, - 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, - 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, 0x20, 0x0a, 0x0c, - 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x22, - 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x6f, 0x74, 0x61, 0x6c, - 0x4d, 0x62, 0x12, 0x24, 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, - 0x5f, 0x70, 0x63, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x6b, - 0x55, 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, - 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, - 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x47, - 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x0c, 0x70, 0x61, 0x74, 0x68, 0x5f, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, - 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0b, 0x70, 0x61, 0x74, 0x68, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xa1, 0x02, 0x0a, 0x10, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x2e, 0x41, 0x74, 0x74, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x61, 0x74, 0x74, - 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, - 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, - 0x6e, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x1a, 0x38, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x72, 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, 0x22, 0xd0, 0x01, 0x0a, 0x15, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2b, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x04, 0x6c, - 0x6f, 0x67, 0x73, 0x12, 0x36, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x41, - 0x0a, 0x16, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, - 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, - 0x67, 0x22, 0x8c, 0x04, 0x0a, 0x07, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, - 0x03, 0x63, 0x70, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, - 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, - 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, - 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x63, 0x61, 0x6c, - 0x65, 0x55, 0x72, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x63, 0x61, 0x6c, - 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, 0x12, 0x25, 0x0a, 0x0e, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x4b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, - 0x76, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x40, 0x0a, 0x0f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x52, 0x0e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, - 0x22, 0xed, 0x05, 0x0a, 0x0e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, - 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x11, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x70, 0x75, - 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x70, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, - 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x66, - 0x72, 0x65, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, - 0x5f, 0x70, 0x63, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x63, 0x61, 0x63, 0x68, - 0x65, 0x55, 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x61, 0x63, - 0x68, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x61, - 0x63, 0x68, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x26, - 0x0a, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x70, - 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x26, 0x0a, 0x0f, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, - 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x20, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x73, 0x65, - 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x6b, - 0x55, 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x22, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x64, - 0x69, 0x73, 0x6b, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x24, 0x0a, 0x0e, 0x64, 0x69, - 0x73, 0x6b, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, - 0x12, 0x3e, 0x0a, 0x0c, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x52, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x22, 0xb2, 0x01, 0x0a, 0x12, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x61, 0x74, 0x68, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x62, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x61, 0x67, - 0x65, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x75, 0x73, 0x61, - 0x67, 0x65, 0x50, 0x63, 0x74, 0x22, 0x48, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, - 0xe3, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, + 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, + 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x3b, 0x0a, 0x09, 0x62, 0x6f, 0x6f, + 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x6f, 0x74, + 0x73, 0x74, 0x72, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, 0x62, 0x6f, 0x6f, + 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x22, 0x6f, 0x0a, 0x13, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, + 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, + 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, + 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x22, 0xb9, 0x03, 0x0a, 0x0a, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x49, + 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, + 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, + 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, + 0x72, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, + 0x78, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x22, 0x67, 0x0a, 0x26, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, + 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, + 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xc8, 0x01, 0x0a, + 0x27, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, - 0x67, 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, - 0x3b, 0x0a, 0x04, 0x67, 0x70, 0x75, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x47, 0x70, 0x75, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x67, 0x70, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, - 0x47, 0x70, 0x75, 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, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x33, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, - 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xa9, 0x02, 0x0a, 0x15, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2a, 0x0a, - 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x55, 0x72, 0x6c, 0x12, 0x32, 0x0a, 0x15, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x30, 0x0a, 0x14, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x27, 0x0a, - 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x52, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, - 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x40, 0x0a, 0x15, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xb6, 0x02, 0x0a, - 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, - 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, - 0x65, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, - 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, - 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, - 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 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, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 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, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x65, 0x0a, 0x12, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, - 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x22, 0x33, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x64, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, + 0x67, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x1a, 0x0a, + 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x70, 0x68, + 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x65, 0x70, + 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x39, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x24, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x0a, 0x12, - 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x22, 0x64, 0x0a, - 0x13, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2b, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x06, 0x72, 0x6f, 0x75, + 0x74, 0x65, 0x73, 0x22, 0xad, 0x02, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x49, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x47, 0x0a, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x31, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x1a, 0x38, 0x0a, 0x0a, 0x41, 0x74, 0x74, + 0x72, 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, 0x22, 0x49, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xd4, + 0x07, 0x0a, 0x0f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6c, + 0x6f, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x10, + 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, + 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, + 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, + 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x67, 0x70, 0x75, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x25, + 0x0a, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, + 0x6b, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x53, 0x6c, 0x6f, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3e, 0x0a, + 0x1b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, + 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x34, + 0x0a, 0x16, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x11, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, + 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x12, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x50, 0x6f, + 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, + 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, + 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, + 0x65, 0x6d, 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x69, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x53, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x67, + 0x76, 0x69, 0x73, 0x6f, 0x72, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x16, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x67, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x50, 0x6c, 0x61, 0x74, + 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x1f, 0x0a, 0x0b, 0x67, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x5f, 0x72, + 0x6f, 0x6f, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x67, 0x76, 0x69, 0x73, 0x6f, + 0x72, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x5f, + 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x18, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0f, 0x67, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x72, 0x61, 0x41, 0x72, 0x67, + 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x79, 0x5f, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x13, 0x63, 0x70, 0x75, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x64, 0x22, 0x35, 0x0a, 0x12, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x9b, 0x01, 0x0a, + 0x13, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x24, 0x0a, - 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, - 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, - 0x72, 0x4d, 0x73, 0x67, 0x22, 0x83, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, - 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x72, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x72, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x69, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x22, 0x4b, 0x0a, 0x0e, 0x47, 0x65, - 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2b, 0x0a, + 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x05, 0x73, 0x6c, + 0x6f, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, + 0x6c, 0x6f, 0x74, 0x52, 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x22, 0xb7, 0x01, 0x0a, 0x0e, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x55, 0x6e, 0x69, 0x78, + 0x4e, 0x61, 0x6e, 0x6f, 0x22, 0xb4, 0x04, 0x0a, 0x13, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x2e, 0x0a, 0x13, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, + 0x61, 0x6e, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x2e, 0x0a, 0x13, + 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x70, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x70, 0x75, 0x55, 0x74, + 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, 0x24, 0x0a, 0x0e, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x65, 0x64, + 0x4d, 0x62, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x70, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, + 0x12, 0x20, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x65, 0x64, + 0x4d, 0x62, 0x12, 0x22, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x6d, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x6b, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x24, 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, + 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, + 0x64, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x69, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, + 0x6b, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, 0x70, + 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x66, + 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x0c, 0x70, + 0x61, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0b, + 0x70, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xa1, 0x02, 0x0a, 0x10, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x05, 0x61, 0x74, + 0x74, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x55, 0x6e, + 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x38, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x72, 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, 0x22, + 0xd0, 0x01, 0x0a, 0x15, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2b, 0x0a, 0x04, 0x6c, 0x6f, + 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, + 0x64, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x36, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, + 0x31, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0x41, 0x0a, 0x16, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x14, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x67, 0x0a, - 0x13, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x27, 0x0a, - 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x07, 0x77, - 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x22, 0x32, 0x0a, 0x13, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, - 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, - 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3f, 0x0a, 0x14, 0x43, 0x6f, - 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x8c, 0x04, 0x0a, 0x07, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, + 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x67, + 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, + 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x11, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, 0x12, + 0x25, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, + 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x4b, 0x65, 0x65, + 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x44, 0x61, 0x74, 0x61, 0x22, 0xed, 0x05, 0x0a, 0x0e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x41, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2e, 0x0a, + 0x13, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x70, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x70, 0x75, 0x55, + 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, 0x34, 0x0a, + 0x16, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x63, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x65, + 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x24, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x75, + 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x55, 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, 0x12, 0x25, 0x0a, + 0x0e, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x10, 0x63, 0x61, 0x63, 0x68, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, + 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x43, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x65, 0x64, 0x4d, 0x62, + 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x6d, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x20, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x6b, + 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, + 0x64, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x22, 0x0a, 0x0d, 0x64, 0x69, + 0x73, 0x6b, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x24, + 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x63, 0x74, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, + 0x65, 0x50, 0x63, 0x74, 0x12, 0x3e, 0x0a, 0x0c, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x61, 0x74, 0x68, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x22, 0xb2, 0x01, 0x0a, 0x12, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x19, + 0x0a, 0x08, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x07, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0b, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x62, 0x12, 0x1b, 0x0a, 0x09, + 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x08, 0x75, 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, 0x22, 0x48, 0x0a, 0x13, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x22, 0xfe, 0x02, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, + 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, + 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x04, 0x67, 0x70, 0x75, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x47, 0x70, 0x75, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x67, 0x70, 0x75, 0x73, + 0x12, 0x57, 0x0a, 0x0e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x67, 0x70, + 0x75, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x47, 0x70, 0x75, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x47, 0x70, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x47, 0x70, 0x75, + 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, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x40, 0x0a, 0x12, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x47, + 0x70, 0x75, 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, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x33, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xa9, 0x02, 0x0a, 0x15, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2a, 0x0a, 0x07, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, + 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x55, 0x72, 0x6c, 0x12, 0x32, 0x0a, 0x15, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, + 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x55, + 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x27, 0x0a, 0x0f, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x52, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, + 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x40, 0x0a, 0x15, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x34, 0x0a, 0x15, 0x55, - 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, - 0x64, 0x22, 0x41, 0x0a, 0x16, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xb6, 0x02, 0x0a, 0x05, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, + 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0b, + 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, + 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, + 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 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, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x65, 0x0a, 0x12, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, + 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, + 0x22, 0x33, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x64, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, + 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, + 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x24, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x0a, 0x12, 0x54, + 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x22, 0x64, 0x0a, 0x13, + 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x24, 0x0a, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0x2f, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, + 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, + 0x4d, 0x73, 0x67, 0x22, 0x83, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x23, + 0x0a, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x72, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x72, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, + 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x69, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x22, 0x4b, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, - 0x72, 0x4d, 0x73, 0x67, 0x22, 0x31, 0x0a, 0x12, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, - 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, - 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x13, 0x44, 0x72, 0x61, 0x69, 0x6e, - 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, - 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x1e, 0x0a, 0x1c, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x72, 0x4d, 0x73, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x14, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x67, 0x0a, 0x13, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x27, 0x0a, 0x07, + 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x07, 0x77, 0x6f, + 0x72, 0x6b, 0x65, 0x72, 0x73, 0x22, 0x32, 0x0a, 0x13, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, + 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3f, 0x0a, 0x14, 0x43, 0x6f, 0x72, + 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, + 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x34, 0x0a, 0x15, 0x55, 0x6e, + 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, + 0x22, 0x41, 0x0a, 0x16, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, + 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, + 0x4d, 0x73, 0x67, 0x22, 0x31, 0x0a, 0x12, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, + 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, + 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x13, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, + 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, + 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, + 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x1e, 0x0a, 0x1c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc6, 0x02, 0x0a, 0x1d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc6, 0x02, 0x0a, 0x1d, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, - 0x70, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x72, - 0x74, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, 0x74, - 0x70, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, 0x54, 0x6c, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x68, 0x6f, 0x73, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, - 0x72, 0x70, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x50, - 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, - 0x72, 0x70, 0x63, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x54, 0x6c, 0x73, 0x12, 0x21, 0x0a, - 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, - 0x22, 0xae, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x31, - 0x0a, 0x15, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x75, 0x6e, - 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6f, - 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x41, 0x74, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, - 0x6f, 0x22, 0x4a, 0x0a, 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x2a, 0x43, 0x0a, - 0x1f, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x09, 0x0a, 0x05, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x44, - 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x4f, 0x56, 0x45, 0x44, - 0x10, 0x02, 0x32, 0x95, 0x3d, 0x0a, 0x0e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x65, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x11, 0x22, 0x0f, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x65, 0x12, 0x5f, 0x0a, 0x0b, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x69, 0x67, 0x6e, - 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x73, - 0x69, 0x67, 0x6e, 0x12, 0x5e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x48, 0x65, 0x61, 0x64, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x68, 0x61, - 0x73, 0x68, 0x7d, 0x12, 0x60, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x12, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x4c, 0x0a, 0x0f, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x75, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x28, 0x01, 0x12, 0x62, 0x0a, 0x13, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, - 0x77, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x22, 0x1f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x54, 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x22, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x54, - 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2f, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x53, 0x0a, 0x07, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, - 0x12, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x6e, 0x64, 0x54, 0x61, - 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, - 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2f, 0x65, 0x6e, 0x64, 0x12, 0x5a, 0x0a, 0x09, 0x53, 0x74, - 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x74, 0x61, 0x73, 0x6b, - 0x73, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x52, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x08, 0x12, 0x06, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x67, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x12, 0x1f, 0x2e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, + 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, + 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x72, 0x74, + 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, 0x74, 0x70, + 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, 0x54, 0x6c, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, + 0x70, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, + 0x70, 0x63, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x54, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, + 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, + 0xae, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x31, 0x0a, + 0x15, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x75, 0x6e, 0x69, + 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x41, 0x74, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, + 0x22, 0x4a, 0x0a, 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x2a, 0x43, 0x0a, 0x1f, + 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x09, 0x0a, 0x05, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, + 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, + 0x02, 0x32, 0x95, 0x3d, 0x0a, 0x0e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x65, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, + 0x22, 0x0f, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x65, 0x12, 0x5f, 0x0a, 0x0b, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x73, 0x69, + 0x67, 0x6e, 0x12, 0x5e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x11, 0x12, 0x0f, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x68, 0x61, 0x73, + 0x68, 0x7d, 0x12, 0x60, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x12, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x12, 0x4c, 0x0a, 0x0f, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x75, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x28, 0x01, 0x12, 0x62, 0x0a, 0x13, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0d, 0x12, 0x0b, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x77, + 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, + 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x22, 0x1f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x54, 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x22, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x54, 0x6f, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x12, 0x53, 0x0a, 0x07, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x12, + 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2f, 0x65, 0x6e, 0x64, 0x12, 0x5a, 0x0a, 0x09, 0x53, 0x74, 0x6f, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x52, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x08, 0x12, 0x06, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x67, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x12, 0x1f, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, 0x2f, 0x73, 0x74, - 0x75, 0x62, 0x73, 0x12, 0x5f, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, - 0x62, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, - 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x73, 0x74, 0x75, 0x62, 0x73, 0x2f, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x57, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x12, 0x16, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x73, 0x74, 0x75, 0x62, 0x73, 0x2f, - 0x7b, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x72, 0x6c, 0x12, 0x6a, 0x0a, - 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x6f, - 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x18, 0x22, 0x16, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x75, 0x0a, 0x0f, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x22, 0x17, 0x2f, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x12, 0x78, 0x0a, 0x0f, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, 0x2f, 0x73, 0x74, 0x75, + 0x62, 0x73, 0x12, 0x5f, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, + 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, + 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x73, 0x74, 0x75, 0x62, 0x73, 0x2f, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x12, 0x57, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x12, 0x16, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x73, 0x74, 0x75, 0x62, 0x73, 0x2f, 0x7b, + 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x72, 0x6c, 0x12, 0x6a, 0x0a, 0x0f, + 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x18, 0x22, 0x16, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x75, 0x0a, 0x0f, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1f, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x22, 0x17, 0x2f, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x12, 0x78, 0x0a, 0x0f, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x72, 0x0a, - 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x2a, 0x11, - 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, - 0x7d, 0x12, 0x52, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x19, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, - 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, - 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x6b, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, - 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, - 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x3a, 0x6f, 0x66, 0x66, 0x65, - 0x72, 0x73, 0x12, 0x77, 0x0a, 0x12, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, - 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, - 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x70, - 0x6f, 0x6f, 0x6c, 0x73, 0x3a, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x12, 0x6f, 0x0a, 0x10, 0x4c, - 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, - 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x70, - 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x69, 0x0a, 0x0e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1e, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, - 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, - 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x70, 0x6f, 0x6f, - 0x6c, 0x73, 0x2f, 0x62, 0x79, 0x6f, 0x63, 0x12, 0x69, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x42, 0x59, - 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x47, 0x65, 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, - 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, - 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x62, 0x79, - 0x6f, 0x63, 0x12, 0x78, 0x0a, 0x0d, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, - 0x6f, 0x6f, 0x6c, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, - 0x61, 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, 0x61, - 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, - 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x7d, 0x2f, 0x62, 0x79, 0x6f, 0x63, 0x2f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x91, 0x01, 0x0a, - 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x9e, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, + 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x72, 0x0a, 0x10, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x2a, 0x11, 0x2f, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, + 0x12, 0x52, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x19, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x70, + 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x6b, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, + 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, + 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x3a, 0x6f, 0x66, 0x66, 0x65, 0x72, + 0x73, 0x12, 0x77, 0x0a, 0x12, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, + 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x70, 0x6f, + 0x6f, 0x6c, 0x73, 0x3a, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x12, 0x6f, 0x0a, 0x10, 0x4c, 0x69, + 0x73, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x20, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x70, 0x6f, + 0x6f, 0x6c, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x69, 0x0a, 0x0e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1e, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, + 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, + 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, + 0x73, 0x2f, 0x62, 0x79, 0x6f, 0x63, 0x12, 0x69, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x42, 0x59, 0x4f, + 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x47, 0x65, 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, + 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, + 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x62, 0x79, 0x6f, + 0x63, 0x12, 0x78, 0x0a, 0x0d, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, + 0x6f, 0x6c, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, 0x61, 0x6c, + 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, 0x70, + 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, + 0x2f, 0x62, 0x79, 0x6f, 0x63, 0x2f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x18, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x9e, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, 0x2f, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, + 0x12, 0x9b, 0x01, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, 0x2f, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, - 0x7d, 0x12, 0x9b, 0x01, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x28, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x2a, 0x22, 0x2f, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x12, - 0x8b, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x27, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0xae, 0x01, - 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x29, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, - 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x3a, 0x01, 0x2a, 0x22, 0x2f, 0x2f, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, - 0x7d, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x83, - 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, - 0x13, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6f, 0x66, - 0x66, 0x65, 0x72, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, - 0x20, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6f, 0x66, - 0x66, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, - 0x7d, 0x12, 0x8d, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, - 0x73, 0x12, 0x87, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x12, 0x26, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x17, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, - 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x22, 0x2a, 0x20, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x2f, 0x7b, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, - 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x97, 0x01, 0x0a, 0x14, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, - 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x24, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x61, - 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x2f, 0x7b, 0x72, 0x65, 0x6e, - 0x74, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x12, 0xa1, + 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x2a, 0x22, 0x2f, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x8b, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, + 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x12, 0x2b, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x35, 0x12, 0x33, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, + 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0xae, 0x01, 0x0a, + 0x19, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, + 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x29, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, 0x6f, + 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x3a, 0x01, 0x2a, 0x22, 0x2f, 0x2f, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x83, 0x01, + 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, + 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6f, 0x66, 0x66, + 0x65, 0x72, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, + 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6f, 0x66, 0x66, + 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, + 0x12, 0x8d, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, + 0x12, 0x87, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x12, 0x26, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, + 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x17, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, + 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x22, 0x2a, 0x20, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, + 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x2f, 0x7b, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, + 0x69, 0x64, 0x7d, 0x12, 0x97, 0x01, 0x0a, 0x14, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, + 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x24, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6e, + 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x61, 0x75, + 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x2f, 0x7b, 0x72, 0x65, 0x6e, 0x74, + 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x12, 0xa1, 0x01, + 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x2d, 0x12, 0x2b, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x35, 0x12, 0x33, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x2f, + 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, + 0x73, 0x12, 0x5c, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, + 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, + 0x2a, 0x0d, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, + 0x7e, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, + 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x12, + 0x8b, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, + 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, + 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, 0x2f, + 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x86, 0x01, + 0x0a, 0x13, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, + 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x70, 0x6f, + 0x6f, 0x6c, 0x73, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, + 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x12, 0x89, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x50, 0x6f, + 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x22, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, + 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x50, + 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, + 0x2a, 0x22, 0x1f, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x12, 0x7c, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, - 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, 0x2f, 0x70, 0x6f, 0x6f, - 0x6c, 0x73, 0x12, 0x5c, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, - 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, - 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0f, 0x2a, 0x0d, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, - 0x12, 0x7e, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, - 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x70, 0x6f, 0x6f, - 0x6c, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, - 0x12, 0x8b, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, - 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, - 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, - 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, - 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x86, - 0x01, 0x0a, 0x13, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, - 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, - 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x70, - 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x2f, 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x12, 0x89, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x50, - 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x22, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, 0x6c, - 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, - 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, - 0x01, 0x2a, 0x22, 0x1f, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x12, 0x7c, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, - 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x73, 0x12, 0x5a, 0x0a, 0x09, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, - 0x22, 0x0b, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x12, 0xac, 0x01, - 0x0a, 0x1f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x12, 0x2f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x12, 0x5a, 0x0a, 0x09, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, + 0x0b, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x12, 0xac, 0x01, 0x0a, + 0x1f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x12, 0x2f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, + 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, - 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, - 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, - 0x1b, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, - 0x74, 0x2d, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x73, 0x0a, 0x0f, - 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, - 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x3a, 0x6c, 0x69, 0x73, - 0x74, 0x12, 0x8a, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x26, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x8c, - 0x01, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x4a, 0x0a, - 0x0b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x59, 0x0a, 0x14, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, - 0x79, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x6d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x73, 0x12, 0x64, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x3a, 0x01, 0x2a, 0x22, - 0x09, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x6e, 0x0a, 0x0d, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, + 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, + 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, + 0x2d, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x73, 0x0a, 0x0f, 0x4c, + 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1f, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x3a, 0x6c, 0x69, 0x73, 0x74, + 0x12, 0x8a, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x26, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x8c, 0x01, + 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, + 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x4a, 0x0a, 0x0b, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x59, 0x0a, 0x14, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, + 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x73, 0x12, 0x64, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x3a, 0x01, 0x2a, 0x22, 0x09, + 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x6e, 0x0a, 0x0d, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x56, 0x0a, 0x0a, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x09, 0x22, 0x07, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x6b, 0x0a, - 0x0b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, - 0x19, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, 0x7b, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x12, 0x64, 0x0a, 0x0b, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, 0x7b, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x7d, - 0x12, 0x5a, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, - 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x70, 0x0a, 0x0c, - 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1d, 0x22, 0x1b, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x12, 0x78, - 0x0a, 0x0e, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, - 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x6e, 0x63, 0x6f, 0x72, - 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x6e, 0x63, 0x6f, 0x72, - 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, + 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x18, 0x2a, 0x16, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x56, 0x0a, 0x0a, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x12, 0x59, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x09, 0x22, 0x07, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x6b, 0x0a, 0x0b, + 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x19, + 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, 0x7b, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x12, 0x64, 0x0a, 0x0b, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x2f, 0x7b, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, + 0x5a, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x1b, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0a, 0x12, 0x08, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x70, 0x0a, 0x0c, 0x43, + 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, + 0x22, 0x1b, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x12, 0x78, 0x0a, + 0x0e, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, + 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, + 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, + 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x65, + 0x72, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x75, + 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x12, 0x6c, 0x0a, 0x0b, 0x44, 0x72, 0x61, 0x69, 0x6e, + 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x72, + 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x22, 0x1a, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, - 0x75, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x12, 0x6c, 0x0a, 0x0b, 0x44, 0x72, 0x61, 0x69, - 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, - 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x22, 0x1a, 0x2f, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x12, 0x81, 0x01, 0x0a, 0x15, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x23, 0x5a, 0x21, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x65, 0x61, 0x6d, 0x2d, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x2f, 0x62, 0x65, 0x74, 0x61, 0x39, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x64, 0x72, 0x61, 0x69, 0x6e, 0x12, 0x81, 0x01, 0x0a, 0x15, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x23, 0x5a, 0x21, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x65, 0x61, 0x6d, 0x2d, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x2f, 0x62, 0x65, 0x74, 0x61, 0x39, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/gateway_grpc.pb.go b/proto/gateway_grpc.pb.go index c4a34835f..dc780a008 100644 --- a/proto/gateway_grpc.pb.go +++ b/proto/gateway_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.1 +// - protoc v3.21.12 // source: gateway.proto package proto diff --git a/proto/pod.pb.go b/proto/pod.pb.go index 247fa8cae..1e789be59 100644 --- a/proto/pod.pb.go +++ b/proto/pod.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.25.1 +// protoc v3.21.12 // source: pod.proto package proto diff --git a/proto/pod_grpc.pb.go b/proto/pod_grpc.pb.go index c44ee2ace..98e8f29ec 100644 --- a/proto/pod_grpc.pb.go +++ b/proto/pod_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.1 +// - protoc v3.21.12 // source: pod.proto package proto diff --git a/proto/types.pb.go b/proto/types.pb.go index b8fc19e4e..a553de890 100644 --- a/proto/types.pb.go +++ b/proto/types.pb.go @@ -3220,7 +3220,7 @@ var file_types_proto_rawDesc = []byte{ 0x65, 0x73, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1c, 0x0a, 0x03, 0x61, 0x70, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x52, 0x03, 0x61, 0x70, 0x70, 0x22, - 0x8a, 0x05, 0x0a, 0x06, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0xcc, 0x06, 0x0a, 0x06, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x18, @@ -3260,95 +3260,107 @@ var file_types_proto_rawDesc = []byte{ 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x70, 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xe6, 0x03, 0x0a, - 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, - 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x72, 0x65, 0x65, 0x5f, - 0x67, 0x70, 0x75, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x66, 0x72, 0x65, 0x65, 0x47, - 0x70, 0x75, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x72, 0x65, 0x65, 0x43, 0x70, 0x75, 0x12, 0x1f, 0x0a, - 0x0b, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0a, 0x66, 0x72, 0x65, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x27, - 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x10, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x11, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x11, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, - 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x12, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x70, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x25, - 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x8f, 0x04, 0x0a, 0x09, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x18, 0x05, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, - 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, - 0x30, 0x0a, 0x14, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x47, 0x70, 0x75, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, - 0x14, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6e, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x49, 0x64, 0x12, - 0x44, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x07, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x22, 0xd3, 0x02, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, - 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x1f, 0x0a, - 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, - 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, - 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x72, 0x6c, 0x12, - 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x09, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x23, 0x5a, - 0x21, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x65, 0x61, 0x6d, - 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x62, 0x65, 0x74, 0x61, 0x39, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x29, 0x0a, 0x10, + 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, + 0x75, 0x74, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, + 0x74, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x77, 0x6f, + 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, + 0x69, 0x64, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x77, 0x6f, 0x72, 0x6b, 0x65, + 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x22, 0xe6, + 0x03, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, + 0x6e, 0x67, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x72, 0x65, + 0x65, 0x5f, 0x67, 0x70, 0x75, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x66, 0x72, 0x65, + 0x65, 0x47, 0x70, 0x75, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x63, 0x70, 0x75, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x72, 0x65, 0x65, 0x43, 0x70, 0x75, 0x12, + 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x66, 0x72, 0x65, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x77, 0x6f, 0x72, 0x6b, + 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x57, + 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x11, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x11, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x12, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, + 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x8f, 0x04, 0x0a, 0x09, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 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, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x05, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x65, + 0x79, 0x12, 0x30, 0x0a, 0x14, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x67, 0x70, 0x75, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x47, 0x70, 0x75, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, + 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x49, + 0x64, 0x12, 0x44, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, + 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x63, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x52, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x22, 0xd3, 0x02, 0x0a, 0x10, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, + 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, + 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, + 0x0a, 0x0c, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x72, + 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 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, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x09, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, + 0x23, 0x5a, 0x21, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x65, + 0x61, 0x6d, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x62, 0x65, 0x74, 0x61, 0x39, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/worker_repo.pb.go b/proto/worker_repo.pb.go index eb6633d4c..372cbb762 100644 --- a/proto/worker_repo.pb.go +++ b/proto/worker_repo.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.25.1 +// protoc v3.21.12 // source: worker_repo.proto package proto diff --git a/proto/worker_repo_grpc.pb.go b/proto/worker_repo_grpc.pb.go index 87b249ee0..9f3f8d8cc 100644 --- a/proto/worker_repo_grpc.pb.go +++ b/proto/worker_repo_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.1 +// - protoc v3.21.12 // source: worker_repo.proto package proto From e03a1c26381951efc14c5ddfc6b5369c1de226b2 Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Thu, 23 Jul 2026 18:40:44 +0000 Subject: [PATCH 10/26] added mounts and gates --- pkg/worker/container_server.go | 10 +- pkg/worker/container_server_test.go | 61 ++++++++++++ pkg/worker/lifecycle.go | 11 +++ pkg/worker/lifecycle_test.go | 64 ++++++++++++- pkg/worker/thunder.go | 142 +++++++++++++++++++++++++++- pkg/worker/thunder_test.go | 85 +++++++++++++++++ pkg/worker/worker.go | 7 ++ 7 files changed, 371 insertions(+), 9 deletions(-) diff --git a/pkg/worker/container_server.go b/pkg/worker/container_server.go index 4bc916c5a..659feabd1 100644 --- a/pkg/worker/container_server.go +++ b/pkg/worker/container_server.go @@ -59,6 +59,7 @@ type ContainerRuntimeServer struct { killedSandboxProcesses sync.Map containerRepoClient pb.ContainerRepositoryServiceClient containerNetworkManager ContainerNetwork + thunderSetupTracker *thunderSetupTracker imageClient *ImageClient runtime runtime.Runtime // The worker's configured runtime (from pool config) eventRepo processLogEventRepository @@ -81,6 +82,7 @@ type ContainerRuntimeServerOpts struct { ImageClient *ImageClient ContainerRepoClient pb.ContainerRepositoryServiceClient ContainerNetworkManager ContainerNetwork + ThunderSetupTracker *thunderSetupTracker EventRepo repository.EventRepository WorkerID string BackendRoute backendRouteFunc @@ -107,6 +109,7 @@ func NewContainerRuntimeServer(opts *ContainerRuntimeServerOpts) (*ContainerRunt imageClient: opts.ImageClient, containerRepoClient: opts.ContainerRepoClient, containerNetworkManager: opts.ContainerNetworkManager, + thunderSetupTracker: opts.ThunderSetupTracker, eventRepo: opts.EventRepo, workerID: opts.WorkerID, backendRoute: opts.BackendRoute, @@ -613,8 +616,6 @@ func (s *ContainerRuntimeServer) getHostPathFromContainerPath(containerPath stri // Sandbox methods follow (these are runtime-agnostic and work with the sandbox process manager) func (s *ContainerRuntimeServer) ContainerSandboxExec(ctx context.Context, in *pb.ContainerSandboxExecRequest) (*pb.ContainerSandboxExecResponse, error) { - log.Info().Str("container_id", in.ContainerId).Str("cmd", in.Cmd).Msg("running sandbox command") - parsedCmd, err := shlex.Split(in.Cmd) if err != nil { return &pb.ContainerSandboxExecResponse{Ok: false, ErrorMsg: err.Error()}, nil @@ -630,6 +631,10 @@ func (s *ContainerRuntimeServer) ContainerSandboxExec(ctx context.Context, in *p return &pb.ContainerSandboxExecResponse{Ok: false, ErrorMsg: err.Error()}, nil } + if err := s.thunderSetupTracker.Wait(ctx, in.ContainerId); err != nil { + return &pb.ContainerSandboxExecResponse{Ok: false, ErrorMsg: err.Error()}, nil + } + if instance.Spec == nil || instance.Spec.Process == nil { return &pb.ContainerSandboxExecResponse{Ok: false, ErrorMsg: "Container spec not ready"}, nil } @@ -642,6 +647,7 @@ func (s *ContainerRuntimeServer) ContainerSandboxExec(ctx context.Context, in *p env = append(env, formattedEnv...) + log.Info().Str("container_id", in.ContainerId).Str("cmd", in.Cmd).Msg("running sandbox command") return s.handleSandboxExec(ctx, in, instance, env, parsedCmd, in.Cwd) } diff --git a/pkg/worker/container_server_test.go b/pkg/worker/container_server_test.go index a9ac042ea..51720484c 100644 --- a/pkg/worker/container_server_test.go +++ b/pkg/worker/container_server_test.go @@ -3,6 +3,7 @@ package worker import ( "context" "encoding/json" + "errors" "fmt" "os" "path/filepath" @@ -305,6 +306,66 @@ func TestContainerSandboxExecDoesNotPollRuntimeStateBeforeProcessManagerReady(t require.Equal(t, int32(0), rt.stateCalls.Load()) } +func TestContainerSandboxExecWaitsForThunderSetup(t *testing.T) { + containerId := "sandbox-test" + ready := make(chan struct{}) + close(ready) + tracker := newThunderSetupTracker() + tracker.Begin(containerId) + + server := &ContainerRuntimeServer{ + containerInstances: common.NewSafeMap[*ContainerInstance](), + thunderSetupTracker: tracker, + } + server.containerInstances.Set(containerId, &ContainerInstance{ + Id: containerId, + SandboxProcessManagerReady: true, + ProcessManagerReadyChan: ready, + Spec: &specs.Spec{Process: &specs.Process{}}, + }) + + ctx, cancel := context.WithTimeout(context.Background(), 25*time.Millisecond) + defer cancel() + resp, err := server.ContainerSandboxExec(ctx, &pb.ContainerSandboxExecRequest{ + ContainerId: containerId, + Cmd: "true", + }) + + require.NoError(t, err) + require.False(t, resp.Ok) + require.Contains(t, resp.ErrorMsg, "Thunder client setup did not complete") +} + +func TestContainerSandboxExecReturnsThunderSetupFailure(t *testing.T) { + containerId := "sandbox-test" + ready := make(chan struct{}) + close(ready) + tracker := newThunderSetupTracker() + tracker.Begin(containerId) + tracker.Complete(containerId, errors.New("install failed")) + + server := &ContainerRuntimeServer{ + containerInstances: common.NewSafeMap[*ContainerInstance](), + thunderSetupTracker: tracker, + } + server.containerInstances.Set(containerId, &ContainerInstance{ + Id: containerId, + SandboxProcessManagerReady: true, + ProcessManagerReadyChan: ready, + Spec: &specs.Spec{Process: &specs.Process{}}, + }) + + resp, err := server.ContainerSandboxExec(context.Background(), &pb.ContainerSandboxExecRequest{ + ContainerId: containerId, + Cmd: "true", + }) + + require.NoError(t, err) + require.False(t, resp.Ok) + require.Contains(t, resp.ErrorMsg, "Thunder client setup failed") + require.Contains(t, resp.ErrorMsg, "install failed") +} + func TestContainerSandboxStatusReportsPendingBeforeProcessManagerReady(t *testing.T) { containerId := "sandbox-test" server := &ContainerRuntimeServer{ diff --git a/pkg/worker/lifecycle.go b/pkg/worker/lifecycle.go index b03752657..85d100349 100644 --- a/pkg/worker/lifecycle.go +++ b/pkg/worker/lifecycle.go @@ -268,6 +268,8 @@ func (s *Worker) markContainerStopping(containerId string) { } func (s *Worker) deleteContainer(containerId string) { + s.thunderSetupTracker.Delete(containerId) + if instance, exists := s.containerInstances.Get(containerId); exists && instance.SandboxProcessManager != nil { if err := instance.SandboxProcessManager.Cleanup(); err != nil { log.Debug().Str("container_id", containerId).Err(err).Msg("failed to cleanup sandbox process manager client") @@ -307,6 +309,9 @@ func (s *Worker) RunContainer(ctx context.Context, request *types.ContainerReque } if request.Stub.Type.Kind() == types.StubTypeSandbox { instance.initializeProcessManagerReadiness() + if request.GpuVirtualized { + s.thunderSetupTracker.Begin(request.ContainerId) + } } } s.containerInstances.Set(containerId, instance) @@ -924,6 +929,10 @@ func (s *Worker) specFromRequest(request *types.ContainerRequest, options *Conta } s.enableVolumeCaching(request, volumeCacheMap, spec) + if request.RequiresGPU() && request.GpuVirtualized { + spec.Mounts = s.gpuManagerForRequest(request).InjectMounts(spec.Mounts) + } + // Configure resolv.conf resolvMount := specs.Mount{ Type: "none", @@ -1452,6 +1461,7 @@ func (s *Worker) spawn(request *types.ContainerRequest, spec *specs.Spec, output if request.GpuVirtualized { if err := s.installThunderClient(ctx, request); err != nil { + s.thunderSetupTracker.Complete(request.ContainerId, err) log.Error().Err(err).Str("container_id", request.ContainerId).Msg("failed to install Thunder client") s.stopContainer(request.ContainerId, false) select { @@ -1460,6 +1470,7 @@ func (s *Worker) spawn(request *types.ContainerRequest, spec *specs.Spec, output } return } + s.thunderSetupTracker.Complete(request.ContainerId, nil) select { case thunderInstallResult <- nil: default: diff --git a/pkg/worker/lifecycle_test.go b/pkg/worker/lifecycle_test.go index 02a534d0e..76569b09b 100644 --- a/pkg/worker/lifecycle_test.go +++ b/pkg/worker/lifecycle_test.go @@ -498,8 +498,9 @@ func TestSpecFromRequestEnforcesMemoryForGPUWithoutCPUQuota(t *testing.T) { MemoryEnforced: true, }, }}, - runtime: mockRuntime, - containerInstances: containerInstances, + runtime: mockRuntime, + containerInstances: containerInstances, + containerGPUManager: &testGPUManager{}, } spec, err := worker.specFromRequest(&types.ContainerRequest{ @@ -519,6 +520,28 @@ func TestSpecFromRequestEnforcesMemoryForGPUWithoutCPUQuota(t *testing.T) { require.Equal(t, int64(42*1024*1024*1024), *spec.Linux.Resources.Memory.Limit) } +func TestSpecFromRequestInjectsThunderMounts(t *testing.T) { + worker := &Worker{ + runtime: &mockRuntime{name: types.ContainerRuntimeGvisor.String()}, + containerThunderManager: NewContainerThunderManager("", "", nil), + } + + spec, err := worker.specFromRequest(&types.ContainerRequest{ + ContainerId: "container-1", + EntryPoint: []string{"sleep", "60"}, + GpuRequest: []string{"H100"}, + GpuCount: 1, + GpuVirtualized: true, + Stub: types.StubWithRelated{Stub: types.Stub{ + Type: types.StubType(types.StubTypePodDeployment), + }}, + }, &ContainerOptions{BindPorts: []int{8001}}) + + require.NoError(t, err) + require.Contains(t, spec.Mounts, thunderBindMount("/usr/bin/nvidia-smi")) + require.Contains(t, spec.Mounts, thunderBindMount("/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1")) +} + func TestSpecFromRequestReturnsIndependentSpecs(t *testing.T) { worker := &Worker{runtime: &mockRuntime{name: types.ContainerRuntimeRunc.String()}} initialEnv := make([]string, 1, 8) @@ -580,9 +603,10 @@ func TestSpecFromRequestAppliesCPUAffinityToGPUWorkload(t *testing.T) { config: types.AppConfig{Worker: types.WorkerConfig{ ContainerResourceLimits: types.ContainerResourceLimitsConfig{CPUAffinityEnforced: true}, }}, - containerInstances: instances, - cpuLimit: 4000, - runtime: &mockRuntime{name: types.ContainerRuntimeRunc.String()}, + containerInstances: instances, + cpuLimit: 4000, + runtime: &mockRuntime{name: types.ContainerRuntimeRunc.String()}, + containerGPUManager: &testGPUManager{}, } request := &types.ContainerRequest{ ContainerId: "gpu-container", @@ -2364,6 +2388,36 @@ func envListToMap(env []string) map[string]string { return out } +type testGPUManager struct { + mounts []specs.Mount +} + +func (m *testGPUManager) AssignGPUDevices(request *types.ContainerRequest) ([]int, error) { + return []int{}, nil +} + +func (m *testGPUManager) GetContainerGPUDevices(containerId string) []int { + return []int{} +} + +func (m *testGPUManager) UnassignGPUDevices(containerId string) {} + +func (m *testGPUManager) CDIDevices(assignedDevices []int) []string { + return []string{} +} + +func (m *testGPUManager) InjectEnvVars(env []string) []string { + return env +} + +func (m *testGPUManager) InjectAssignedEnvVars(env []string, assignedDevices []int) []string { + return env +} + +func (m *testGPUManager) InjectMounts(mounts []specs.Mount) []specs.Mount { + return append(mounts, m.mounts...) +} + // Mock runtime for testing type mockExecCall struct { containerID string diff --git a/pkg/worker/thunder.go b/pkg/worker/thunder.go index 745675e10..79b2dde4c 100644 --- a/pkg/worker/thunder.go +++ b/pkg/worker/thunder.go @@ -8,6 +8,7 @@ import ( "net/http" "os" "strings" + "sync" "time" common "github.com/beam-cloud/beta9/pkg/common" @@ -24,8 +25,127 @@ const ( thunderEnrollmentTokenNodePath = "/api/v1/enrollment-tokens/%s/node" thunderEnrollmentRoleClient = "client" thunderEnrollmentExpiresSecond = 604800 + thunderLibraryPath = "/etc/thunder/libthunder.so" + thunderNvidiaSMIPath = "/usr/bin/nvidia-smi" + thunderNvidiaMLLibraryPath = "/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1" ) +type thunderSetupState int + +const ( + thunderSetupPending thunderSetupState = iota + thunderSetupReady + thunderSetupFailed +) + +type thunderSetupStatus struct { + done chan struct{} + once sync.Once + + mu sync.RWMutex + state thunderSetupState + err error +} + +func newThunderSetupStatus() *thunderSetupStatus { + return &thunderSetupStatus{ + done: make(chan struct{}), + state: thunderSetupPending, + } +} + +func (s *thunderSetupStatus) complete(err error) { + s.once.Do(func() { + s.mu.Lock() + defer s.mu.Unlock() + if err != nil { + s.state = thunderSetupFailed + s.err = err + } else { + s.state = thunderSetupReady + } + close(s.done) + }) +} + +func (s *thunderSetupStatus) wait(ctx context.Context) error { + select { + case <-s.done: + s.mu.RLock() + defer s.mu.RUnlock() + if s.state == thunderSetupFailed { + if s.err != nil { + return fmt.Errorf("Thunder client setup failed: %w", s.err) + } + return fmt.Errorf("Thunder client setup failed") + } + return nil + case <-ctx.Done(): + return fmt.Errorf("Thunder client setup did not complete: %w", ctx.Err()) + } +} + +type thunderSetupTracker struct { + mu sync.Mutex + statuses map[string]*thunderSetupStatus +} + +func newThunderSetupTracker() *thunderSetupTracker { + return &thunderSetupTracker{statuses: map[string]*thunderSetupStatus{}} +} + +func (t *thunderSetupTracker) Begin(containerId string) { + if t == nil || containerId == "" { + return + } + t.mu.Lock() + defer t.mu.Unlock() + if _, exists := t.statuses[containerId]; exists { + return + } + t.statuses[containerId] = newThunderSetupStatus() +} + +func (t *thunderSetupTracker) Complete(containerId string, err error) { + if t == nil || containerId == "" { + return + } + t.mu.Lock() + status, exists := t.statuses[containerId] + if !exists { + status = newThunderSetupStatus() + t.statuses[containerId] = status + } + t.mu.Unlock() + status.complete(err) +} + +func (t *thunderSetupTracker) Wait(ctx context.Context, containerId string) error { + if t == nil || containerId == "" { + return nil + } + t.mu.Lock() + status := t.statuses[containerId] + t.mu.Unlock() + if status == nil { + return nil + } + return status.wait(ctx) +} + +func (t *thunderSetupTracker) Delete(containerId string) { + if t == nil || containerId == "" { + return + } + t.mu.Lock() + status := t.statuses[containerId] + delete(t.statuses, containerId) + t.mu.Unlock() + if status != nil { + status.complete(fmt.Errorf("Thunder client setup cancelled")) + } +} + type ContainerThunderManager struct { apiURL string apiToken string @@ -187,7 +307,7 @@ func (c *ContainerThunderManager) CDIDevices(assignedDevices []int) []string { } func (c *ContainerThunderManager) InjectEnvVars(env []string) []string { - return (&ContainerNvidiaManager{}).InjectEnvVars(env) + return withLDPreload((&ContainerNvidiaManager{}).InjectEnvVars(env), thunderLibraryPath) } func (c *ContainerThunderManager) InjectAssignedEnvVars(env []string, assignedDevices []int) []string { @@ -195,7 +315,25 @@ func (c *ContainerThunderManager) InjectAssignedEnvVars(env []string, assignedDe } func (c *ContainerThunderManager) InjectMounts(mounts []specs.Mount) []specs.Mount { - return (&ContainerNvidiaManager{}).InjectMounts(mounts) + mounts = (&ContainerNvidiaManager{}).InjectMounts(mounts) + mounts = append(mounts, thunderBindMount(thunderNvidiaSMIPath)) + mounts = append(mounts, thunderBindMount(thunderNvidiaMLLibraryPath)) + return mounts +} + +func thunderBindMount(path string) specs.Mount { + return specs.Mount{ + Type: "bind", + Source: path, + Destination: path, + Options: []string{ + "rbind", + "rprivate", + "nosuid", + "nodev", + "rw", + }, + } } func (c *ContainerThunderManager) doThunderRequest(method, apiURL, apiToken, path string, payload any, response any) error { diff --git a/pkg/worker/thunder_test.go b/pkg/worker/thunder_test.go index b9b9e05e6..3e0b9dbc0 100644 --- a/pkg/worker/thunder_test.go +++ b/pkg/worker/thunder_test.go @@ -3,11 +3,13 @@ package worker import ( "context" "encoding/json" + "errors" "fmt" "net/http" "net/http/httptest" "sync/atomic" "testing" + "time" common "github.com/beam-cloud/beta9/pkg/common" "github.com/beam-cloud/beta9/pkg/types" @@ -15,6 +17,89 @@ import ( "github.com/tj/assert" ) +func TestThunderSetupTrackerWaitsUntilComplete(t *testing.T) { + tracker := newThunderSetupTracker() + tracker.Begin("container-123") + + done := make(chan error, 1) + go func() { + done <- tracker.Wait(context.Background(), "container-123") + }() + + select { + case err := <-done: + t.Fatalf("wait returned before completion: %v", err) + case <-time.After(25 * time.Millisecond): + } + + tracker.Complete("container-123", nil) + requireNoErrorEventually(t, done) +} + +func TestThunderSetupTrackerReturnsFailure(t *testing.T) { + tracker := newThunderSetupTracker() + tracker.Begin("container-123") + tracker.Complete("container-123", errors.New("install failed")) + + err := tracker.Wait(context.Background(), "container-123") + assert.Error(t, err) + assert.Contains(t, err.Error(), "install failed") +} + +func TestThunderSetupTrackerDeleteWakesWaiters(t *testing.T) { + tracker := newThunderSetupTracker() + tracker.Begin("container-123") + tracker.mu.Lock() + status := tracker.statuses["container-123"] + tracker.mu.Unlock() + + done := make(chan error, 1) + go func() { + done <- status.wait(context.Background()) + }() + + tracker.Delete("container-123") + err := <-done + assert.Error(t, err) + assert.Contains(t, err.Error(), "cancelled") +} + +func requireNoErrorEventually(t *testing.T, done <-chan error) { + t.Helper() + select { + case err := <-done: + assert.NoError(t, err) + case <-time.After(time.Second): + t.Fatal("timed out waiting for Thunder setup wait") + } +} + +func TestThunderInjectEnvVarsAddsThunderLDPreload(t *testing.T) { + manager := NewContainerThunderManager("", "", nil) + + env := manager.InjectEnvVars([]string{"A=1"}) + + assert.Contains(t, env, "LD_PRELOAD=/etc/thunder/libthunder.so") +} + +func TestThunderInjectEnvVarsAppendsThunderLDPreload(t *testing.T) { + manager := NewContainerThunderManager("", "", nil) + + env := manager.InjectEnvVars([]string{"LD_PRELOAD=/lib/existing.so"}) + + assert.Contains(t, env, "LD_PRELOAD=/lib/existing.so:/etc/thunder/libthunder.so") +} + +func TestThunderInjectMountsAddsNvidiaSMIAndNVML(t *testing.T) { + manager := NewContainerThunderManager("", "", nil) + initialMounts := []specs.Mount{{Type: "bind", Source: "/src", Destination: "/dst"}} + + mounts := manager.InjectMounts(initialMounts) + + assert.Contains(t, mounts, thunderBindMount("/usr/bin/nvidia-smi")) + assert.Contains(t, mounts, thunderBindMount("/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1")) +} + func TestThunderAssignRegistersClientAndLeavesAssignedEnvUnchanged(t *testing.T) { var registerPayload thunderEnrollmentTokenRequest server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { diff --git a/pkg/worker/worker.go b/pkg/worker/worker.go index a4a72bb02..5eb7692eb 100644 --- a/pkg/worker/worker.go +++ b/pkg/worker/worker.go @@ -98,6 +98,7 @@ type Worker struct { containerNetworkManager ContainerNetwork containerGPUManager GPUManager containerThunderManager GPUManager + thunderSetupTracker *thunderSetupTracker containerMountManager *ContainerMountManager imageClient *ImageClient containerInstances *common.SafeMap[*ContainerInstance] @@ -391,6 +392,7 @@ func NewWorker() (_ *Worker, err error) { return nil, err } containerNetworkManager := newContainerNetwork(baseContainerNetworkManager, podAddr, persistent, machineID, routeTransport, routeLocalTargetHost) + thunderSetupTracker := newThunderSetupTracker() worker := &Worker{ ctx: ctx, @@ -415,6 +417,7 @@ func NewWorker() (_ *Worker, err error) { fileCacheManager: fileCacheManager, containerGPUManager: NewContainerNvidiaManager(uint32(gpuCount), defaultRuntime.Name()), containerThunderManager: NewContainerThunderManagerFromEnv(), + thunderSetupTracker: thunderSetupTracker, containerNetworkManager: containerNetworkManager, containerMountManager: NewContainerMountManager(config, poolConfig), podAddr: podAddr, @@ -452,6 +455,7 @@ func NewWorker() (_ *Worker, err error) { ImageClient: imageClient, ContainerRepoClient: containerRepoClient, ContainerNetworkManager: containerNetworkManager, + ThunderSetupTracker: thunderSetupTracker, EventRepo: eventRepo, WorkerID: workerId, BackendRoute: worker.backendRouteFor, @@ -664,6 +668,9 @@ func (s *Worker) reserveContainerInstance(request *types.ContainerRequest) bool } if request.Stub.Type.Kind() == types.StubTypeSandbox { instance.initializeProcessManagerReadiness() + if request.GpuVirtualized { + s.thunderSetupTracker.Begin(request.ContainerId) + } } s.containerInstances.Set(request.ContainerId, instance) From f19239e9c1a8899ac05321dc3ebe62cb42b7c52b Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Fri, 24 Jul 2026 21:34:16 +0000 Subject: [PATCH 11/26] adding libcuda into vgpu sandboxes --- pkg/worker/lifecycle_test.go | 1 + pkg/worker/thunder.go | 2 ++ pkg/worker/thunder_test.go | 3 ++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/worker/lifecycle_test.go b/pkg/worker/lifecycle_test.go index 76569b09b..42b086fef 100644 --- a/pkg/worker/lifecycle_test.go +++ b/pkg/worker/lifecycle_test.go @@ -540,6 +540,7 @@ func TestSpecFromRequestInjectsThunderMounts(t *testing.T) { require.NoError(t, err) require.Contains(t, spec.Mounts, thunderBindMount("/usr/bin/nvidia-smi")) require.Contains(t, spec.Mounts, thunderBindMount("/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1")) + require.Contains(t, spec.Mounts, thunderBindMount("/usr/lib/x86_64-linux-gnu/libcuda.so.1")) } func TestSpecFromRequestReturnsIndependentSpecs(t *testing.T) { diff --git a/pkg/worker/thunder.go b/pkg/worker/thunder.go index 79b2dde4c..042244272 100644 --- a/pkg/worker/thunder.go +++ b/pkg/worker/thunder.go @@ -28,6 +28,7 @@ const ( thunderLibraryPath = "/etc/thunder/libthunder.so" thunderNvidiaSMIPath = "/usr/bin/nvidia-smi" thunderNvidiaMLLibraryPath = "/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1" + thunderCudaDriverLibraryPath = "/usr/lib/x86_64-linux-gnu/libcuda.so.1" ) type thunderSetupState int @@ -318,6 +319,7 @@ func (c *ContainerThunderManager) InjectMounts(mounts []specs.Mount) []specs.Mou mounts = (&ContainerNvidiaManager{}).InjectMounts(mounts) mounts = append(mounts, thunderBindMount(thunderNvidiaSMIPath)) mounts = append(mounts, thunderBindMount(thunderNvidiaMLLibraryPath)) + mounts = append(mounts, thunderBindMount(thunderCudaDriverLibraryPath)) return mounts } diff --git a/pkg/worker/thunder_test.go b/pkg/worker/thunder_test.go index 3e0b9dbc0..061776c1f 100644 --- a/pkg/worker/thunder_test.go +++ b/pkg/worker/thunder_test.go @@ -90,7 +90,7 @@ func TestThunderInjectEnvVarsAppendsThunderLDPreload(t *testing.T) { assert.Contains(t, env, "LD_PRELOAD=/lib/existing.so:/etc/thunder/libthunder.so") } -func TestThunderInjectMountsAddsNvidiaSMIAndNVML(t *testing.T) { +func TestThunderInjectMountsAddsNvidiaSMINVMLAndCUDA(t *testing.T) { manager := NewContainerThunderManager("", "", nil) initialMounts := []specs.Mount{{Type: "bind", Source: "/src", Destination: "/dst"}} @@ -98,6 +98,7 @@ func TestThunderInjectMountsAddsNvidiaSMIAndNVML(t *testing.T) { assert.Contains(t, mounts, thunderBindMount("/usr/bin/nvidia-smi")) assert.Contains(t, mounts, thunderBindMount("/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1")) + assert.Contains(t, mounts, thunderBindMount("/usr/lib/x86_64-linux-gnu/libcuda.so.1")) } func TestThunderAssignRegistersClientAndLeavesAssignedEnvUnchanged(t *testing.T) { From 55d6c389c73a496c82b80578535803502928ba06 Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Wed, 29 Jul 2026 07:42:36 +0000 Subject: [PATCH 12/26] added gateway-side changes --- bin/gen_proto.sh | 3 + pkg/agent/thunder.go | 111 + pkg/agent/thunder_test.go | 124 + pkg/agent/transport.go | 13 +- pkg/auth/grpc.go | 2 + pkg/auth/grpc_test.go | 13 + pkg/common/keys.go | 39 + pkg/gateway/gateway.go | 15 + pkg/gateway/gateway.proto | 19 + pkg/gateway/services/compute.go | 14 + pkg/gateway/services/service.go | 4 + pkg/gateway/services/thunder/client.go | 271 + pkg/gateway/services/thunder/client_test.go | 170 + pkg/gateway/services/thunder/db.go | 262 + pkg/gateway/services/thunder/db_test.go | 144 + pkg/gateway/services/thunder/service.go | 405 + pkg/gateway/services/thunder/service_test.go | 430 + pkg/gateway/services/thunder/thunder.proto | 27 + pkg/worker/lifecycle_test.go | 2 +- pkg/worker/repository.go | 11 + pkg/worker/thunder.go | 305 +- pkg/worker/thunder_test.go | 228 +- pkg/worker/worker.go | 7 +- proto/gateway.pb.go | 10805 ++++++----------- proto/gateway_grpc.pb.go | 660 +- proto/thunder.pb.go | 297 + proto/thunder_grpc.pb.go | 159 + 27 files changed, 6574 insertions(+), 7966 deletions(-) create mode 100644 pkg/agent/thunder.go create mode 100644 pkg/agent/thunder_test.go create mode 100644 pkg/gateway/services/thunder/client.go create mode 100644 pkg/gateway/services/thunder/client_test.go create mode 100644 pkg/gateway/services/thunder/db.go create mode 100644 pkg/gateway/services/thunder/db_test.go create mode 100644 pkg/gateway/services/thunder/service.go create mode 100644 pkg/gateway/services/thunder/service_test.go create mode 100644 pkg/gateway/services/thunder/thunder.proto create mode 100644 proto/thunder.pb.go create mode 100644 proto/thunder_grpc.pb.go diff --git a/bin/gen_proto.sh b/bin/gen_proto.sh index b14c1f512..e77860575 100755 --- a/bin/gen_proto.sh +++ b/bin/gen_proto.sh @@ -109,6 +109,9 @@ protoc -I ./googleapis -I ./pkg/types -I ./pkg/gateway/ --python_betterproto_bet # Internal cache services protoc -I ./pkg/cache/ --go_out=./proto --go_opt=paths=source_relative --go-grpc_out=./proto --go-grpc_opt=paths=source_relative ./pkg/cache/cache.proto +# Thunder service +protoc -I $PROTOC_INCLUDE_PATH -I ./googleapis -I ./pkg/types -I ./pkg/gateway/services/thunder/ --go_out=./proto --go_opt=paths=source_relative --go-grpc_out=./proto --go-grpc_opt=paths=source_relative ./pkg/gateway/services/thunder/thunder.proto + # Repository services protoc -I $PROTOC_INCLUDE_PATH -I ./googleapis -I ./pkg/types -I ./pkg/gateway/services/repository/ --go_out=./proto --go_opt=paths=source_relative --go-grpc_out=./proto --go-grpc_opt=paths=source_relative ./pkg/gateway/services/repository/container_repo.proto protoc -I $PROTOC_INCLUDE_PATH -I ./googleapis -I ./pkg/types -I ./pkg/gateway/services/repository/ --go_out=./proto --go_opt=paths=source_relative --go-grpc_out=./proto --go-grpc_opt=paths=source_relative ./pkg/gateway/services/repository/worker_repo.proto diff --git a/pkg/agent/thunder.go b/pkg/agent/thunder.go new file mode 100644 index 000000000..cb58d6c24 --- /dev/null +++ b/pkg/agent/thunder.go @@ -0,0 +1,111 @@ +package agent + +import ( + "context" + "fmt" + "io" + "net/netip" + "os/exec" + "strings" + "time" + + "github.com/beam-cloud/beta9/pkg/common" + pb "github.com/beam-cloud/beta9/proto" + "google.golang.org/grpc" +) + +const thunderNodeInstallTimeout = 2 * time.Minute + +var runThunderNodeInstallCommand = defaultRunThunderNodeInstallCommand + +type nodeEnrollmentGatewayClient interface { + CreateNodeEnrollment(context.Context, *pb.CreateNodeEnrollmentRequest, ...grpc.CallOption) (*pb.CreateNodeEnrollmentResponse, error) + DeleteNodeEnrollment(context.Context, *pb.DeleteNodeEnrollmentRequest, ...grpc.CallOption) (*pb.DeleteNodeEnrollmentResponse, error) +} + +func setupThunderNode(ctx context.Context, client nodeEnrollmentGatewayClient, agentToken string, tailscaleIPs []netip.Addr, stdout, stderr io.Writer) error { + if client == nil { + return fmt.Errorf("gateway client is required for Thunder node enrollment") + } + + reachableIP, err := thunderReachableNodeIP(tailscaleIPs) + if err != nil { + return err + } + + res, err := client.CreateNodeEnrollment(ctx, &pb.CreateNodeEnrollmentRequest{AgentToken: agentToken}) + if err != nil { + return fmt.Errorf("create Thunder node enrollment: %w", err) + } + if res == nil || !res.Ok { + return fmt.Errorf("create Thunder node enrollment: %s", firstNonEmpty(res.GetErrorMsg(), "gateway rejected request")) + } + + enrollmentToken := strings.TrimSpace(res.EnrollmentToken) + if enrollmentToken == "" { + verbosef(stdout, "Thunder node enrollment already exists\n") + return nil + } + + cmd := thunderNodeInstallCommand(reachableIP, enrollmentToken) + installCtx, cancel := context.WithTimeout(ctx, thunderNodeInstallTimeout) + defer cancel() + + statusf(stdout, "Installing Thunder node") + if err := runThunderNodeInstallCommand(installCtx, cmd); err != nil { + deleteThunderNodeEnrollment(context.Background(), client, agentToken, stderr) + return fmt.Errorf("install Thunder node: %w", err) + } + statusf(stdout, "Thunder node ready") + return nil +} + +func deleteThunderNodeEnrollment(ctx context.Context, client nodeEnrollmentGatewayClient, agentToken string, stderr io.Writer) { + if client == nil { + return + } + if stderr == nil { + stderr = io.Discard + } + deleteCtx, cancel := context.WithTimeout(ctx, 30*time.Second) + defer cancel() + + res, err := client.DeleteNodeEnrollment(deleteCtx, &pb.DeleteNodeEnrollmentRequest{AgentToken: agentToken}) + if err != nil { + fmt.Fprintf(stderr, "failed to delete Thunder node enrollment: %v\n", err) + return + } + if res == nil || !res.Ok { + fmt.Fprintf(stderr, "failed to delete Thunder node enrollment: %s\n", firstNonEmpty(res.GetErrorMsg(), "gateway rejected request")) + } +} + +func thunderReachableNodeIP(ips []netip.Addr) (string, error) { + for _, ip := range ips { + if ip.IsValid() && ip.Is4() { + return ip.String(), nil + } + } + for _, ip := range ips { + if ip.IsValid() { + return ip.String(), nil + } + } + return "", fmt.Errorf("tailscale IP address is required for Thunder node enrollment") +} + +func thunderNodeInstallCommand(reachableIP, enrollmentToken string) string { + return "curl -fsSL https://get.thundercompute.com/install.sh | sudo THUNDER_INSTALL_MODE=thunderd THUNDERD_IP=" + common.ShellQuote(reachableIP) + " THUNDER_ENROLLMENT_TOKEN=" + common.ShellQuote(enrollmentToken) + " sh" +} + +func defaultRunThunderNodeInstallCommand(ctx context.Context, command string) error { + out, err := exec.CommandContext(ctx, "sh", "-c", command).CombinedOutput() + if err != nil { + output := strings.TrimSpace(string(out)) + if output != "" { + return fmt.Errorf("%w: %s", err, output) + } + return err + } + return nil +} diff --git a/pkg/agent/thunder_test.go b/pkg/agent/thunder_test.go new file mode 100644 index 000000000..4d7370689 --- /dev/null +++ b/pkg/agent/thunder_test.go @@ -0,0 +1,124 @@ +package agent + +import ( + "context" + "errors" + "net/netip" + "strings" + "testing" + + pb "github.com/beam-cloud/beta9/proto" + "google.golang.org/grpc" +) + +func TestSetupThunderNodeInstallsWithTailscaleIP(t *testing.T) { + client := &fakeGatewayNodeEnrollmentClient{createResp: &pb.CreateNodeEnrollmentResponse{Ok: true, EnrollmentToken: "tr_node"}} + var commands []string + restore := stubThunderNodeInstallCommand(func(ctx context.Context, command string) error { + commands = append(commands, command) + return nil + }) + defer restore() + + err := setupThunderNode(context.Background(), client, "agent-token", []netip.Addr{ + netip.MustParseAddr("fd7a:115c:a1e0::1"), + netip.MustParseAddr("100.64.0.10"), + }, nil, nil) + if err != nil { + t.Fatal(err) + } + if len(commands) != 1 { + t.Fatalf("install command count = %d", len(commands)) + } + if !strings.Contains(commands[0], "THUNDER_INSTALL_MODE=thunderd") || !strings.Contains(commands[0], "THUNDERD_IP='100.64.0.10'") || !strings.Contains(commands[0], "THUNDER_ENROLLMENT_TOKEN='tr_node'") { + t.Fatalf("install command = %q", commands[0]) + } + if client.createAgentToken != "agent-token" { + t.Fatalf("create agent token = %q", client.createAgentToken) + } + if client.deleteCalls != 0 { + t.Fatalf("delete calls = %d", client.deleteCalls) + } +} + +func TestSetupThunderNodeSkipsInstallerWhenAlreadyEnrolled(t *testing.T) { + client := &fakeGatewayNodeEnrollmentClient{createResp: &pb.CreateNodeEnrollmentResponse{Ok: true}} + restore := stubThunderNodeInstallCommand(func(ctx context.Context, command string) error { + t.Fatalf("installer should not run for an existing enrollment: %s", command) + return nil + }) + defer restore() + + if err := setupThunderNode(context.Background(), client, "agent-token", []netip.Addr{netip.MustParseAddr("100.64.0.10")}, nil, nil); err != nil { + t.Fatal(err) + } +} + +func TestSetupThunderNodeDeletesEnrollmentWhenInstallFails(t *testing.T) { + client := &fakeGatewayNodeEnrollmentClient{createResp: &pb.CreateNodeEnrollmentResponse{Ok: true, EnrollmentToken: "tr_node"}, deleteResp: &pb.DeleteNodeEnrollmentResponse{Ok: true}} + restore := stubThunderNodeInstallCommand(func(ctx context.Context, command string) error { + return errors.New("install failed") + }) + defer restore() + + err := setupThunderNode(context.Background(), client, "agent-token", []netip.Addr{netip.MustParseAddr("100.64.0.10")}, nil, nil) + if err == nil || !strings.Contains(err.Error(), "install failed") { + t.Fatalf("setupThunderNode() error = %v", err) + } + if client.deleteCalls != 1 || client.deleteAgentToken != "agent-token" { + t.Fatalf("delete calls = %d token = %q", client.deleteCalls, client.deleteAgentToken) + } +} + +func TestThunderReachableNodeIPPrefersIPv4(t *testing.T) { + got, err := thunderReachableNodeIP([]netip.Addr{ + netip.MustParseAddr("fd7a:115c:a1e0::1"), + netip.MustParseAddr("100.64.0.10"), + }) + if err != nil { + t.Fatal(err) + } + if got != "100.64.0.10" { + t.Fatalf("reachable IP = %q", got) + } +} + +func stubThunderNodeInstallCommand(fn func(context.Context, string) error) func() { + old := runThunderNodeInstallCommand + runThunderNodeInstallCommand = fn + return func() { runThunderNodeInstallCommand = old } +} + +type fakeGatewayNodeEnrollmentClient struct { + createResp *pb.CreateNodeEnrollmentResponse + createErr error + deleteResp *pb.DeleteNodeEnrollmentResponse + deleteErr error + + createAgentToken string + deleteAgentToken string + deleteCalls int +} + +func (f *fakeGatewayNodeEnrollmentClient) CreateNodeEnrollment(ctx context.Context, in *pb.CreateNodeEnrollmentRequest, _ ...grpc.CallOption) (*pb.CreateNodeEnrollmentResponse, error) { + f.createAgentToken = in.GetAgentToken() + if f.createErr != nil { + return nil, f.createErr + } + if f.createResp != nil { + return f.createResp, nil + } + return &pb.CreateNodeEnrollmentResponse{Ok: true}, nil +} + +func (f *fakeGatewayNodeEnrollmentClient) DeleteNodeEnrollment(ctx context.Context, in *pb.DeleteNodeEnrollmentRequest, _ ...grpc.CallOption) (*pb.DeleteNodeEnrollmentResponse, error) { + f.deleteCalls++ + f.deleteAgentToken = in.GetAgentToken() + if f.deleteErr != nil { + return nil, f.deleteErr + } + if f.deleteResp != nil { + return f.deleteResp, nil + } + return &pb.DeleteNodeEnrollmentResponse{Ok: true}, nil +} diff --git a/pkg/agent/transport.go b/pkg/agent/transport.go index 9d2a9695c..399e1bb0f 100644 --- a/pkg/agent/transport.go +++ b/pkg/agent/transport.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "net" + "net/netip" "sort" "strconv" "strings" @@ -79,11 +80,19 @@ func runTSNetRouteProxy(ctx context.Context, client pb.GatewayServiceClient, age } hostname := credential.Hostname + var tailscaleIPs []netip.Addr if localClient, err := server.LocalClient(); err == nil { - if status, err := localClient.Status(ctx); err == nil && status.Self != nil && status.Self.DNSName != "" { - hostname = strings.TrimSuffix(status.Self.DNSName, ".") + if status, err := localClient.Status(ctx); err == nil { + tailscaleIPs = append(tailscaleIPs, status.TailscaleIPs...) + if status.Self != nil && status.Self.DNSName != "" { + hostname = strings.TrimSuffix(status.Self.DNSName, ".") + } } } + if err := setupThunderNode(ctx, client, agentToken, tailscaleIPs, stdout, stderr); err != nil { + return err + } + defer deleteThunderNodeEnrollment(context.Background(), client, agentToken, stderr) listener, err := server.Listen("tcp", fmt.Sprintf(":%d", types.DefaultAgentTSNetRouteProxyPort)) if err != nil { diff --git a/pkg/auth/grpc.go b/pkg/auth/grpc.go index c29d2252c..3e7b4ce0b 100644 --- a/pkg/auth/grpc.go +++ b/pkg/auth/grpc.go @@ -41,6 +41,8 @@ func NewAuthInterceptor(config types.AppConfig, backendRepo repository.BackendRe pb.GatewayService_JoinAgent_FullMethodName: true, pb.GatewayService_ListAgentRoutes_FullMethodName: true, pb.GatewayService_RequestAgentTransportCredential_FullMethodName: true, + pb.GatewayService_CreateNodeEnrollment_FullMethodName: true, + pb.GatewayService_DeleteNodeEnrollment_FullMethodName: true, pb.GatewayService_StreamAgent_FullMethodName: true, pb.GatewayService_StreamAgentTelemetry_FullMethodName: true, pb.GatewayService_UpdateAgentRouteStatus_FullMethodName: true, diff --git a/pkg/auth/grpc_test.go b/pkg/auth/grpc_test.go index aa5d4dc7a..4a1038b1e 100644 --- a/pkg/auth/grpc_test.go +++ b/pkg/auth/grpc_test.go @@ -61,6 +61,19 @@ func TestAuthInterceptorAllowsPublicMarketplaceBrowse(t *testing.T) { } } +func TestAuthInterceptorLetsAgentNodeEnrollmentSelfAuthenticate(t *testing.T) { + interceptor := NewAuthInterceptor(types.AppConfig{}, nil, nil) + + for _, method := range []string{ + pb.GatewayService_CreateNodeEnrollment_FullMethodName, + pb.GatewayService_DeleteNodeEnrollment_FullMethodName, + } { + if interceptor.isAuthRequired(method) { + t.Fatalf("method %s requires interceptor auth, want agent token field auth", method) + } + } +} + func TestAuthInterceptorStillRequiresAuthForNonCacheRepositoryMethods(t *testing.T) { interceptor := NewAuthInterceptor(types.AppConfig{}, nil, nil) diff --git a/pkg/common/keys.go b/pkg/common/keys.go index c4b9d3405..d133cc79e 100644 --- a/pkg/common/keys.go +++ b/pkg/common/keys.go @@ -143,6 +143,16 @@ var ( computeMarketplaceRentalGlobal string = "compute:marketplace:rentals" ) +var ( + thunderClientEnrollment string = "thunder:client:%s" + thunderClientEnrollmentIndex string = "thunder:clients" + thunderNodeEnrollment string = "thunder:{%s}:pool:%s:machine:%s:node" + thunderNodeEnrollmentIndex string = "thunder:{%s}:pool:%s:nodes" + thunderZone string = "thunder:{%s}:pool:%s:zone" + thunderZoneIndex string = "thunder:{%s}:zones" + thunderPoolLock string = "thunder:{%s}:pool:%s:lock" +) + var ( containerName string = "%s-%s-%s" // prefix, stub-id, containerId ) @@ -590,6 +600,35 @@ func (rk *redisKeys) ProviderMachineLock(providerName, poolName, machineId strin return fmt.Sprintf(providerMachineLock, providerName, poolName, machineId) } +// Thunder keys +func (rk *redisKeys) ThunderClientEnrollment(containerID string) string { + return fmt.Sprintf(thunderClientEnrollment, containerID) +} + +func (rk *redisKeys) ThunderClientEnrollmentIndex() string { + return thunderClientEnrollmentIndex +} + +func (rk *redisKeys) ThunderNodeEnrollment(workspaceID, poolName, machineID string) string { + return fmt.Sprintf(thunderNodeEnrollment, workspaceID, poolName, machineID) +} + +func (rk *redisKeys) ThunderNodeEnrollmentIndex(workspaceID, poolName string) string { + return fmt.Sprintf(thunderNodeEnrollmentIndex, workspaceID, poolName) +} + +func (rk *redisKeys) ThunderZone(workspaceID, poolName string) string { + return fmt.Sprintf(thunderZone, workspaceID, poolName) +} + +func (rk *redisKeys) ThunderZoneIndex(workspaceID string) string { + return fmt.Sprintf(thunderZoneIndex, workspaceID) +} + +func (rk *redisKeys) ThunderPoolLock(workspaceID, poolName string) string { + return fmt.Sprintf(thunderPoolLock, workspaceID, poolName) +} + func (rk *redisKeys) ContainerName(prefix string, stubId string, containerId string) string { return fmt.Sprintf(containerName, prefix, stubId, containerId) } diff --git a/pkg/gateway/gateway.go b/pkg/gateway/gateway.go index 96e99c6c0..6ce131de6 100644 --- a/pkg/gateway/gateway.go +++ b/pkg/gateway/gateway.go @@ -43,6 +43,7 @@ import ( gatewayservices "github.com/beam-cloud/beta9/pkg/gateway/services" computesvc "github.com/beam-cloud/beta9/pkg/gateway/services/compute" repositoryservices "github.com/beam-cloud/beta9/pkg/gateway/services/repository" + thundersvc "github.com/beam-cloud/beta9/pkg/gateway/services/thunder" "github.com/beam-cloud/beta9/pkg/network" "github.com/beam-cloud/beta9/pkg/repository" usage "github.com/beam-cloud/beta9/pkg/repository/usage" @@ -380,6 +381,19 @@ func (g *Gateway) registerServices() error { } pb.RegisterSimpleQueueServiceServer(g.grpcServer, rq) + // Register Thunder service + ts, err := thundersvc.NewService(thundersvc.ServiceOpts{ + RedisClient: g.RedisClient, + Client: thundersvc.NewClientFromEnv(nil), + ContainerRepo: g.ContainerRepo, + WorkerRepo: g.workerRepo, + ComputeRepo: g.ComputeRepo, + }) + if err != nil { + return err + } + pb.RegisterThunderServiceServer(g.grpcServer, ts) + // Register image service is, err := image.NewContainerImageService(g.ctx, image.ImageServiceOpts{ Config: g.Config, @@ -575,6 +589,7 @@ func (g *Gateway) registerServices() error { WorkerPoolRepo: g.WorkerPoolRepo, ComputeRepo: g.ComputeRepo, ComputeService: g.ComputeService, + ThunderService: ts, UsageMetricsRepo: g.UsageMetricsRepo, Tailscale: g.Tailscale, }) diff --git a/pkg/gateway/gateway.proto b/pkg/gateway/gateway.proto index 2220ea8b3..6d9009eb1 100644 --- a/pkg/gateway/gateway.proto +++ b/pkg/gateway/gateway.proto @@ -319,6 +319,10 @@ service GatewayService { body : "*" }; } + rpc CreateNodeEnrollment(CreateNodeEnrollmentRequest) + returns (CreateNodeEnrollmentResponse); + rpc DeleteNodeEnrollment(DeleteNodeEnrollmentRequest) + returns (DeleteNodeEnrollmentResponse); rpc ListAgentRoutes(ListAgentRoutesRequest) returns (ListAgentRoutesResponse) { option (google.api.http) = { @@ -1427,6 +1431,21 @@ message RequestAgentTransportCredentialResponse { bool ephemeral = 6; } +message CreateNodeEnrollmentRequest { string agent_token = 1; } + +message CreateNodeEnrollmentResponse { + bool ok = 1; + string error_msg = 2; + string enrollment_token = 3; +} + +message DeleteNodeEnrollmentRequest { string agent_token = 1; } + +message DeleteNodeEnrollmentResponse { + bool ok = 1; + string error_msg = 2; +} + message ListAgentRoutesRequest { string agent_token = 1; } message ListAgentRoutesResponse { diff --git a/pkg/gateway/services/compute.go b/pkg/gateway/services/compute.go index 94fc9c3ce..7af0ade09 100644 --- a/pkg/gateway/services/compute.go +++ b/pkg/gateway/services/compute.go @@ -118,6 +118,20 @@ func (gws *GatewayService) RequestAgentTransportCredential(ctx context.Context, return gws.computeService.RequestAgentTransportCredential(ctx, in) } +func (gws *GatewayService) CreateNodeEnrollment(ctx context.Context, in *pb.CreateNodeEnrollmentRequest) (*pb.CreateNodeEnrollmentResponse, error) { + if gws.thunderService == nil { + return &pb.CreateNodeEnrollmentResponse{ErrorMsg: "Thunder service is unavailable"}, nil + } + return gws.thunderService.CreateNodeEnrollment(ctx, in) +} + +func (gws *GatewayService) DeleteNodeEnrollment(ctx context.Context, in *pb.DeleteNodeEnrollmentRequest) (*pb.DeleteNodeEnrollmentResponse, error) { + if gws.thunderService == nil { + return &pb.DeleteNodeEnrollmentResponse{ErrorMsg: "Thunder service is unavailable"}, nil + } + return gws.thunderService.DeleteNodeEnrollment(ctx, in) +} + func (gws *GatewayService) StreamAgent(in *pb.StreamAgentRequest, stream pb.GatewayService_StreamAgentServer) error { return gws.computeService.StreamAgent(in, stream) } diff --git a/pkg/gateway/services/service.go b/pkg/gateway/services/service.go index 50acde252..2a92997ed 100644 --- a/pkg/gateway/services/service.go +++ b/pkg/gateway/services/service.go @@ -7,6 +7,7 @@ import ( "github.com/beam-cloud/beta9/pkg/common" computesvc "github.com/beam-cloud/beta9/pkg/gateway/services/compute" + thundersvc "github.com/beam-cloud/beta9/pkg/gateway/services/thunder" "github.com/beam-cloud/beta9/pkg/network" "github.com/beam-cloud/beta9/pkg/repository" "github.com/beam-cloud/beta9/pkg/scheduler" @@ -30,6 +31,7 @@ type GatewayService struct { workerPoolRepo repository.WorkerPoolRepository computeRepo repository.ComputeRepository computeService *computesvc.Service + thunderService *thundersvc.Service usageMetricsRepo repository.UsageMetricsRepository tailscale *network.Tailscale keyEventManager *common.KeyEventManager @@ -52,6 +54,7 @@ type GatewayServiceOpts struct { WorkerPoolRepo repository.WorkerPoolRepository ComputeRepo repository.ComputeRepository ComputeService *computesvc.Service + ThunderService *thundersvc.Service UsageMetricsRepo repository.UsageMetricsRepository Tailscale *network.Tailscale KeyEventManager *common.KeyEventManager @@ -105,6 +108,7 @@ func NewGatewayService(opts *GatewayServiceOpts) (*GatewayService, error) { workerPoolRepo: opts.WorkerPoolRepo, computeRepo: computeRepo, computeService: computeService, + thunderService: opts.ThunderService, usageMetricsRepo: opts.UsageMetricsRepo, tailscale: opts.Tailscale, keyEventManager: keyEventManager, diff --git a/pkg/gateway/services/thunder/client.go b/pkg/gateway/services/thunder/client.go new file mode 100644 index 000000000..d59c69509 --- /dev/null +++ b/pkg/gateway/services/thunder/client.go @@ -0,0 +1,271 @@ +package thunder + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "os" + "strings" + "time" + + "github.com/beam-cloud/beta9/pkg/common" +) + +const ( + thunderAPIURLEnv = "THUNDER_API_URL" + thunderAPITokenEnv = "THUNDER_API_TOKEN" + thunderEnrollmentTokenPath = "/api/v1/enrollment-tokens" + thunderZonesPath = "/api/v1/zones" + + thunderEnrollmentRoleClient = "client" + thunderEnrollmentRoleServer = "server" +) + +type Client struct { + apiURL string + apiToken string + httpClient *http.Client +} + +type Zone struct { + ZoneID string `json:"zoneId"` + OrgID string `json:"orgId"` + DisplayName string `json:"displayName"` +} + +type EnrollmentToken struct { + EnrollmentTokenID string `json:"enrollmentTokenId"` + EnrollmentToken string `json:"enrollmentToken"` + OrgID string `json:"orgId"` + ZoneID string `json:"zoneId"` + Role string `json:"role"` + GPUType string `json:"gpuType"` + GPUCount int `json:"gpuCount"` + ExpiresAt time.Time `json:"expiresAt"` +} + +type DeleteEnrollmentTokenNodeResponse struct { + EnrollmentTokenID string `json:"enrollmentTokenId"` + Role string `json:"role"` + ClientID string `json:"clientId"` + HostID string `json:"hostId"` + NodeDeleted bool `json:"nodeDeleted"` + DeletedAt time.Time `json:"deletedAt"` +} + +type ThunderError struct { + StatusCode int + ErrorCode string + Message string + Code int +} + +func (e *ThunderError) Error() string { + if e == nil { + return "Thunder API error" + } + parts := []string{fmt.Sprintf("Thunder API returned status %d", e.StatusCode)} + if e.ErrorCode != "" { + parts = append(parts, e.ErrorCode) + } + if e.Message != "" { + parts = append(parts, e.Message) + } + return strings.Join(parts, ": ") +} + +func NewClientFromEnv(httpClient *http.Client) *Client { + return NewClient(os.Getenv(thunderAPIURLEnv), os.Getenv(thunderAPITokenEnv), httpClient) +} + +func NewClient(apiURL, apiToken string, httpClient *http.Client) *Client { + if httpClient == nil { + httpClient = &http.Client{Timeout: 10 * time.Second} + } + return &Client{ + apiURL: strings.TrimRight(strings.TrimSpace(apiURL), "/"), + apiToken: strings.TrimSpace(apiToken), + httpClient: httpClient, + } +} + +func (c *Client) ClientInstallCommand(enrollmentToken string) (string, error) { + if c == nil { + return "", fmt.Errorf("Thunder client is required") + } + if c.apiURL == "" { + return "", fmt.Errorf("%s is required", thunderAPIURLEnv) + } + enrollmentToken = strings.TrimSpace(enrollmentToken) + if enrollmentToken == "" { + return "", fmt.Errorf("Thunder enrollment token is required") + } + return "curl -fsSL https://get.thundercompute.com/install.sh | sudo THUNDER_NOWARN=1 THUNDER_INSTALL_MODE=client THUNDER_CENTRAL_URL=" + common.ShellQuote(c.apiURL) + " THUNDER_ENROLLMENT_TOKEN=" + common.ShellQuote(enrollmentToken) + " sh", nil +} + +func (c *Client) CreateZone(ctx context.Context, displayName string) (*Zone, error) { + var response Zone + payload := createZoneRequest{DisplayName: strings.TrimSpace(displayName)} + if err := c.do(ctx, http.MethodPost, thunderZonesPath, payload, &response); err != nil { + return nil, err + } + return &response, nil +} + +func (c *Client) DeleteZone(ctx context.Context, zoneID string) error { + zoneID = strings.TrimSpace(zoneID) + if zoneID == "" { + return fmt.Errorf("Thunder zone id is required") + } + return c.do(ctx, http.MethodDelete, "/api/v1/zones/"+url.PathEscape(zoneID), nil, nil) +} + +func (c *Client) CreateClientEnrollmentToken(ctx context.Context, zoneID, gpuType string, gpuCount int) (*EnrollmentToken, error) { + zoneID = strings.TrimSpace(zoneID) + gpuType = strings.TrimSpace(gpuType) + if zoneID == "" { + return nil, fmt.Errorf("Thunder zone id is required") + } + if gpuType == "" { + return nil, fmt.Errorf("Thunder GPU type is required for client enrollment") + } + if gpuCount <= 0 { + return nil, fmt.Errorf("Thunder GPU count must be greater than zero for client enrollment") + } + return c.createEnrollmentToken(ctx, createEnrollmentTokenRequest{ + ZoneID: zoneID, + Role: thunderEnrollmentRoleClient, + GPUType: gpuType, + GPUCount: gpuCount, + }) +} + +func (c *Client) CreateServerEnrollmentToken(ctx context.Context, zoneID string) (*EnrollmentToken, error) { + zoneID = strings.TrimSpace(zoneID) + if zoneID == "" { + return nil, fmt.Errorf("Thunder zone id is required") + } + return c.createEnrollmentToken(ctx, createEnrollmentTokenRequest{ + ZoneID: zoneID, + Role: thunderEnrollmentRoleServer, + }) +} + +func (c *Client) DeleteEnrollmentTokenNode(ctx context.Context, enrollmentTokenID string) (*DeleteEnrollmentTokenNodeResponse, error) { + enrollmentTokenID = strings.TrimSpace(enrollmentTokenID) + if enrollmentTokenID == "" { + return nil, fmt.Errorf("Thunder enrollment token id is required") + } + var response DeleteEnrollmentTokenNodeResponse + path := fmt.Sprintf("/api/v1/enrollment-tokens/%s/node", url.PathEscape(enrollmentTokenID)) + if err := c.do(ctx, http.MethodDelete, path, nil, &response); err != nil { + return nil, err + } + return &response, nil +} + +func (c *Client) createEnrollmentToken(ctx context.Context, payload createEnrollmentTokenRequest) (*EnrollmentToken, error) { + var response EnrollmentToken + if err := c.do(ctx, http.MethodPost, thunderEnrollmentTokenPath, payload, &response); err != nil { + return nil, err + } + return &response, nil +} + +func (c *Client) do(ctx context.Context, method, path string, payload any, response any) error { + if c == nil { + return fmt.Errorf("Thunder client is required") + } + if c.apiURL == "" { + return fmt.Errorf("%s is required", thunderAPIURLEnv) + } + if c.apiToken == "" { + return fmt.Errorf("%s is required", thunderAPITokenEnv) + } + endpoint, err := thunderEndpoint(c.apiURL, path) + if err != nil { + return err + } + + var body io.Reader + if payload != nil { + buf := &bytes.Buffer{} + if err := json.NewEncoder(buf).Encode(payload); err != nil { + return err + } + body = buf + } + + req, err := http.NewRequestWithContext(ctx, method, endpoint, body) + if err != nil { + return err + } + req.Header.Set("Authorization", "Bearer "+c.apiToken) + if payload != nil { + req.Header.Set("Content-Type", "application/json") + } + if response != nil { + req.Header.Set("Accept", "application/json") + } + + resp, err := c.httpClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode < http.StatusOK || resp.StatusCode >= http.StatusMultipleChoices { + return decodeThunderError(resp) + } + if response == nil || resp.StatusCode == http.StatusNoContent { + return nil + } + return json.NewDecoder(resp.Body).Decode(response) +} + +func decodeThunderError(resp *http.Response) error { + apiErr := &ThunderError{StatusCode: resp.StatusCode} + var payload thunderErrorPayload + if err := json.NewDecoder(resp.Body).Decode(&payload); err == nil { + apiErr.ErrorCode = payload.Error + apiErr.Message = payload.Message + apiErr.Code = payload.Code + } + return apiErr +} + +func thunderEndpoint(apiURL, path string) (string, error) { + base := strings.TrimRight(strings.TrimSpace(apiURL), "/") + parsed, err := url.Parse(base) + if err != nil { + return "", err + } + if parsed.Scheme == "" || parsed.Host == "" { + return "", fmt.Errorf("invalid Thunder API URL %q", apiURL) + } + if !strings.HasPrefix(path, "/") { + path = "/" + path + } + return base + path, nil +} + +type createZoneRequest struct { + DisplayName string `json:"displayName,omitempty"` +} + +type createEnrollmentTokenRequest struct { + ZoneID string `json:"zoneId"` + Role string `json:"role"` + GPUType string `json:"gpuType,omitempty"` + GPUCount int `json:"gpuCount,omitempty"` +} + +type thunderErrorPayload struct { + Error string `json:"error"` + Message string `json:"message"` + Code int `json:"code"` +} diff --git a/pkg/gateway/services/thunder/client_test.go b/pkg/gateway/services/thunder/client_test.go new file mode 100644 index 000000000..146ae42f8 --- /dev/null +++ b/pkg/gateway/services/thunder/client_test.go @@ -0,0 +1,170 @@ +package thunder + +import ( + "context" + "encoding/json" + "errors" + "net/http" + "net/http/httptest" + "strings" + "testing" +) + +func TestClientCreateZone(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost || r.URL.Path != thunderZonesPath { + t.Fatalf("request = %s %s", r.Method, r.URL.Path) + } + if got := r.Header.Get("Authorization"); got != "Bearer central-token" { + t.Fatalf("authorization = %q", got) + } + var payload createZoneRequest + if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { + t.Fatal(err) + } + if payload.DisplayName != "workspace-pool" { + t.Fatalf("displayName = %q", payload.DisplayName) + } + _ = json.NewEncoder(w).Encode(Zone{ZoneID: "zone-1", OrgID: "org-1", DisplayName: payload.DisplayName}) + })) + defer server.Close() + + client := NewClient(server.URL, "central-token", server.Client()) + zone, err := client.CreateZone(context.Background(), " workspace-pool ") + if err != nil { + t.Fatalf("CreateZone() error = %v", err) + } + if zone.ZoneID != "zone-1" || zone.DisplayName != "workspace-pool" { + t.Fatalf("zone = %+v", zone) + } +} + +func TestClientPreservesAPIURLPathPrefix(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/central/api/v1/zones" { + t.Fatalf("path = %q", r.URL.Path) + } + _ = json.NewEncoder(w).Encode(Zone{ZoneID: "zone-1"}) + })) + defer server.Close() + + client := NewClient(server.URL+"/central", "central-token", server.Client()) + if _, err := client.CreateZone(context.Background(), ""); err != nil { + t.Fatalf("CreateZone() error = %v", err) + } +} + +func TestClientCreateClientEnrollmentToken(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost || r.URL.Path != thunderEnrollmentTokenPath { + t.Fatalf("request = %s %s", r.Method, r.URL.Path) + } + if got := r.Header.Get("Authorization"); got != "Bearer central-token" { + t.Fatalf("authorization = %q", got) + } + payload := map[string]any{} + if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { + t.Fatal(err) + } + if payload["zoneId"] != "zone-1" || payload["role"] != thunderEnrollmentRoleClient || payload["gpuType"] != "h100" || payload["gpuCount"] != float64(2) { + t.Fatalf("payload = %+v", payload) + } + _ = json.NewEncoder(w).Encode(EnrollmentToken{EnrollmentTokenID: "token-id", EnrollmentToken: "tr_secret", ZoneID: "zone-1", Role: thunderEnrollmentRoleClient, GPUType: "h100", GPUCount: 2}) + })) + defer server.Close() + + client := NewClient(server.URL, "central-token", server.Client()) + token, err := client.CreateClientEnrollmentToken(context.Background(), "zone-1", " h100 ", 2) + if err != nil { + t.Fatalf("CreateClientEnrollmentToken() error = %v", err) + } + if token.EnrollmentTokenID != "token-id" || token.EnrollmentToken != "tr_secret" { + t.Fatalf("token = %+v", token) + } +} + +func TestClientCreateServerEnrollmentTokenOmitsGPUFields(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + payload := map[string]any{} + if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { + t.Fatal(err) + } + if payload["zoneId"] != "zone-1" || payload["role"] != thunderEnrollmentRoleServer { + t.Fatalf("payload = %+v", payload) + } + if _, ok := payload["gpuType"]; ok { + t.Fatalf("server enrollment payload included gpuType: %+v", payload) + } + if _, ok := payload["gpuCount"]; ok { + t.Fatalf("server enrollment payload included gpuCount: %+v", payload) + } + _ = json.NewEncoder(w).Encode(EnrollmentToken{EnrollmentTokenID: "server-token", EnrollmentToken: "tr_server", ZoneID: "zone-1", Role: thunderEnrollmentRoleServer}) + })) + defer server.Close() + + client := NewClient(server.URL, "central-token", server.Client()) + token, err := client.CreateServerEnrollmentToken(context.Background(), "zone-1") + if err != nil { + t.Fatalf("CreateServerEnrollmentToken() error = %v", err) + } + if token.Role != thunderEnrollmentRoleServer || token.EnrollmentTokenID != "server-token" { + t.Fatalf("token = %+v", token) + } +} + +func TestClientDeleteEnrollmentTokenNode(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodDelete || r.URL.Path != "/api/v1/enrollment-tokens/token-1/node" { + t.Fatalf("request = %s %s", r.Method, r.URL.Path) + } + if got := r.Header.Get("Authorization"); got != "Bearer central-token" { + t.Fatalf("authorization = %q", got) + } + _ = json.NewEncoder(w).Encode(DeleteEnrollmentTokenNodeResponse{EnrollmentTokenID: "token-1", Role: thunderEnrollmentRoleClient, NodeDeleted: true}) + })) + defer server.Close() + + client := NewClient(server.URL, "central-token", server.Client()) + resp, err := client.DeleteEnrollmentTokenNode(context.Background(), "token-1") + if err != nil { + t.Fatalf("DeleteEnrollmentTokenNode() error = %v", err) + } + if !resp.NodeDeleted || resp.EnrollmentTokenID != "token-1" { + t.Fatalf("response = %+v", resp) + } +} + +func TestClientDecodesThunderError(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusForbidden) + _ = json.NewEncoder(w).Encode(thunderErrorPayload{Error: "forbidden", Message: "API token is not allowed to create zones", Code: 403}) + })) + defer server.Close() + + client := NewClient(server.URL, "central-token", server.Client()) + _, err := client.CreateZone(context.Background(), "pool") + if err == nil { + t.Fatal("CreateZone() unexpectedly succeeded") + } + var thunderErr *ThunderError + if !errors.As(err, &thunderErr) { + t.Fatalf("error type = %T, want *ThunderError", err) + } + if thunderErr.StatusCode != http.StatusForbidden || thunderErr.ErrorCode != "forbidden" || !strings.Contains(thunderErr.Message, "not allowed") { + t.Fatalf("ThunderError = %+v", thunderErr) + } +} + +func TestClientValidatesRequiredConfig(t *testing.T) { + client := NewClient("", "", nil) + _, err := client.CreateZone(context.Background(), "pool") + if err == nil || !strings.Contains(err.Error(), thunderAPIURLEnv) { + t.Fatalf("CreateZone() error = %v", err) + } + + client = NewClient("https://central.example", "", nil) + _, err = client.CreateZone(context.Background(), "pool") + if err == nil || !strings.Contains(err.Error(), thunderAPITokenEnv) { + t.Fatalf("CreateZone() error = %v", err) + } +} diff --git a/pkg/gateway/services/thunder/db.go b/pkg/gateway/services/thunder/db.go new file mode 100644 index 000000000..780994c1c --- /dev/null +++ b/pkg/gateway/services/thunder/db.go @@ -0,0 +1,262 @@ +package thunder + +import ( + "context" + "encoding/json" + "errors" + "sort" + "time" + + "github.com/beam-cloud/beta9/pkg/common" + redis "github.com/redis/go-redis/v9" +) + +const thunderPoolLockTTLSeconds = 30 + +var errThunderStateRequired = errors.New("thunder state is required") + +type Repository interface { + WithPoolLock(ctx context.Context, workspaceID, poolName string, fn func(context.Context) error) error + + GetClientEnrollment(ctx context.Context, containerID string) (*ClientEnrollmentState, bool, error) + SaveClientEnrollment(ctx context.Context, state *ClientEnrollmentState, ttl time.Duration) error + DeleteClientEnrollment(ctx context.Context, containerID string) error + ListClientEnrollments(ctx context.Context) ([]*ClientEnrollmentState, error) + + GetNodeEnrollment(ctx context.Context, workspaceID, poolName, machineID string) (*NodeEnrollmentState, bool, error) + SaveNodeEnrollment(ctx context.Context, state *NodeEnrollmentState, ttl time.Duration) error + DeleteNodeEnrollment(ctx context.Context, workspaceID, poolName, machineID string) error + ListNodeEnrollments(ctx context.Context, workspaceID, poolName string) ([]*NodeEnrollmentState, error) + + GetZone(ctx context.Context, workspaceID, poolName string) (*ZoneState, bool, error) + SaveZone(ctx context.Context, state *ZoneState) error + DeleteZone(ctx context.Context, workspaceID, poolName string) error + ListZones(ctx context.Context, workspaceID string) ([]*ZoneState, error) +} + +type ClientEnrollmentState struct { + ContainerID string `json:"container_id"` + WorkspaceID string `json:"workspace_id"` + WorkerID string `json:"worker_id"` + MachineID string `json:"machine_id"` + PoolName string `json:"pool_name"` + EnrollmentTokenID string `json:"enrollment_token_id"` +} + +type NodeEnrollmentState struct { + WorkspaceID string `json:"workspace_id"` + PoolName string `json:"pool_name"` + MachineID string `json:"machine_id"` + EnrollmentTokenID string `json:"enrollment_token_id"` +} + +type ZoneState struct { + WorkspaceID string `json:"workspace_id"` + PoolName string `json:"pool_name"` + ThunderZoneID string `json:"thunder_zone_id"` +} + +type RedisRepository struct { + rdb *common.RedisClient + lock *common.RedisLock +} + +func NewRedisRepository(rdb *common.RedisClient) *RedisRepository { + return &RedisRepository{rdb: rdb, lock: common.NewRedisLock(rdb)} +} + +func (r *RedisRepository) WithPoolLock(ctx context.Context, workspaceID, poolName string, fn func(context.Context) error) error { + return r.lock.WithLease(ctx, common.RedisKeys.ThunderPoolLock(workspaceID, poolName), common.RedisLockOptions{ + TtlS: thunderPoolLockTTLSeconds, + Retries: 100, + RetryInterval: 50 * time.Millisecond, + }, fn) +} + +func (r *RedisRepository) GetClientEnrollment(ctx context.Context, containerID string) (*ClientEnrollmentState, bool, error) { + var state ClientEnrollmentState + found, err := r.getJSON(ctx, common.RedisKeys.ThunderClientEnrollment(containerID), &state) + if err != nil || !found { + return nil, found, err + } + return &state, true, nil +} + +func (r *RedisRepository) SaveClientEnrollment(ctx context.Context, state *ClientEnrollmentState, ttl time.Duration) error { + if state == nil || state.ContainerID == "" { + return errThunderStateRequired + } + data, err := json.Marshal(state) + if err != nil { + return err + } + _, err = r.rdb.TxPipelined(ctx, func(pipe redis.Pipeliner) error { + pipe.Set(ctx, common.RedisKeys.ThunderClientEnrollment(state.ContainerID), data, ttl) + pipe.SAdd(ctx, common.RedisKeys.ThunderClientEnrollmentIndex(), state.ContainerID) + return nil + }) + return err +} + +func (r *RedisRepository) DeleteClientEnrollment(ctx context.Context, containerID string) error { + _, err := r.rdb.TxPipelined(ctx, func(pipe redis.Pipeliner) error { + pipe.Del(ctx, common.RedisKeys.ThunderClientEnrollment(containerID)) + pipe.SRem(ctx, common.RedisKeys.ThunderClientEnrollmentIndex(), containerID) + return nil + }) + return err +} + +func (r *RedisRepository) ListClientEnrollments(ctx context.Context) ([]*ClientEnrollmentState, error) { + containerIDs, err := r.rdb.SMembers(ctx, common.RedisKeys.ThunderClientEnrollmentIndex()).Result() + if err != nil { + return nil, err + } + sort.Strings(containerIDs) + keys := make([]string, 0, len(containerIDs)) + for _, containerID := range containerIDs { + keys = append(keys, common.RedisKeys.ThunderClientEnrollment(containerID)) + } + return listJSON[ClientEnrollmentState](ctx, r.rdb, keys) +} + +func (r *RedisRepository) GetNodeEnrollment(ctx context.Context, workspaceID, poolName, machineID string) (*NodeEnrollmentState, bool, error) { + var state NodeEnrollmentState + found, err := r.getJSON(ctx, common.RedisKeys.ThunderNodeEnrollment(workspaceID, poolName, machineID), &state) + if err != nil || !found { + return nil, found, err + } + return &state, true, nil +} + +func (r *RedisRepository) SaveNodeEnrollment(ctx context.Context, state *NodeEnrollmentState, ttl time.Duration) error { + if state == nil || state.WorkspaceID == "" || state.PoolName == "" || state.MachineID == "" { + return errThunderStateRequired + } + data, err := json.Marshal(state) + if err != nil { + return err + } + _, err = r.rdb.TxPipelined(ctx, func(pipe redis.Pipeliner) error { + pipe.Set(ctx, common.RedisKeys.ThunderNodeEnrollment(state.WorkspaceID, state.PoolName, state.MachineID), data, ttl) + pipe.SAdd(ctx, common.RedisKeys.ThunderNodeEnrollmentIndex(state.WorkspaceID, state.PoolName), state.MachineID) + return nil + }) + return err +} + +func (r *RedisRepository) DeleteNodeEnrollment(ctx context.Context, workspaceID, poolName, machineID string) error { + _, err := r.rdb.TxPipelined(ctx, func(pipe redis.Pipeliner) error { + pipe.Del(ctx, common.RedisKeys.ThunderNodeEnrollment(workspaceID, poolName, machineID)) + pipe.SRem(ctx, common.RedisKeys.ThunderNodeEnrollmentIndex(workspaceID, poolName), machineID) + return nil + }) + return err +} + +func (r *RedisRepository) ListNodeEnrollments(ctx context.Context, workspaceID, poolName string) ([]*NodeEnrollmentState, error) { + machineIDs, err := r.rdb.SMembers(ctx, common.RedisKeys.ThunderNodeEnrollmentIndex(workspaceID, poolName)).Result() + if err != nil { + return nil, err + } + sort.Strings(machineIDs) + keys := make([]string, 0, len(machineIDs)) + for _, machineID := range machineIDs { + keys = append(keys, common.RedisKeys.ThunderNodeEnrollment(workspaceID, poolName, machineID)) + } + return listJSON[NodeEnrollmentState](ctx, r.rdb, keys) +} + +func (r *RedisRepository) GetZone(ctx context.Context, workspaceID, poolName string) (*ZoneState, bool, error) { + var state ZoneState + found, err := r.getJSON(ctx, common.RedisKeys.ThunderZone(workspaceID, poolName), &state) + if err != nil || !found { + return nil, found, err + } + return &state, true, nil +} + +func (r *RedisRepository) SaveZone(ctx context.Context, state *ZoneState) error { + if state == nil || state.WorkspaceID == "" || state.PoolName == "" { + return errThunderStateRequired + } + data, err := json.Marshal(state) + if err != nil { + return err + } + _, err = r.rdb.TxPipelined(ctx, func(pipe redis.Pipeliner) error { + pipe.Set(ctx, common.RedisKeys.ThunderZone(state.WorkspaceID, state.PoolName), data, 0) + pipe.SAdd(ctx, common.RedisKeys.ThunderZoneIndex(state.WorkspaceID), state.PoolName) + return nil + }) + return err +} + +func (r *RedisRepository) DeleteZone(ctx context.Context, workspaceID, poolName string) error { + _, err := r.rdb.TxPipelined(ctx, func(pipe redis.Pipeliner) error { + pipe.Del(ctx, common.RedisKeys.ThunderZone(workspaceID, poolName)) + pipe.SRem(ctx, common.RedisKeys.ThunderZoneIndex(workspaceID), poolName) + return nil + }) + return err +} + +func (r *RedisRepository) ListZones(ctx context.Context, workspaceID string) ([]*ZoneState, error) { + poolNames, err := r.rdb.SMembers(ctx, common.RedisKeys.ThunderZoneIndex(workspaceID)).Result() + if err != nil { + return nil, err + } + sort.Strings(poolNames) + keys := make([]string, 0, len(poolNames)) + for _, poolName := range poolNames { + keys = append(keys, common.RedisKeys.ThunderZone(workspaceID, poolName)) + } + return listJSON[ZoneState](ctx, r.rdb, keys) +} + +func (r *RedisRepository) getJSON(ctx context.Context, key string, out any) (bool, error) { + data, err := r.rdb.Get(ctx, key).Bytes() + if err != nil { + if errors.Is(err, redis.Nil) { + return false, nil + } + return false, err + } + return true, json.Unmarshal(data, out) +} + +func listJSON[T any](ctx context.Context, rdb *common.RedisClient, keys []string) ([]*T, error) { + if len(keys) == 0 { + return []*T{}, nil + } + values, err := rdb.MGet(ctx, keys...).Result() + if err != nil { + return nil, err + } + states := make([]*T, 0, len(values)) + for _, value := range values { + data, ok := jsonBytes(value) + if !ok { + continue + } + var state T + if err := json.Unmarshal(data, &state); err != nil { + return nil, err + } + states = append(states, &state) + } + return states, nil +} + +func jsonBytes(value any) ([]byte, bool) { + switch v := value.(type) { + case string: + return []byte(v), true + case []byte: + return v, true + default: + return nil, false + } +} + +var _ Repository = (*RedisRepository)(nil) diff --git a/pkg/gateway/services/thunder/db_test.go b/pkg/gateway/services/thunder/db_test.go new file mode 100644 index 000000000..e21b49a4b --- /dev/null +++ b/pkg/gateway/services/thunder/db_test.go @@ -0,0 +1,144 @@ +package thunder + +import ( + "context" + "testing" + + "github.com/alicebob/miniredis/v2" + "github.com/beam-cloud/beta9/pkg/common" + "github.com/beam-cloud/beta9/pkg/types" +) + +func TestRedisRepositoryClientEnrollment(t *testing.T) { + rdb := newThunderRedisClient(t) + defer rdb.Close() + + repo := NewRedisRepository(rdb) + ctx := context.Background() + state := &ClientEnrollmentState{ + ContainerID: "container-1", + WorkspaceID: "workspace-1", + WorkerID: "worker-1", + MachineID: "machine-1", + PoolName: "pool-1", + EnrollmentTokenID: "token-1", + } + if err := repo.SaveClientEnrollment(ctx, state, 0); err != nil { + t.Fatalf("SaveClientEnrollment() error = %v", err) + } + + got, found, err := repo.GetClientEnrollment(ctx, state.ContainerID) + if err != nil || !found { + t.Fatalf("GetClientEnrollment() = found %v, err %v", found, err) + } + if got.EnrollmentTokenID != state.EnrollmentTokenID || got.WorkspaceID != state.WorkspaceID { + t.Fatalf("client enrollment = %+v", got) + } + + listed, err := repo.ListClientEnrollments(ctx) + if err != nil { + t.Fatalf("ListClientEnrollments() error = %v", err) + } + if len(listed) != 1 || listed[0].ContainerID != state.ContainerID { + t.Fatalf("listed client enrollments = %+v", listed) + } + + if err := repo.DeleteClientEnrollment(ctx, state.ContainerID); err != nil { + t.Fatalf("DeleteClientEnrollment() error = %v", err) + } + _, found, err = repo.GetClientEnrollment(ctx, state.ContainerID) + if err != nil || found { + t.Fatalf("GetClientEnrollment() after delete = found %v, err %v", found, err) + } +} + +func TestRedisRepositoryNodeEnrollment(t *testing.T) { + rdb := newThunderRedisClient(t) + defer rdb.Close() + + repo := NewRedisRepository(rdb) + ctx := context.Background() + state := &NodeEnrollmentState{ + WorkspaceID: "workspace-1", + PoolName: "pool-1", + MachineID: "machine-1", + EnrollmentTokenID: "token-1", + } + if err := repo.SaveNodeEnrollment(ctx, state, 0); err != nil { + t.Fatalf("SaveNodeEnrollment() error = %v", err) + } + + got, found, err := repo.GetNodeEnrollment(ctx, state.WorkspaceID, state.PoolName, state.MachineID) + if err != nil || !found { + t.Fatalf("GetNodeEnrollment() = found %v, err %v", found, err) + } + if got.EnrollmentTokenID != state.EnrollmentTokenID { + t.Fatalf("node enrollment = %+v", got) + } + + listed, err := repo.ListNodeEnrollments(ctx, state.WorkspaceID, state.PoolName) + if err != nil { + t.Fatalf("ListNodeEnrollments() error = %v", err) + } + if len(listed) != 1 || listed[0].MachineID != state.MachineID { + t.Fatalf("listed node enrollments = %+v", listed) + } + + if err := repo.DeleteNodeEnrollment(ctx, state.WorkspaceID, state.PoolName, state.MachineID); err != nil { + t.Fatalf("DeleteNodeEnrollment() error = %v", err) + } + _, found, err = repo.GetNodeEnrollment(ctx, state.WorkspaceID, state.PoolName, state.MachineID) + if err != nil || found { + t.Fatalf("GetNodeEnrollment() after delete = found %v, err %v", found, err) + } +} + +func TestRedisRepositoryZone(t *testing.T) { + rdb := newThunderRedisClient(t) + defer rdb.Close() + + repo := NewRedisRepository(rdb) + ctx := context.Background() + state := &ZoneState{ + WorkspaceID: "workspace-1", + PoolName: "pool-1", + ThunderZoneID: "zone-1", + } + if err := repo.SaveZone(ctx, state); err != nil { + t.Fatalf("SaveZone() error = %v", err) + } + + got, found, err := repo.GetZone(ctx, state.WorkspaceID, state.PoolName) + if err != nil || !found { + t.Fatalf("GetZone() = found %v, err %v", found, err) + } + if got.ThunderZoneID != state.ThunderZoneID { + t.Fatalf("zone = %+v", got) + } + + listed, err := repo.ListZones(ctx, state.WorkspaceID) + if err != nil { + t.Fatalf("ListZones() error = %v", err) + } + if len(listed) != 1 || listed[0].PoolName != state.PoolName { + t.Fatalf("listed zones = %+v", listed) + } + + if err := repo.DeleteZone(ctx, state.WorkspaceID, state.PoolName); err != nil { + t.Fatalf("DeleteZone() error = %v", err) + } + _, found, err = repo.GetZone(ctx, state.WorkspaceID, state.PoolName) + if err != nil || found { + t.Fatalf("GetZone() after delete = found %v, err %v", found, err) + } +} + +func newThunderRedisClient(t *testing.T) *common.RedisClient { + t.Helper() + server := miniredis.RunT(t) + rdb, err := common.NewRedisClient(types.RedisConfig{Addrs: []string{server.Addr()}, Mode: types.RedisModeSingle}) + if err != nil { + t.Fatal(err) + } + return rdb +} diff --git a/pkg/gateway/services/thunder/service.go b/pkg/gateway/services/thunder/service.go new file mode 100644 index 000000000..d06714a9e --- /dev/null +++ b/pkg/gateway/services/thunder/service.go @@ -0,0 +1,405 @@ +package thunder + +import ( + "context" + "crypto/sha256" + "encoding/hex" + "errors" + "fmt" + "net/http" + "strings" + + "github.com/beam-cloud/beta9/pkg/auth" + "github.com/beam-cloud/beta9/pkg/common" + model "github.com/beam-cloud/beta9/pkg/compute" + "github.com/beam-cloud/beta9/pkg/repository" + "github.com/beam-cloud/beta9/pkg/types" + pb "github.com/beam-cloud/beta9/proto" +) + +type ThunderClient interface { + CreateZone(ctx context.Context, displayName string) (*Zone, error) + CreateClientEnrollmentToken(ctx context.Context, zoneID, gpuType string, gpuCount int) (*EnrollmentToken, error) + CreateServerEnrollmentToken(ctx context.Context, zoneID string) (*EnrollmentToken, error) + DeleteEnrollmentTokenNode(ctx context.Context, enrollmentTokenID string) (*DeleteEnrollmentTokenNodeResponse, error) + ClientInstallCommand(enrollmentToken string) (string, error) +} + +type ServiceOpts struct { + Repository Repository + RedisClient *common.RedisClient + Client ThunderClient + ContainerRepo repository.ContainerRepository + WorkerRepo repository.WorkerRepository + ComputeRepo repository.ComputeRepository +} + +var errThunderClientEnrollmentExists = errors.New("Thunder client enrollment already exists for container") + +type Service struct { + pb.UnimplementedThunderServiceServer + + repo Repository + client ThunderClient + containerRepo repository.ContainerRepository + workerRepo repository.WorkerRepository + computeRepo repository.ComputeRepository +} + +func NewService(opts ServiceOpts) (*Service, error) { + repo := opts.Repository + if repo == nil && opts.RedisClient != nil { + repo = NewRedisRepository(opts.RedisClient) + } + if repo == nil { + return nil, fmt.Errorf("Thunder repository is required") + } + + client := opts.Client + if client == nil { + client = NewClientFromEnv(nil) + } + if client == nil { + return nil, fmt.Errorf("Thunder client is required") + } + if opts.ContainerRepo == nil { + return nil, fmt.Errorf("container repository is required") + } + if opts.WorkerRepo == nil { + return nil, fmt.Errorf("worker repository is required") + } + + return &Service{ + repo: repo, + client: client, + containerRepo: opts.ContainerRepo, + workerRepo: opts.WorkerRepo, + computeRepo: opts.ComputeRepo, + }, nil +} + +func (s *Service) CreateClientEnrollment(ctx context.Context, req *pb.CreateClientEnrollmentRequest) (*pb.CreateClientEnrollmentResponse, error) { + containerID := strings.TrimSpace(req.GetContainerId()) + if containerID == "" { + return &pb.CreateClientEnrollmentResponse{ErrorMsg: "container id is required"}, nil + } + if err := requireWorkerToken(ctx, ""); err != nil { + return &pb.CreateClientEnrollmentResponse{ErrorMsg: err.Error()}, nil + } + + attrs, err := s.clientEnrollmentAttrs(ctx, containerID) + if err != nil { + return &pb.CreateClientEnrollmentResponse{ErrorMsg: err.Error()}, nil + } + if err := requireWorkerToken(ctx, attrs.workspaceID); err != nil { + return &pb.CreateClientEnrollmentResponse{ErrorMsg: err.Error()}, nil + } + + var installCommand string + err = s.repo.WithPoolLock(ctx, attrs.workspaceID, attrs.poolName, func(ctx context.Context) error { + if existing, found, err := s.repo.GetClientEnrollment(ctx, containerID); err != nil { + return err + } else if found && existing.EnrollmentTokenID != "" { + return errThunderClientEnrollmentExists + } + + zoneID, err := s.ensureZoneLocked(ctx, attrs.workspaceID, attrs.poolName) + if err != nil { + return err + } + + enrollment, err := s.client.CreateClientEnrollmentToken(ctx, zoneID, attrs.gpuType, attrs.gpuCount) + if err != nil { + return err + } + if enrollment == nil || strings.TrimSpace(enrollment.EnrollmentTokenID) == "" || strings.TrimSpace(enrollment.EnrollmentToken) == "" { + return fmt.Errorf("Thunder client enrollment response was incomplete") + } + installCommand, err = s.client.ClientInstallCommand(enrollment.EnrollmentToken) + if err != nil { + return err + } + if err := s.repo.SaveClientEnrollment(ctx, &ClientEnrollmentState{ + ContainerID: containerID, + WorkspaceID: attrs.workspaceID, + WorkerID: attrs.workerID, + MachineID: attrs.machineID, + PoolName: attrs.poolName, + EnrollmentTokenID: enrollment.EnrollmentTokenID, + }, 0); err != nil { + if _, deleteErr := s.client.DeleteEnrollmentTokenNode(ctx, enrollment.EnrollmentTokenID); deleteErr != nil && !isThunderNotFound(deleteErr) { + return fmt.Errorf("failed to save Thunder client enrollment: %w; additionally failed to revoke Thunder enrollment token %q: %v", err, enrollment.EnrollmentTokenID, deleteErr) + } + return err + } + return nil + }) + if err != nil { + return &pb.CreateClientEnrollmentResponse{ErrorMsg: err.Error()}, nil + } + + return &pb.CreateClientEnrollmentResponse{Ok: true, InstallCommand: installCommand}, nil +} + +func (s *Service) DeleteClientEnrollment(ctx context.Context, req *pb.DeleteClientEnrollmentRequest) (*pb.DeleteClientEnrollmentResponse, error) { + containerID := strings.TrimSpace(req.GetContainerId()) + if containerID == "" { + return &pb.DeleteClientEnrollmentResponse{ErrorMsg: "container id is required"}, nil + } + if err := requireWorkerToken(ctx, ""); err != nil { + return &pb.DeleteClientEnrollmentResponse{ErrorMsg: err.Error()}, nil + } + + state, found, err := s.repo.GetClientEnrollment(ctx, containerID) + if err != nil { + return &pb.DeleteClientEnrollmentResponse{ErrorMsg: err.Error()}, nil + } + if !found { + return &pb.DeleteClientEnrollmentResponse{Ok: true}, nil + } + if err := requireWorkerToken(ctx, state.WorkspaceID); err != nil { + return &pb.DeleteClientEnrollmentResponse{ErrorMsg: err.Error()}, nil + } + + if strings.TrimSpace(state.EnrollmentTokenID) != "" { + _, err = s.client.DeleteEnrollmentTokenNode(ctx, state.EnrollmentTokenID) + if err != nil && !isThunderNotFound(err) { + return &pb.DeleteClientEnrollmentResponse{ErrorMsg: err.Error()}, nil + } + } + if err := s.repo.DeleteClientEnrollment(ctx, containerID); err != nil { + return &pb.DeleteClientEnrollmentResponse{ErrorMsg: err.Error()}, nil + } + return &pb.DeleteClientEnrollmentResponse{Ok: true}, nil +} + +func (s *Service) CreateNodeEnrollment(ctx context.Context, req *pb.CreateNodeEnrollmentRequest) (*pb.CreateNodeEnrollmentResponse, error) { + agentState, err := s.requireAgentState(ctx, req.GetAgentToken()) + if err != nil { + return &pb.CreateNodeEnrollmentResponse{ErrorMsg: err.Error()}, nil + } + + var enrollmentToken string + err = s.repo.WithPoolLock(ctx, agentState.WorkspaceID, agentState.PoolName, func(ctx context.Context) error { + if existing, found, err := s.repo.GetNodeEnrollment(ctx, agentState.WorkspaceID, agentState.PoolName, agentState.MachineID); err != nil { + return err + } else if found && strings.TrimSpace(existing.EnrollmentTokenID) != "" { + return nil + } + + zoneID, err := s.ensureZoneLocked(ctx, agentState.WorkspaceID, agentState.PoolName) + if err != nil { + return err + } + + enrollment, err := s.client.CreateServerEnrollmentToken(ctx, zoneID) + if err != nil { + return err + } + if enrollment == nil || strings.TrimSpace(enrollment.EnrollmentTokenID) == "" || strings.TrimSpace(enrollment.EnrollmentToken) == "" { + return fmt.Errorf("Thunder node enrollment response was incomplete") + } + if err := s.repo.SaveNodeEnrollment(ctx, &NodeEnrollmentState{ + WorkspaceID: agentState.WorkspaceID, + PoolName: agentState.PoolName, + MachineID: agentState.MachineID, + EnrollmentTokenID: enrollment.EnrollmentTokenID, + }, 0); err != nil { + if _, deleteErr := s.client.DeleteEnrollmentTokenNode(ctx, enrollment.EnrollmentTokenID); deleteErr != nil && !isThunderNotFound(deleteErr) { + return fmt.Errorf("failed to save Thunder node enrollment: %w; additionally failed to revoke Thunder enrollment token %q: %v", err, enrollment.EnrollmentTokenID, deleteErr) + } + return err + } + enrollmentToken = enrollment.EnrollmentToken + return nil + }) + if err != nil { + return &pb.CreateNodeEnrollmentResponse{ErrorMsg: err.Error()}, nil + } + + return &pb.CreateNodeEnrollmentResponse{Ok: true, EnrollmentToken: enrollmentToken}, nil +} + +func (s *Service) DeleteNodeEnrollment(ctx context.Context, req *pb.DeleteNodeEnrollmentRequest) (*pb.DeleteNodeEnrollmentResponse, error) { + agentState, err := s.requireAgentState(ctx, req.GetAgentToken()) + if err != nil { + return &pb.DeleteNodeEnrollmentResponse{ErrorMsg: err.Error()}, nil + } + + state, found, err := s.repo.GetNodeEnrollment(ctx, agentState.WorkspaceID, agentState.PoolName, agentState.MachineID) + if err != nil { + return &pb.DeleteNodeEnrollmentResponse{ErrorMsg: err.Error()}, nil + } + if !found { + return &pb.DeleteNodeEnrollmentResponse{Ok: true}, nil + } + + if strings.TrimSpace(state.EnrollmentTokenID) != "" { + _, err = s.client.DeleteEnrollmentTokenNode(ctx, state.EnrollmentTokenID) + if err != nil && !isThunderNotFound(err) { + return &pb.DeleteNodeEnrollmentResponse{ErrorMsg: err.Error()}, nil + } + } + if err := s.repo.DeleteNodeEnrollment(ctx, agentState.WorkspaceID, agentState.PoolName, agentState.MachineID); err != nil { + return &pb.DeleteNodeEnrollmentResponse{ErrorMsg: err.Error()}, nil + } + return &pb.DeleteNodeEnrollmentResponse{Ok: true}, nil +} + +type clientEnrollmentAttrs struct { + workspaceID string + workerID string + machineID string + poolName string + gpuType string + gpuCount int +} + +func (s *Service) clientEnrollmentAttrs(ctx context.Context, containerID string) (*clientEnrollmentAttrs, error) { + state, err := s.containerRepo.GetContainerState(containerID) + if err != nil { + return nil, err + } + if state == nil || state.ContainerId != containerID { + return nil, fmt.Errorf("container state not found") + } + if state.WorkspaceId == "" { + return nil, fmt.Errorf("container workspace is required") + } + if state.WorkerId == "" { + return nil, fmt.Errorf("container worker is required") + } + + worker, err := s.workerRepo.GetWorkerById(state.WorkerId) + if err != nil { + return nil, err + } + if worker == nil || worker.Id != state.WorkerId { + return nil, fmt.Errorf("worker state not found") + } + if worker.PoolName == "" { + return nil, fmt.Errorf("worker pool is required") + } + + machineID := strings.TrimSpace(state.MachineId) + if machineID == "" { + machineID = strings.TrimSpace(worker.MachineId) + } + gpuType := strings.ToLower(strings.TrimSpace(state.Gpu)) + if gpuType == "" || strings.EqualFold(gpuType, string(types.NO_GPU)) { + return nil, fmt.Errorf("container GPU type is required for Thunder client enrollment") + } + gpuCount := int(state.GpuCount) + if gpuCount <= 0 { + gpuCount = 1 + } + + return &clientEnrollmentAttrs{ + workspaceID: state.WorkspaceId, + workerID: state.WorkerId, + machineID: machineID, + poolName: worker.PoolName, + gpuType: gpuType, + gpuCount: gpuCount, + }, nil +} + +func (s *Service) ensureZone(ctx context.Context, workspaceID, poolName string) (string, error) { + var zoneID string + err := s.repo.WithPoolLock(ctx, workspaceID, poolName, func(ctx context.Context) error { + var err error + zoneID, err = s.ensureZoneLocked(ctx, workspaceID, poolName) + return err + }) + if err != nil { + return "", err + } + return zoneID, nil +} + +func (s *Service) ensureZoneLocked(ctx context.Context, workspaceID, poolName string) (string, error) { + state, found, err := s.repo.GetZone(ctx, workspaceID, poolName) + if err != nil { + return "", err + } + if found && state.ThunderZoneID != "" { + return state.ThunderZoneID, nil + } + + zone, err := s.client.CreateZone(ctx, thunderZoneDisplayName(workspaceID, poolName)) + if err != nil { + return "", err + } + if zone == nil || strings.TrimSpace(zone.ZoneID) == "" { + return "", fmt.Errorf("Thunder zone response did not include a zone id") + } + return zone.ZoneID, s.repo.SaveZone(ctx, &ZoneState{ + WorkspaceID: workspaceID, + PoolName: poolName, + ThunderZoneID: zone.ZoneID, + }) +} + +func thunderZoneDisplayName(workspaceID, poolName string) string { + workspaceID = strings.TrimSpace(workspaceID) + poolName = strings.TrimSpace(poolName) + if workspaceID == "" { + return poolName + } + if poolName == "" { + return workspaceID + } + return workspaceID + "-" + poolName +} + +func (s *Service) requireAgentState(ctx context.Context, agentToken string) (*model.AgentTokenState, error) { + agentToken = strings.TrimSpace(agentToken) + if agentToken == "" { + return nil, fmt.Errorf("agent token is required") + } + if s == nil || s.computeRepo == nil { + return nil, fmt.Errorf("compute repository is unavailable") + } + + state, err := s.computeRepo.GetAgentTokenState(ctx, hashThunderComputeToken(agentToken)) + if err != nil { + return nil, err + } + if state == nil { + return nil, fmt.Errorf("invalid agent token") + } + current, err := s.computeRepo.GetAgentMachineState(ctx, state.WorkspaceID, state.PoolName, state.MachineID) + if err != nil { + return nil, err + } + if current == nil || current.TokenHash != state.TokenHash { + return nil, fmt.Errorf("invalid agent token") + } + return current, nil +} + +func hashThunderComputeToken(token string) string { + sum := sha256.Sum256([]byte(token)) + return hex.EncodeToString(sum[:]) +} + +func requireWorkerToken(ctx context.Context, workspaceID string) error { + authInfo, ok := auth.AuthInfoFromContext(ctx) + if !ok || authInfo == nil || authInfo.Token == nil || !types.IsWorkerTokenType(authInfo.Token.TokenType) { + return fmt.Errorf("worker token is required") + } + if authInfo.Token.TokenType == types.TokenTypeWorkerPrivate { + if authInfo.Workspace == nil || authInfo.Workspace.ExternalId == "" { + return fmt.Errorf("worker token is not scoped to a workspace") + } + if workspaceID != "" && workspaceID != authInfo.Workspace.ExternalId { + return fmt.Errorf("worker token cannot access workspace %q", workspaceID) + } + } + return nil +} + +func isThunderNotFound(err error) bool { + var thunderErr *ThunderError + return errors.As(err, &thunderErr) && thunderErr.StatusCode == http.StatusNotFound +} diff --git a/pkg/gateway/services/thunder/service_test.go b/pkg/gateway/services/thunder/service_test.go new file mode 100644 index 000000000..04c1595c2 --- /dev/null +++ b/pkg/gateway/services/thunder/service_test.go @@ -0,0 +1,430 @@ +package thunder + +import ( + "context" + "encoding/json" + "net/http" + "net/http/httptest" + "strings" + "testing" + "time" + + "github.com/beam-cloud/beta9/pkg/auth" + model "github.com/beam-cloud/beta9/pkg/compute" + "github.com/beam-cloud/beta9/pkg/repository" + "github.com/beam-cloud/beta9/pkg/types" + pb "github.com/beam-cloud/beta9/proto" +) + +func TestServiceCreateAndDeleteClientEnrollment(t *testing.T) { + rdb := newThunderRedisClient(t) + defer rdb.Close() + + containerRepo := repository.NewContainerRedisRepositoryForTest(rdb) + workerRepo := repository.NewWorkerRedisRepositoryForTest(rdb) + if err := workerRepo.AddWorker(&types.Worker{Id: "worker-1", PoolName: "pool-1", MachineId: "machine-1"}); err != nil { + t.Fatal(err) + } + if err := containerRepo.SetContainerState("container-1", &types.ContainerState{ + ContainerId: "container-1", + WorkspaceId: "workspace-1", + WorkerId: "worker-1", + MachineId: "machine-1", + Gpu: "H100", + GpuCount: 2, + }); err != nil { + t.Fatal(err) + } + + var createZoneCalls int + var createTokenCalls int + var deleteTokenCalls int + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if got := r.Header.Get("Authorization"); got != "Bearer central-token" { + t.Fatalf("authorization = %q", got) + } + switch { + case r.Method == http.MethodPost && r.URL.Path == thunderZonesPath: + createZoneCalls++ + var payload createZoneRequest + if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { + t.Fatal(err) + } + if payload.DisplayName != "workspace-1-pool-1" { + t.Fatalf("zone displayName = %q", payload.DisplayName) + } + _ = json.NewEncoder(w).Encode(Zone{ZoneID: "zone-1", DisplayName: payload.DisplayName}) + case r.Method == http.MethodPost && r.URL.Path == thunderEnrollmentTokenPath: + createTokenCalls++ + payload := map[string]any{} + if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { + t.Fatal(err) + } + if payload["zoneId"] != "zone-1" || payload["role"] != thunderEnrollmentRoleClient || payload["gpuType"] != "h100" || payload["gpuCount"] != float64(2) { + t.Fatalf("client enrollment payload = %+v", payload) + } + _ = json.NewEncoder(w).Encode(EnrollmentToken{EnrollmentTokenID: "token-1", EnrollmentToken: "tr_client", ZoneID: "zone-1", Role: thunderEnrollmentRoleClient, GPUType: "h100", GPUCount: 2}) + case r.Method == http.MethodDelete && r.URL.Path == "/api/v1/enrollment-tokens/token-1/node": + deleteTokenCalls++ + _ = json.NewEncoder(w).Encode(DeleteEnrollmentTokenNodeResponse{EnrollmentTokenID: "token-1", Role: thunderEnrollmentRoleClient, NodeDeleted: true}) + default: + t.Fatalf("unexpected request = %s %s", r.Method, r.URL.Path) + } + })) + defer server.Close() + + service, err := NewService(ServiceOpts{ + Repository: NewRedisRepository(rdb), + Client: NewClient(server.URL, "central-token", server.Client()), + ContainerRepo: containerRepo, + WorkerRepo: workerRepo, + }) + if err != nil { + t.Fatal(err) + } + ctx := thunderWorkerAuthContext(types.TokenTypeWorker, "") + + createResp, err := service.CreateClientEnrollment(ctx, &pb.CreateClientEnrollmentRequest{ContainerId: "container-1"}) + if err != nil { + t.Fatal(err) + } + if !createResp.Ok || createResp.ErrorMsg != "" { + t.Fatalf("CreateClientEnrollment() = %+v", createResp) + } + if !strings.Contains(createResp.InstallCommand, "THUNDER_CENTRAL_URL='"+server.URL+"'") || !strings.Contains(createResp.InstallCommand, "THUNDER_ENROLLMENT_TOKEN='tr_client'") { + t.Fatalf("install command = %q", createResp.InstallCommand) + } + if createZoneCalls != 1 || createTokenCalls != 1 { + t.Fatalf("createZoneCalls=%d createTokenCalls=%d", createZoneCalls, createTokenCalls) + } + + state, found, err := service.repo.GetClientEnrollment(context.Background(), "container-1") + if err != nil || !found { + t.Fatalf("GetClientEnrollment() found=%v err=%v", found, err) + } + if state.EnrollmentTokenID != "token-1" || state.WorkspaceID != "workspace-1" || state.PoolName != "pool-1" || state.MachineID != "machine-1" { + t.Fatalf("client enrollment state = %+v", state) + } + zone, found, err := service.repo.GetZone(context.Background(), "workspace-1", "pool-1") + if err != nil || !found { + t.Fatalf("GetZone() found=%v err=%v", found, err) + } + if zone.ThunderZoneID != "zone-1" { + t.Fatalf("zone = %+v", zone) + } + + deleteResp, err := service.DeleteClientEnrollment(ctx, &pb.DeleteClientEnrollmentRequest{ContainerId: "container-1"}) + if err != nil { + t.Fatal(err) + } + if !deleteResp.Ok || deleteResp.ErrorMsg != "" { + t.Fatalf("DeleteClientEnrollment() = %+v", deleteResp) + } + if deleteTokenCalls != 1 { + t.Fatalf("deleteTokenCalls = %d", deleteTokenCalls) + } + _, found, err = service.repo.GetClientEnrollment(context.Background(), "container-1") + if err != nil || found { + t.Fatalf("GetClientEnrollment() after delete found=%v err=%v", found, err) + } +} + +func TestServiceCreateClientEnrollmentReusesExistingZone(t *testing.T) { + rdb := newThunderRedisClient(t) + defer rdb.Close() + + containerRepo := repository.NewContainerRedisRepositoryForTest(rdb) + workerRepo := repository.NewWorkerRedisRepositoryForTest(rdb) + if err := workerRepo.AddWorker(&types.Worker{Id: "worker-1", PoolName: "pool-1", MachineId: "machine-1"}); err != nil { + t.Fatal(err) + } + if err := containerRepo.SetContainerState("container-1", &types.ContainerState{ + ContainerId: "container-1", + WorkspaceId: "workspace-1", + WorkerId: "worker-1", + Gpu: "A10G", + GpuCount: 1, + }); err != nil { + t.Fatal(err) + } + repo := NewRedisRepository(rdb) + if err := repo.SaveZone(context.Background(), &ZoneState{WorkspaceID: "workspace-1", PoolName: "pool-1", ThunderZoneID: "zone-existing"}); err != nil { + t.Fatal(err) + } + + var createZoneCalls int + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodPost && r.URL.Path == thunderZonesPath { + createZoneCalls++ + t.Fatal("CreateZone should not be called for an existing zone") + } + if r.Method != http.MethodPost || r.URL.Path != thunderEnrollmentTokenPath { + t.Fatalf("unexpected request = %s %s", r.Method, r.URL.Path) + } + payload := map[string]any{} + if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { + t.Fatal(err) + } + if payload["zoneId"] != "zone-existing" { + t.Fatalf("zoneId = %v", payload["zoneId"]) + } + _ = json.NewEncoder(w).Encode(EnrollmentToken{EnrollmentTokenID: "token-1", EnrollmentToken: "tr_client", ZoneID: "zone-existing", Role: thunderEnrollmentRoleClient}) + })) + defer server.Close() + + service, err := NewService(ServiceOpts{Repository: repo, Client: NewClient(server.URL, "central-token", server.Client()), ContainerRepo: containerRepo, WorkerRepo: workerRepo}) + if err != nil { + t.Fatal(err) + } + resp, err := service.CreateClientEnrollment(thunderWorkerAuthContext(types.TokenTypeWorker, ""), &pb.CreateClientEnrollmentRequest{ContainerId: "container-1"}) + if err != nil { + t.Fatal(err) + } + if !resp.Ok || resp.ErrorMsg != "" { + t.Fatalf("CreateClientEnrollment() = %+v", resp) + } + if createZoneCalls != 0 { + t.Fatalf("createZoneCalls = %d", createZoneCalls) + } +} + +func TestServiceCreateClientEnrollmentRequiresWorkerToken(t *testing.T) { + service := &Service{} + resp, err := service.CreateClientEnrollment(context.Background(), &pb.CreateClientEnrollmentRequest{ContainerId: "container-1"}) + if err != nil { + t.Fatal(err) + } + if resp.Ok || !strings.Contains(resp.ErrorMsg, "worker token") { + t.Fatalf("CreateClientEnrollment() = %+v", resp) + } +} + +func TestServiceDeleteClientEnrollmentIsIdempotent(t *testing.T) { + rdb := newThunderRedisClient(t) + defer rdb.Close() + service, err := NewService(ServiceOpts{ + Repository: NewRedisRepository(rdb), + Client: NewClient("https://central.example", "central-token", nil), + ContainerRepo: repository.NewContainerRedisRepositoryForTest(rdb), + WorkerRepo: repository.NewWorkerRedisRepositoryForTest(rdb), + }) + if err != nil { + t.Fatal(err) + } + resp, err := service.DeleteClientEnrollment(thunderWorkerAuthContext(types.TokenTypeWorker, ""), &pb.DeleteClientEnrollmentRequest{ContainerId: "missing"}) + if err != nil { + t.Fatal(err) + } + if !resp.Ok || resp.ErrorMsg != "" { + t.Fatalf("DeleteClientEnrollment() = %+v", resp) + } +} + +func TestServicePrivateWorkerTokenIsWorkspaceScoped(t *testing.T) { + rdb := newThunderRedisClient(t) + defer rdb.Close() + + containerRepo := repository.NewContainerRedisRepositoryForTest(rdb) + workerRepo := repository.NewWorkerRedisRepositoryForTest(rdb) + if err := workerRepo.AddWorker(&types.Worker{Id: "worker-1", PoolName: "pool-1"}); err != nil { + t.Fatal(err) + } + if err := containerRepo.SetContainerState("container-1", &types.ContainerState{ContainerId: "container-1", WorkspaceId: "workspace-1", WorkerId: "worker-1", Gpu: "H100", GpuCount: 1}); err != nil { + t.Fatal(err) + } + service, err := NewService(ServiceOpts{ + Repository: NewRedisRepository(rdb), + Client: NewClient("https://central.example", "central-token", nil), + ContainerRepo: containerRepo, + WorkerRepo: workerRepo, + }) + if err != nil { + t.Fatal(err) + } + + resp, err := service.CreateClientEnrollment(thunderWorkerAuthContext(types.TokenTypeWorkerPrivate, "workspace-2"), &pb.CreateClientEnrollmentRequest{ContainerId: "container-1"}) + if err != nil { + t.Fatal(err) + } + if resp.Ok || !strings.Contains(resp.ErrorMsg, "workspace") { + t.Fatalf("CreateClientEnrollment() = %+v", resp) + } +} + +func TestServiceCreateAndDeleteNodeEnrollment(t *testing.T) { + rdb := newThunderRedisClient(t) + defer rdb.Close() + + repo := NewRedisRepository(rdb) + computeRepo := repository.NewComputeRedisRepository(rdb) + agentToken := "agent-token" + saveThunderAgentTokenState(t, computeRepo, agentToken, "workspace-1", "pool-1", "machine-1") + + var createZoneCalls int + var createTokenCalls int + var deleteTokenCalls int + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if got := r.Header.Get("Authorization"); got != "Bearer central-token" { + t.Fatalf("authorization = %q", got) + } + switch { + case r.Method == http.MethodPost && r.URL.Path == thunderZonesPath: + createZoneCalls++ + var payload createZoneRequest + if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { + t.Fatal(err) + } + if payload.DisplayName != "workspace-1-pool-1" { + t.Fatalf("zone displayName = %q", payload.DisplayName) + } + _ = json.NewEncoder(w).Encode(Zone{ZoneID: "zone-1", DisplayName: payload.DisplayName}) + case r.Method == http.MethodPost && r.URL.Path == thunderEnrollmentTokenPath: + createTokenCalls++ + payload := map[string]any{} + if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { + t.Fatal(err) + } + if payload["zoneId"] != "zone-1" || payload["role"] != thunderEnrollmentRoleServer { + t.Fatalf("node enrollment payload = %+v", payload) + } + if _, ok := payload["gpuType"]; ok { + t.Fatalf("node enrollment payload included gpuType: %+v", payload) + } + if _, ok := payload["gpuCount"]; ok { + t.Fatalf("node enrollment payload included gpuCount: %+v", payload) + } + _ = json.NewEncoder(w).Encode(EnrollmentToken{EnrollmentTokenID: "node-token-1", EnrollmentToken: "tr_node", ZoneID: "zone-1", Role: thunderEnrollmentRoleServer}) + case r.Method == http.MethodDelete && r.URL.Path == "/api/v1/enrollment-tokens/node-token-1/node": + deleteTokenCalls++ + _ = json.NewEncoder(w).Encode(DeleteEnrollmentTokenNodeResponse{EnrollmentTokenID: "node-token-1", Role: thunderEnrollmentRoleServer, NodeDeleted: true}) + default: + t.Fatalf("unexpected request = %s %s", r.Method, r.URL.Path) + } + })) + defer server.Close() + + service, err := NewService(ServiceOpts{ + Repository: repo, + Client: NewClient(server.URL, "central-token", server.Client()), + ContainerRepo: repository.NewContainerRedisRepositoryForTest(rdb), + WorkerRepo: repository.NewWorkerRedisRepositoryForTest(rdb), + ComputeRepo: computeRepo, + }) + if err != nil { + t.Fatal(err) + } + + createResp, err := service.CreateNodeEnrollment(context.Background(), &pb.CreateNodeEnrollmentRequest{AgentToken: agentToken}) + if err != nil { + t.Fatal(err) + } + if !createResp.Ok || createResp.ErrorMsg != "" || createResp.EnrollmentToken != "tr_node" { + t.Fatalf("CreateNodeEnrollment() = %+v", createResp) + } + if createZoneCalls != 1 || createTokenCalls != 1 { + t.Fatalf("createZoneCalls=%d createTokenCalls=%d", createZoneCalls, createTokenCalls) + } + + state, found, err := repo.GetNodeEnrollment(context.Background(), "workspace-1", "pool-1", "machine-1") + if err != nil || !found { + t.Fatalf("GetNodeEnrollment() found=%v err=%v", found, err) + } + if state.EnrollmentTokenID != "node-token-1" { + t.Fatalf("node enrollment state = %+v", state) + } + zone, found, err := repo.GetZone(context.Background(), "workspace-1", "pool-1") + if err != nil || !found { + t.Fatalf("GetZone() found=%v err=%v", found, err) + } + if zone.ThunderZoneID != "zone-1" { + t.Fatalf("zone = %+v", zone) + } + + deleteResp, err := service.DeleteNodeEnrollment(context.Background(), &pb.DeleteNodeEnrollmentRequest{AgentToken: agentToken}) + if err != nil { + t.Fatal(err) + } + if !deleteResp.Ok || deleteResp.ErrorMsg != "" { + t.Fatalf("DeleteNodeEnrollment() = %+v", deleteResp) + } + if deleteTokenCalls != 1 { + t.Fatalf("deleteTokenCalls = %d", deleteTokenCalls) + } + _, found, err = repo.GetNodeEnrollment(context.Background(), "workspace-1", "pool-1", "machine-1") + if err != nil || found { + t.Fatalf("GetNodeEnrollment() after delete found=%v err=%v", found, err) + } +} + +func TestServiceCreateNodeEnrollmentWithExistingStateIsIdempotent(t *testing.T) { + rdb := newThunderRedisClient(t) + defer rdb.Close() + + repo := NewRedisRepository(rdb) + computeRepo := repository.NewComputeRedisRepository(rdb) + agentToken := "agent-token" + saveThunderAgentTokenState(t, computeRepo, agentToken, "workspace-1", "pool-1", "machine-1") + if err := repo.SaveNodeEnrollment(context.Background(), &NodeEnrollmentState{WorkspaceID: "workspace-1", PoolName: "pool-1", MachineID: "machine-1", EnrollmentTokenID: "node-token-existing"}, 0); err != nil { + t.Fatal(err) + } + + service, err := NewService(ServiceOpts{ + Repository: repo, + Client: NewClient("https://central.example", "central-token", nil), + ContainerRepo: repository.NewContainerRedisRepositoryForTest(rdb), + WorkerRepo: repository.NewWorkerRedisRepositoryForTest(rdb), + ComputeRepo: computeRepo, + }) + if err != nil { + t.Fatal(err) + } + resp, err := service.CreateNodeEnrollment(context.Background(), &pb.CreateNodeEnrollmentRequest{AgentToken: agentToken}) + if err != nil { + t.Fatal(err) + } + if !resp.Ok || resp.ErrorMsg != "" || resp.EnrollmentToken != "" { + t.Fatalf("CreateNodeEnrollment() = %+v", resp) + } +} + +func TestServiceCreateNodeEnrollmentRequiresValidAgentToken(t *testing.T) { + rdb := newThunderRedisClient(t) + defer rdb.Close() + service, err := NewService(ServiceOpts{ + Repository: NewRedisRepository(rdb), + Client: NewClient("https://central.example", "central-token", nil), + ContainerRepo: repository.NewContainerRedisRepositoryForTest(rdb), + WorkerRepo: repository.NewWorkerRedisRepositoryForTest(rdb), + ComputeRepo: repository.NewComputeRedisRepository(rdb), + }) + if err != nil { + t.Fatal(err) + } + resp, err := service.CreateNodeEnrollment(context.Background(), &pb.CreateNodeEnrollmentRequest{AgentToken: "missing"}) + if err != nil { + t.Fatal(err) + } + if resp.Ok || !strings.Contains(resp.ErrorMsg, "invalid agent token") { + t.Fatalf("CreateNodeEnrollment() = %+v", resp) + } +} + +func saveThunderAgentTokenState(t *testing.T, repo repository.ComputeRepository, agentToken, workspaceID, poolName, machineID string) { + t.Helper() + if err := repo.SaveAgentTokenState(context.Background(), &model.AgentTokenState{ + TokenHash: hashThunderComputeToken(agentToken), + WorkspaceID: workspaceID, + PoolName: poolName, + MachineID: machineID, + }, time.Hour); err != nil { + t.Fatal(err) + } +} + +func thunderWorkerAuthContext(tokenType, workspaceID string) context.Context { + authInfo := &auth.AuthInfo{Token: &types.Token{TokenType: tokenType}} + if workspaceID != "" { + authInfo.Workspace = &types.Workspace{ExternalId: workspaceID} + } + return auth.ContextWithAuthInfo(context.Background(), authInfo) +} diff --git a/pkg/gateway/services/thunder/thunder.proto b/pkg/gateway/services/thunder/thunder.proto new file mode 100644 index 000000000..779f6e6c3 --- /dev/null +++ b/pkg/gateway/services/thunder/thunder.proto @@ -0,0 +1,27 @@ +syntax = "proto3"; + +package thunder; + +option go_package = "github.com/beam-cloud/beta9/proto"; + +service ThunderService { + rpc CreateClientEnrollment(CreateClientEnrollmentRequest) + returns (CreateClientEnrollmentResponse); + rpc DeleteClientEnrollment(DeleteClientEnrollmentRequest) + returns (DeleteClientEnrollmentResponse); +} + +message CreateClientEnrollmentRequest { string container_id = 1; } + +message CreateClientEnrollmentResponse { + bool ok = 1; + string error_msg = 2; + string install_command = 3; +} + +message DeleteClientEnrollmentRequest { string container_id = 1; } + +message DeleteClientEnrollmentResponse { + bool ok = 1; + string error_msg = 2; +} diff --git a/pkg/worker/lifecycle_test.go b/pkg/worker/lifecycle_test.go index a73e1080e..adf719f34 100644 --- a/pkg/worker/lifecycle_test.go +++ b/pkg/worker/lifecycle_test.go @@ -523,7 +523,7 @@ func TestSpecFromRequestEnforcesMemoryForGPUWithoutCPUQuota(t *testing.T) { func TestSpecFromRequestInjectsThunderMounts(t *testing.T) { worker := &Worker{ runtime: &mockRuntime{name: types.ContainerRuntimeGvisor.String()}, - containerThunderManager: NewContainerThunderManager("", "", nil), + containerThunderManager: NewContainerThunderManager(nil), } spec, err := worker.specFromRequest(&types.ContainerRequest{ diff --git a/pkg/worker/repository.go b/pkg/worker/repository.go index 49cc56ffc..37efebbfa 100644 --- a/pkg/worker/repository.go +++ b/pkg/worker/repository.go @@ -61,6 +61,17 @@ func NewBackendRepositoryClient(ctx context.Context, config types.AppConfig, tok return pb.NewBackendRepositoryServiceClient(conn), nil } +// NewThunderServiceClient creates a new Thunder service client. +func NewThunderServiceClient(ctx context.Context, config types.AppConfig, token string) (pb.ThunderServiceClient, error) { + host := fmt.Sprintf("%s:%d", config.GatewayService.GRPC.ExternalHost, config.GatewayService.GRPC.ExternalPort) + conn, err := newGRPCConn(host, token) + if err != nil { + return nil, err + } + + return pb.NewThunderServiceClient(conn), nil +} + // newGRPCConn creates a new gRPC connection (with or without TLS/Auth) to the provided host func newGRPCConn(host string, token string) (*grpc.ClientConn, error) { creds := insecure.NewCredentials() diff --git a/pkg/worker/thunder.go b/pkg/worker/thunder.go index 042244272..2823d4578 100644 --- a/pkg/worker/thunder.go +++ b/pkg/worker/thunder.go @@ -1,34 +1,24 @@ package worker import ( - "bytes" "context" - "encoding/json" "fmt" - "net/http" - "os" "strings" "sync" "time" common "github.com/beam-cloud/beta9/pkg/common" "github.com/beam-cloud/beta9/pkg/types" + pb "github.com/beam-cloud/beta9/proto" "github.com/opencontainers/runtime-spec/specs-go" "github.com/rs/zerolog/log" ) const ( - thunderAPIURLEnv = "THUNDER_API_URL" - thunderAPITokenEnv = "THUNDER_API_TOKEN" - thunderZoneIDEnv = "THUNDER_ZONE_ID" - thunderEnrollmentTokenPath = "/api/v1/enrollment-tokens" - thunderEnrollmentTokenNodePath = "/api/v1/enrollment-tokens/%s/node" - thunderEnrollmentRoleClient = "client" - thunderEnrollmentExpiresSecond = 604800 - thunderLibraryPath = "/etc/thunder/libthunder.so" - thunderNvidiaSMIPath = "/usr/bin/nvidia-smi" - thunderNvidiaMLLibraryPath = "/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1" - thunderCudaDriverLibraryPath = "/usr/lib/x86_64-linux-gnu/libcuda.so.1" + thunderLibraryPath = "/etc/thunder/libthunder.so" + thunderNvidiaSMIPath = "/usr/bin/nvidia-smi" + thunderNvidiaMLLibraryPath = "/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1" + thunderCudaDriverLibraryPath = "/usr/lib/x86_64-linux-gnu/libcuda.so.1" ) type thunderSetupState int @@ -148,62 +138,14 @@ func (t *thunderSetupTracker) Delete(containerId string) { } type ContainerThunderManager struct { - apiURL string - apiToken string - client *http.Client - allocations *common.SafeMap[thunderAllocation] + client pb.ThunderServiceClient + installCache *common.SafeMap[string] } -type thunderAllocation struct { - EnrollmentTokenID string - EnrollmentToken string - APIURL string - APIToken string - Response thunderEnrollmentTokenResponse -} - -type thunderEnrollmentTokenRequest struct { - OrgID string `json:"orgId"` - ZoneID string `json:"zoneId"` - Role string `json:"role"` - GPUType string `json:"gpuType"` - GPUCount int `json:"gpuCount"` - ExpiresInSeconds int `json:"expiresInSeconds"` -} - -type thunderEnrollmentTokenResponse struct { - EnrollmentTokenID string `json:"enrollmentTokenId"` - EnrollmentToken string `json:"enrollmentToken"` - OrgID string `json:"orgId"` - ZoneID string `json:"zoneId"` - Role string `json:"role"` - GPUType string `json:"gpuType"` - GPUCount int `json:"gpuCount"` - ExpiresAt time.Time `json:"expiresAt"` -} - -type thunderDeleteEnrollmentTokenNodeResponse struct { - EnrollmentTokenID string `json:"enrollmentTokenId"` - Role string `json:"role"` - ClientID string `json:"clientId"` - HostID string `json:"hostId"` - NodeDeleted bool `json:"nodeDeleted"` - DeletedAt time.Time `json:"deletedAt"` -} - -func NewContainerThunderManagerFromEnv() GPUManager { - return NewContainerThunderManager(os.Getenv(thunderAPIURLEnv), os.Getenv(thunderAPITokenEnv), nil) -} - -func NewContainerThunderManager(apiURL, apiToken string, client *http.Client) *ContainerThunderManager { - if client == nil { - client = &http.Client{Timeout: 10 * time.Second} - } +func NewContainerThunderManager(client pb.ThunderServiceClient) *ContainerThunderManager { return &ContainerThunderManager{ - apiURL: strings.TrimRight(apiURL, "/"), - apiToken: apiToken, - client: client, - allocations: common.NewSafeMap[thunderAllocation](), + client: client, + installCache: common.NewSafeMap[string](), } } @@ -211,63 +153,27 @@ func (c *ContainerThunderManager) AssignGPUDevices(request *types.ContainerReque if request == nil { return nil, fmt.Errorf("missing container request") } - - apiURL, apiToken := c.thunderCredentials(request) - if apiURL == "" { - return nil, fmt.Errorf("%s is required for virtualized GPU requests", thunderAPIURLEnv) + if c == nil || c.client == nil { + return nil, fmt.Errorf("Thunder service client is required for virtualized GPU requests") } - if apiToken == "" { - return nil, fmt.Errorf("%s is required for virtualized GPU requests", thunderAPITokenEnv) + containerID := strings.TrimSpace(request.ContainerId) + if containerID == "" { + return nil, fmt.Errorf("container id is required for Thunder client enrollment") } - zoneID := thunderZoneID(request) - if zoneID == "" { - return nil, fmt.Errorf("%s is required for virtualized GPU requests", thunderZoneIDEnv) - } - - payload := thunderEnrollmentTokenRequest{ - OrgID: "", - ZoneID: zoneID, - Role: thunderEnrollmentRoleClient, - GPUType: strings.ToLower(thunderGPUType(request)), - GPUCount: int(thunderGPUCount(request)), - ExpiresInSeconds: thunderEnrollmentExpiresSecond, - } - - log.Info(). - Str("container_id", request.ContainerId). - Str("zone_id", payload.ZoneID). - Str("gpu_type", payload.GPUType). - Int("gpu_count", payload.GPUCount). - Msg("requesting Thunder enrollment token") - - var response thunderEnrollmentTokenResponse - if err := c.doThunderRequest(http.MethodPost, apiURL, apiToken, thunderEnrollmentTokenPath, payload, &response); err != nil { - log.Error(). - Str("container_id", request.ContainerId). - Str("zone_id", payload.ZoneID). - Str("gpu_type", payload.GPUType). - Int("gpu_count", payload.GPUCount). - Err(err). - Msg("failed to assign Thunder virtual GPU") + log.Info().Str("container_id", containerID).Msg("requesting Thunder client enrollment") + response, err := handleGRPCResponse(c.client.CreateClientEnrollment(context.Background(), &pb.CreateClientEnrollmentRequest{ContainerId: containerID})) + if err != nil { + log.Error().Str("container_id", containerID).Err(err).Msg("failed to assign Thunder virtual GPU") return nil, err } + installCommand := strings.TrimSpace(response.InstallCommand) + if installCommand == "" { + return nil, fmt.Errorf("Thunder client enrollment did not include an install command") + } + c.installCache.Set(containerID, installCommand) - c.allocations.Set(request.ContainerId, thunderAllocation{ - EnrollmentTokenID: response.EnrollmentTokenID, - EnrollmentToken: response.EnrollmentToken, - APIURL: apiURL, - APIToken: apiToken, - Response: response, - }) - - log.Info(). - Str("container_id", request.ContainerId). - Str("enrollment_token_id", response.EnrollmentTokenID). - Str("zone_id", response.ZoneID). - Str("gpu_type", response.GPUType). - Int("gpu_count", response.GPUCount). - Msg("assigned Thunder virtual GPU") + log.Info().Str("container_id", containerID).Msg("assigned Thunder virtual GPU") return []int{}, nil } @@ -276,31 +182,22 @@ func (c *ContainerThunderManager) GetContainerGPUDevices(containerId string) []i } func (c *ContainerThunderManager) UnassignGPUDevices(containerId string) { - allocation, ok := c.allocations.Get(containerId) - if !ok { - log.Debug().Str("container_id", containerId).Msg("skipping Thunder virtual GPU unassign because no allocation was recorded") + containerId = strings.TrimSpace(containerId) + if containerId == "" { return } - if strings.TrimSpace(allocation.EnrollmentTokenID) == "" { - log.Error().Str("container_id", containerId).Msg("missing Thunder enrollment token id for virtual GPU unenrollment") - c.allocations.Delete(containerId) + if c == nil || c.client == nil { + log.Error().Str("container_id", containerId).Msg("Thunder service client unavailable for virtual GPU unassign") return } - path := fmt.Sprintf(thunderEnrollmentTokenNodePath, allocation.EnrollmentTokenID) - log.Info(). - Str("container_id", containerId). - Str("enrollment_token_id", allocation.EnrollmentTokenID). - Msg("unassigning Thunder virtual GPU") - if err := c.doThunderRequest(http.MethodDelete, allocation.APIURL, allocation.APIToken, path, nil, nil); err != nil { + log.Info().Str("container_id", containerId).Msg("unassigning Thunder virtual GPU") + if _, err := handleGRPCResponse(c.client.DeleteClientEnrollment(context.Background(), &pb.DeleteClientEnrollmentRequest{ContainerId: containerId})); err != nil { log.Error().Str("container_id", containerId).Err(err).Msg("failed to unregister Thunder virtual GPU client") } else { - log.Info(). - Str("container_id", containerId). - Str("enrollment_token_id", allocation.EnrollmentTokenID). - Msg("unassigned Thunder virtual GPU") + log.Info().Str("container_id", containerId).Msg("unassigned Thunder virtual GPU") } - c.allocations.Delete(containerId) + c.installCache.Delete(containerId) } func (c *ContainerThunderManager) CDIDevices(assignedDevices []int) []string { @@ -338,125 +235,6 @@ func thunderBindMount(path string) specs.Mount { } } -func (c *ContainerThunderManager) doThunderRequest(method, apiURL, apiToken, path string, payload any, response any) error { - endpoint, err := thunderEndpoint(apiURL, path) - if err != nil { - return err - } - - var bodyReader *bytes.Reader - if payload != nil { - body, err := json.Marshal(payload) - if err != nil { - return err - } - bodyReader = bytes.NewReader(body) - } else { - bodyReader = bytes.NewReader(nil) - } - - req, err := http.NewRequest(method, endpoint, bodyReader) - if err != nil { - return err - } - req.Header.Set("Authorization", "Bearer "+apiToken) - if payload != nil { - req.Header.Set("Content-Type", "application/json") - } - - resp, err := c.client.Do(req) - if err != nil { - log.Error().Str("method", method).Str("path", path).Err(err).Msg("Thunder API request failed") - return err - } - defer resp.Body.Close() - if resp.StatusCode < 200 || resp.StatusCode >= 300 { - err = fmt.Errorf("Thunder API %s %s returned status %d", method, path, resp.StatusCode) - log.Error().Str("method", method).Str("path", path).Int("status_code", resp.StatusCode).Msg("Thunder API request failed") - return err - } - if response == nil { - return nil - } - if err := json.NewDecoder(resp.Body).Decode(response); err != nil { - log.Error().Str("method", method).Str("path", path).Err(err).Msg("Thunder API response decode failed") - return err - } - return nil -} - -func thunderEndpoint(apiURL, path string) (string, error) { - if !strings.HasPrefix(path, "/") { - path = "/" + path - } - return strings.TrimRight(apiURL, "/") + path, nil -} - -func thunderGPUType(request *types.ContainerRequest) string { - if request == nil { - return "" - } - if request.Gpu != "" && request.Gpu != string(types.NO_GPU) { - return request.Gpu - } - for _, gpu := range request.GpuRequest { - if gpu != "" && gpu != string(types.NO_GPU) { - return gpu - } - } - return request.Gpu -} - -func thunderGPUCount(request *types.ContainerRequest) uint32 { - if request == nil { - return 0 - } - if request.GpuCount > 0 { - return request.GpuCount - } - if request.RequiresGPU() { - return 1 - } - return 0 -} - -func (c *ContainerThunderManager) thunderCredentials(request *types.ContainerRequest) (string, string) { - apiURL := strings.TrimSpace(c.apiURL) - apiToken := strings.TrimSpace(c.apiToken) - if request == nil { - return apiURL, apiToken - } - - if value, ok := thunderRequestEnv(request.Env, thunderAPIURLEnv); ok { - apiURL = value - } - if value, ok := thunderRequestEnv(request.Env, thunderAPITokenEnv); ok { - apiToken = value - } - return apiURL, apiToken -} - -func thunderZoneID(request *types.ContainerRequest) string { - zoneID := strings.TrimSpace(os.Getenv(thunderZoneIDEnv)) - if request == nil { - return zoneID - } - if value, ok := thunderRequestEnv(request.Env, thunderZoneIDEnv); ok { - zoneID = value - } - return zoneID -} - -func thunderRequestEnv(env []string, key string) (string, bool) { - prefix := key + "=" - for _, item := range env { - if strings.HasPrefix(item, prefix) { - return strings.TrimSpace(strings.TrimPrefix(item, prefix)), true - } - } - return "", false -} - func (s *Worker) installThunderClient(ctx context.Context, request *types.ContainerRequest) error { if s == nil || request == nil || !request.GpuVirtualized { return nil @@ -465,9 +243,9 @@ func (s *Worker) installThunderClient(ctx context.Context, request *types.Contai if !ok || manager == nil { return fmt.Errorf("thunder manager unavailable") } - allocation, ok := manager.allocations.Get(request.ContainerId) - if !ok || strings.TrimSpace(allocation.EnrollmentToken) == "" { - return fmt.Errorf("missing Thunder enrollment token for container %s", request.ContainerId) + cmd, ok := manager.installCache.Get(request.ContainerId) + if !ok || strings.TrimSpace(cmd) == "" { + return fmt.Errorf("missing Thunder install command for container %s", request.ContainerId) } instance, ok := s.containerInstances.Get(request.ContainerId) if !ok || instance == nil || instance.Runtime == nil { @@ -484,13 +262,9 @@ func (s *Worker) installThunderClient(ctx context.Context, request *types.Contai cwd = instance.Spec.Process.Cwd } } - cmd := "curl -fsSL https://get.thundercompute.com/install.sh | sudo THUNDER_NOWARN=1 THUNDER_INSTALL_MODE=client THUNDER_CENTRAL_URL=" + common.ShellQuote(allocation.APIURL) + " THUNDER_ENROLLMENT_TOKEN=" + common.ShellQuote(allocation.EnrollmentToken) + " sh" installCtx, cancel := context.WithTimeout(ctx, 2*time.Minute) defer cancel() - log.Info(). - Str("container_id", request.ContainerId). - Str("enrollment_token_id", allocation.EnrollmentTokenID). - Msg("installing Thunder client in sandbox") + log.Info().Str("container_id", request.ContainerId).Msg("installing Thunder client in sandbox") if instance.SandboxProcessManager != nil && instance.SandboxProcessManagerReady { if err := runSandboxProcessManagerCommand(installCtx, instance.SandboxProcessManager, []string{"sh", "-c", cmd}, cwd, env, "Thunder client install"); err != nil { return fmt.Errorf("failed to install Thunder client: %w", err) @@ -505,10 +279,7 @@ func (s *Worker) installThunderClient(ctx context.Context, request *types.Contai return fmt.Errorf("failed to install Thunder client: %w", err) } } - log.Info(). - Str("container_id", request.ContainerId). - Str("enrollment_token_id", allocation.EnrollmentTokenID). - Msg("installed Thunder client in sandbox") + log.Info().Str("container_id", request.ContainerId).Msg("installed Thunder client in sandbox") return nil } diff --git a/pkg/worker/thunder_test.go b/pkg/worker/thunder_test.go index 061776c1f..88ca2d976 100644 --- a/pkg/worker/thunder_test.go +++ b/pkg/worker/thunder_test.go @@ -2,19 +2,17 @@ package worker import ( "context" - "encoding/json" "errors" - "fmt" - "net/http" - "net/http/httptest" - "sync/atomic" + "strings" "testing" "time" common "github.com/beam-cloud/beta9/pkg/common" "github.com/beam-cloud/beta9/pkg/types" + pb "github.com/beam-cloud/beta9/proto" "github.com/opencontainers/runtime-spec/specs-go" "github.com/tj/assert" + "google.golang.org/grpc" ) func TestThunderSetupTrackerWaitsUntilComplete(t *testing.T) { @@ -75,7 +73,7 @@ func requireNoErrorEventually(t *testing.T, done <-chan error) { } func TestThunderInjectEnvVarsAddsThunderLDPreload(t *testing.T) { - manager := NewContainerThunderManager("", "", nil) + manager := NewContainerThunderManager(nil) env := manager.InjectEnvVars([]string{"A=1"}) @@ -83,7 +81,7 @@ func TestThunderInjectEnvVarsAddsThunderLDPreload(t *testing.T) { } func TestThunderInjectEnvVarsAppendsThunderLDPreload(t *testing.T) { - manager := NewContainerThunderManager("", "", nil) + manager := NewContainerThunderManager(nil) env := manager.InjectEnvVars([]string{"LD_PRELOAD=/lib/existing.so"}) @@ -91,7 +89,7 @@ func TestThunderInjectEnvVarsAppendsThunderLDPreload(t *testing.T) { } func TestThunderInjectMountsAddsNvidiaSMINVMLAndCUDA(t *testing.T) { - manager := NewContainerThunderManager("", "", nil) + manager := NewContainerThunderManager(nil) initialMounts := []specs.Mount{{Type: "bind", Source: "/src", Destination: "/dst"}} mounts := manager.InjectMounts(initialMounts) @@ -101,91 +99,81 @@ func TestThunderInjectMountsAddsNvidiaSMINVMLAndCUDA(t *testing.T) { assert.Contains(t, mounts, thunderBindMount("/usr/lib/x86_64-linux-gnu/libcuda.so.1")) } -func TestThunderAssignRegistersClientAndLeavesAssignedEnvUnchanged(t *testing.T) { - var registerPayload thunderEnrollmentTokenRequest - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.Path != thunderEnrollmentTokenPath { - t.Fatalf("path = %s, want %s", r.URL.Path, thunderEnrollmentTokenPath) - } - if r.Method != http.MethodPost { - t.Fatalf("method = %s, want POST", r.Method) - } - if r.Header.Get("Authorization") != "Bearer central-token" { - t.Fatalf("authorization header = %q", r.Header.Get("Authorization")) - } - if err := json.NewDecoder(r.Body).Decode(®isterPayload); err != nil { - t.Fatal(err) - } - _ = json.NewEncoder(w).Encode(thunderEnrollmentTokenResponse{EnrollmentTokenID: "token-id", EnrollmentToken: "client-token", ZoneID: "zone-123", Role: thunderEnrollmentRoleClient, GPUType: "a100", GPUCount: 2}) - })) - defer server.Close() - - manager := NewContainerThunderManager(server.URL, "central-token", server.Client()) - t.Setenv(thunderZoneIDEnv, "zone-123") - request := &types.ContainerRequest{ - ContainerId: "container-123", - Gpu: "A100", - GpuCount: 2, - GpuVirtualized: true, +func TestThunderAssignCreatesClientEnrollmentAndCachesInstallCommand(t *testing.T) { + client := &fakeThunderServiceClient{ + createResp: &pb.CreateClientEnrollmentResponse{Ok: true, InstallCommand: "curl install thunder"}, } + manager := NewContainerThunderManager(client) + request := &types.ContainerRequest{ContainerId: "container-123", GpuVirtualized: true} assigned, err := manager.AssignGPUDevices(request) if err != nil { t.Fatal(err) } assert.Equal(t, []int{}, assigned) - assert.Equal(t, thunderEnrollmentTokenRequest{OrgID: "", ZoneID: "zone-123", Role: thunderEnrollmentRoleClient, GPUType: "a100", GPUCount: 2, ExpiresInSeconds: thunderEnrollmentExpiresSecond}, registerPayload) + if len(client.createReqs) != 1 || client.createReqs[0].ContainerId != "container-123" { + t.Fatalf("create requests = %+v", client.createReqs) + } + cmd, ok := manager.installCache.Get("container-123") + assert.True(t, ok) + assert.Equal(t, "curl install thunder", cmd) env := manager.InjectAssignedEnvVars([]string{"A=1", "NVIDIA_VISIBLE_DEVICES=void", "WORKER_GPU_DEVICES=0"}, assigned) assert.Equal(t, []string{"A=1", "NVIDIA_VISIBLE_DEVICES=void", "WORKER_GPU_DEVICES=0"}, env) } -func TestThunderUnassignUsesDeleteEnrollmentTokenNode(t *testing.T) { - var deletePath string - var sawDelete bool - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - switch r.URL.Path { - case thunderEnrollmentTokenPath: - _ = json.NewEncoder(w).Encode(thunderEnrollmentTokenResponse{EnrollmentTokenID: "token-id", EnrollmentToken: "client-token", ZoneID: "zone-123", Role: thunderEnrollmentRoleClient, GPUType: "a100", GPUCount: 2}) - case fmt.Sprintf(thunderEnrollmentTokenNodePath, "token-id"): - sawDelete = true - deletePath = r.URL.Path - if r.Method != http.MethodDelete { - t.Fatalf("method = %s, want DELETE", r.Method) - } - if r.Header.Get("Authorization") != "Bearer central-token" { - t.Fatalf("authorization header = %q", r.Header.Get("Authorization")) - } - _ = json.NewEncoder(w).Encode(thunderDeleteEnrollmentTokenNodeResponse{EnrollmentTokenID: "token-id", Role: thunderEnrollmentRoleClient, ClientID: "client-id", NodeDeleted: true}) - default: - t.Fatalf("unexpected path %s", r.URL.Path) - } - })) - defer server.Close() - - manager := NewContainerThunderManager(server.URL, "central-token", server.Client()) - t.Setenv(thunderZoneIDEnv, "zone-123") - request := &types.ContainerRequest{ContainerId: "container-123", Gpu: "H100", GpuCount: 1, GpuVirtualized: true} - _, err := manager.AssignGPUDevices(request) - if err != nil { - t.Fatal(err) +func TestThunderAssignReturnsGatewayError(t *testing.T) { + manager := NewContainerThunderManager(&fakeThunderServiceClient{ + createResp: &pb.CreateClientEnrollmentResponse{ErrorMsg: "gateway refused enrollment"}, + }) + + _, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container-123", GpuVirtualized: true}) + if err == nil { + t.Fatal("expected Thunder enrollment error") } - manager.UnassignGPUDevices(request.ContainerId) + assert.Contains(t, err.Error(), "gateway refused enrollment") +} - if !sawDelete { - t.Fatal("delete enrollment-token node was not called") +func TestThunderAssignRequiresServiceClient(t *testing.T) { + manager := NewContainerThunderManager(nil) + _, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container-123", GpuVirtualized: true}) + if err == nil { + t.Fatal("expected missing Thunder client error") } - assert.Equal(t, fmt.Sprintf(thunderEnrollmentTokenNodePath, "token-id"), deletePath) + assert.Contains(t, err.Error(), "Thunder service client") } -func TestInstallThunderClientExecutesInstaller(t *testing.T) { - rt := &mockRuntime{name: "runc"} - manager := NewContainerThunderManager("https://worker-default.example", "worker-default-token", nil) - manager.allocations.Set("container-123", thunderAllocation{ - EnrollmentToken: "enroll-token", - APIURL: "https://worker-default.example", - APIToken: "worker-default-token", +func TestThunderAssignRequiresInstallCommand(t *testing.T) { + manager := NewContainerThunderManager(&fakeThunderServiceClient{ + createResp: &pb.CreateClientEnrollmentResponse{Ok: true}, }) + _, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container-123", GpuVirtualized: true}) + if err == nil { + t.Fatal("expected missing install command error") + } + assert.Contains(t, err.Error(), "install command") +} + +func TestThunderUnassignDeletesClientEnrollment(t *testing.T) { + client := &fakeThunderServiceClient{ + deleteResp: &pb.DeleteClientEnrollmentResponse{Ok: true}, + } + manager := NewContainerThunderManager(client) + manager.installCache.Set("container-123", "curl install thunder") + + manager.UnassignGPUDevices("container-123") + + if len(client.deleteReqs) != 1 || client.deleteReqs[0].ContainerId != "container-123" { + t.Fatalf("delete requests = %+v", client.deleteReqs) + } + _, ok := manager.installCache.Get("container-123") + assert.False(t, ok) +} + +func TestInstallThunderClientExecutesCachedInstaller(t *testing.T) { + rt := &mockRuntime{name: "runc"} + manager := NewContainerThunderManager(nil) + manager.installCache.Set("container-123", "curl -fsSL https://get.thundercompute.com/install.sh | sudo THUNDER_NOWARN=1 THUNDER_INSTALL_MODE=client THUNDER_CENTRAL_URL='https://gateway.example' THUNDER_ENROLLMENT_TOKEN='enroll-token' sh") instances := common.NewSafeMap[*ContainerInstance]() instances.Set("container-123", &ContainerInstance{ Runtime: rt, @@ -206,77 +194,49 @@ func TestInstallThunderClientExecutesInstaller(t *testing.T) { call := rt.execCalls[0] assert.Equal(t, "container-123", call.containerID) assert.Equal(t, "/workspace", call.proc.Cwd) - assert.Equal(t, []string{"sh", "-c", "curl -fsSL https://get.thundercompute.com/install.sh | sudo THUNDER_NOWARN=1 THUNDER_INSTALL_MODE=client THUNDER_CENTRAL_URL='https://worker-default.example' THUNDER_ENROLLMENT_TOKEN='enroll-token' sh"}, call.proc.Args) + assert.Equal(t, []string{"sh", "-c", "curl -fsSL https://get.thundercompute.com/install.sh | sudo THUNDER_NOWARN=1 THUNDER_INSTALL_MODE=client THUNDER_CENTRAL_URL='https://gateway.example' THUNDER_ENROLLMENT_TOKEN='enroll-token' sh"}, call.proc.Args) assert.Contains(t, call.proc.Env, "A=1") assert.Contains(t, call.proc.Env, "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin") } -func TestThunderAssignReturnsErrorOnUnsuccessfulStatus(t *testing.T) { - var attempts int32 - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - atomic.AddInt32(&attempts, 1) - w.WriteHeader(http.StatusInternalServerError) - })) - defer server.Close() - - manager := NewContainerThunderManager(server.URL, "central-token", server.Client()) - t.Setenv(thunderZoneIDEnv, "zone-123") - _, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container-123", GpuRequest: []string{"H100"}, GpuVirtualized: true}) - if err == nil { - t.Fatal("expected Thunder enrollment error") +func TestInstallThunderClientRequiresCachedInstaller(t *testing.T) { + worker := &Worker{ + containerThunderManager: NewContainerThunderManager(nil), + containerInstances: common.NewSafeMap[*ContainerInstance](), + } + err := worker.installThunderClient(context.Background(), &types.ContainerRequest{ContainerId: "container-123", GpuVirtualized: true}) + if err == nil || !strings.Contains(err.Error(), "install command") { + t.Fatalf("installThunderClient() error = %v", err) } - assert.Equal(t, int32(1), atomic.LoadInt32(&attempts)) } -func TestThunderAssignRequiresWorkerEnv(t *testing.T) { - manager := NewContainerThunderManager("", "", nil) - _, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container-123", Gpu: "A100", GpuVirtualized: true}) - if err == nil { - t.Fatal("expected missing Thunder configuration error") - } +type fakeThunderServiceClient struct { + createResp *pb.CreateClientEnrollmentResponse + createErr error + createReqs []*pb.CreateClientEnrollmentRequest + deleteResp *pb.DeleteClientEnrollmentResponse + deleteErr error + deleteReqs []*pb.DeleteClientEnrollmentRequest } -func TestThunderAssignRequiresZoneID(t *testing.T) { - manager := NewContainerThunderManager("https://thunder.example", "central-token", nil) - _, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container-123", Gpu: "A100", GpuVirtualized: true}) - if err == nil { - t.Fatal("expected missing Thunder zone id error") +func (f *fakeThunderServiceClient) CreateClientEnrollment(ctx context.Context, in *pb.CreateClientEnrollmentRequest, opts ...grpc.CallOption) (*pb.CreateClientEnrollmentResponse, error) { + f.createReqs = append(f.createReqs, in) + if f.createErr != nil { + return nil, f.createErr } + if f.createResp != nil { + return f.createResp, nil + } + return &pb.CreateClientEnrollmentResponse{Ok: true, InstallCommand: "curl install thunder"}, nil } -func TestThunderAssignUsesRequestScopedCredentials(t *testing.T) { - var authHeader string - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - authHeader = r.Header.Get("Authorization") - _ = json.NewEncoder(w).Encode(thunderEnrollmentTokenResponse{EnrollmentTokenID: "token-id", EnrollmentToken: "client-token", ZoneID: "zone-123", Role: thunderEnrollmentRoleClient, GPUType: "a100", GPUCount: 2}) - })) - defer server.Close() - - manager := NewContainerThunderManager("https://worker-default.example", "worker-default-token", server.Client()) - t.Setenv(thunderZoneIDEnv, "zone-worker") - request := &types.ContainerRequest{ - ContainerId: "container-123", - Gpu: "A100", - GpuCount: 1, - GpuVirtualized: true, - Env: []string{ - thunderAPIURLEnv + "=" + server.URL, - thunderAPITokenEnv + "=request-token", - thunderZoneIDEnv + "=zone-request", - }, +func (f *fakeThunderServiceClient) DeleteClientEnrollment(ctx context.Context, in *pb.DeleteClientEnrollmentRequest, opts ...grpc.CallOption) (*pb.DeleteClientEnrollmentResponse, error) { + f.deleteReqs = append(f.deleteReqs, in) + if f.deleteErr != nil { + return nil, f.deleteErr } - - _, err := manager.AssignGPUDevices(request) - if err != nil { - t.Fatal(err) + if f.deleteResp != nil { + return f.deleteResp, nil } - assert.Equal(t, "Bearer request-token", authHeader) - - allocation, ok := manager.allocations.Get(request.ContainerId) - assert.True(t, ok) - assert.Equal(t, server.URL, allocation.APIURL) - assert.Equal(t, "request-token", allocation.APIToken) - assert.Equal(t, "token-id", allocation.EnrollmentTokenID) - assert.Equal(t, "client-token", allocation.EnrollmentToken) - assert.Equal(t, "zone-123", allocation.Response.ZoneID) + return &pb.DeleteClientEnrollmentResponse{Ok: true}, nil } diff --git a/pkg/worker/worker.go b/pkg/worker/worker.go index abeaf876d..2121df9e4 100644 --- a/pkg/worker/worker.go +++ b/pkg/worker/worker.go @@ -265,6 +265,11 @@ func NewWorker() (_ *Worker, err error) { return nil, err } + thunderClient, err := NewThunderServiceClient(context.TODO(), config, workerToken) + if err != nil { + return nil, err + } + eventRepo := repo.NewWorkerEventClientRepo(config, workerRepoClient, workerId) poolConfig, poolFound := config.Worker.Pools[workerPoolName] @@ -420,7 +425,7 @@ func NewWorker() (_ *Worker, err error) { storageManager: storageManager, fileCacheManager: fileCacheManager, containerGPUManager: NewContainerNvidiaManager(uint32(gpuCount), defaultRuntime.Name()), - containerThunderManager: NewContainerThunderManagerFromEnv(), + containerThunderManager: NewContainerThunderManager(thunderClient), thunderSetupTracker: thunderSetupTracker, containerNetworkManager: containerNetworkManager, containerMountManager: NewContainerMountManager(config, poolConfig), diff --git a/proto/gateway.pb.go b/proto/gateway.pb.go index ae0f1b612..cf6181123 100644 --- a/proto/gateway.pb.go +++ b/proto/gateway.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.36.11 // protoc v3.21.12 // source: gateway.proto @@ -13,6 +13,7 @@ import ( timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -72,18 +73,16 @@ func (SyncContainerWorkspaceOperation) EnumDescriptor() ([]byte, []int) { } type AuthorizeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AuthorizeRequest) Reset() { *x = AuthorizeRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthorizeRequest) String() string { @@ -94,7 +93,7 @@ func (*AuthorizeRequest) ProtoMessage() {} func (x *AuthorizeRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -110,23 +109,20 @@ func (*AuthorizeRequest) Descriptor() ([]byte, []int) { } type AuthorizeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + WorkspaceId string `protobuf:"bytes,2,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` + NewToken string `protobuf:"bytes,3,opt,name=new_token,json=newToken,proto3" json:"new_token,omitempty"` + ErrorMsg string `protobuf:"bytes,4,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - WorkspaceId string `protobuf:"bytes,2,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` - NewToken string `protobuf:"bytes,3,opt,name=new_token,json=newToken,proto3" json:"new_token,omitempty"` - ErrorMsg string `protobuf:"bytes,4,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AuthorizeResponse) Reset() { *x = AuthorizeResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AuthorizeResponse) String() string { @@ -137,7 +133,7 @@ func (*AuthorizeResponse) ProtoMessage() {} func (x *AuthorizeResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -181,20 +177,17 @@ func (x *AuthorizeResponse) GetErrorMsg() string { } type SignPayloadRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` unknownFields protoimpl.UnknownFields - - Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SignPayloadRequest) Reset() { *x = SignPayloadRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SignPayloadRequest) String() string { @@ -205,7 +198,7 @@ func (*SignPayloadRequest) ProtoMessage() {} func (x *SignPayloadRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -228,23 +221,20 @@ func (x *SignPayloadRequest) GetPayload() []byte { } type SignPayloadResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + Signature string `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + ErrorMsg string `protobuf:"bytes,4,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - Signature string `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` - Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - ErrorMsg string `protobuf:"bytes,4,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SignPayloadResponse) Reset() { *x = SignPayloadResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SignPayloadResponse) String() string { @@ -255,7 +245,7 @@ func (*SignPayloadResponse) ProtoMessage() {} func (x *SignPayloadResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -299,21 +289,18 @@ func (x *SignPayloadResponse) GetErrorMsg() string { } type ObjectMetadata struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Size int64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Size int64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ObjectMetadata) Reset() { *x = ObjectMetadata{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ObjectMetadata) String() string { @@ -324,7 +311,7 @@ func (*ObjectMetadata) ProtoMessage() {} func (x *ObjectMetadata) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -354,21 +341,18 @@ func (x *ObjectMetadata) GetSize() int64 { } type HeadObjectRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` - SupportsPutHeaders bool `protobuf:"varint,2,opt,name=supports_put_headers,json=supportsPutHeaders,proto3" json:"supports_put_headers,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + SupportsPutHeaders bool `protobuf:"varint,2,opt,name=supports_put_headers,json=supportsPutHeaders,proto3" json:"supports_put_headers,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *HeadObjectRequest) Reset() { *x = HeadObjectRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *HeadObjectRequest) String() string { @@ -379,7 +363,7 @@ func (*HeadObjectRequest) ProtoMessage() {} func (x *HeadObjectRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -409,25 +393,22 @@ func (x *HeadObjectRequest) GetSupportsPutHeaders() bool { } type HeadObjectResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - Exists bool `protobuf:"varint,2,opt,name=exists,proto3" json:"exists,omitempty"` - ObjectId string `protobuf:"bytes,3,opt,name=object_id,json=objectId,proto3" json:"object_id,omitempty"` - ObjectMetadata *ObjectMetadata `protobuf:"bytes,4,opt,name=object_metadata,json=objectMetadata,proto3" json:"object_metadata,omitempty"` - ErrorMsg string `protobuf:"bytes,5,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` - UseWorkspaceStorage bool `protobuf:"varint,6,opt,name=use_workspace_storage,json=useWorkspaceStorage,proto3" json:"use_workspace_storage,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + Exists bool `protobuf:"varint,2,opt,name=exists,proto3" json:"exists,omitempty"` + ObjectId string `protobuf:"bytes,3,opt,name=object_id,json=objectId,proto3" json:"object_id,omitempty"` + ObjectMetadata *ObjectMetadata `protobuf:"bytes,4,opt,name=object_metadata,json=objectMetadata,proto3" json:"object_metadata,omitempty"` + ErrorMsg string `protobuf:"bytes,5,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` + UseWorkspaceStorage bool `protobuf:"varint,6,opt,name=use_workspace_storage,json=useWorkspaceStorage,proto3" json:"use_workspace_storage,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *HeadObjectResponse) Reset() { *x = HeadObjectResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *HeadObjectResponse) String() string { @@ -438,7 +419,7 @@ func (*HeadObjectResponse) ProtoMessage() {} func (x *HeadObjectResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -496,24 +477,21 @@ func (x *HeadObjectResponse) GetUseWorkspaceStorage() bool { } type CreateObjectRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ObjectMetadata *ObjectMetadata `protobuf:"bytes,1,opt,name=object_metadata,json=objectMetadata,proto3" json:"object_metadata,omitempty"` - Hash string `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"` - Size int64 `protobuf:"varint,3,opt,name=size,proto3" json:"size,omitempty"` - Overwrite bool `protobuf:"varint,4,opt,name=overwrite,proto3" json:"overwrite,omitempty"` - SupportsPutHeaders bool `protobuf:"varint,5,opt,name=supports_put_headers,json=supportsPutHeaders,proto3" json:"supports_put_headers,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + ObjectMetadata *ObjectMetadata `protobuf:"bytes,1,opt,name=object_metadata,json=objectMetadata,proto3" json:"object_metadata,omitempty"` + Hash string `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"` + Size int64 `protobuf:"varint,3,opt,name=size,proto3" json:"size,omitempty"` + Overwrite bool `protobuf:"varint,4,opt,name=overwrite,proto3" json:"overwrite,omitempty"` + SupportsPutHeaders bool `protobuf:"varint,5,opt,name=supports_put_headers,json=supportsPutHeaders,proto3" json:"supports_put_headers,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CreateObjectRequest) Reset() { *x = CreateObjectRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateObjectRequest) String() string { @@ -524,7 +502,7 @@ func (*CreateObjectRequest) ProtoMessage() {} func (x *CreateObjectRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -575,24 +553,21 @@ func (x *CreateObjectRequest) GetSupportsPutHeaders() bool { } type CreateObjectResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ObjectId string `protobuf:"bytes,2,opt,name=object_id,json=objectId,proto3" json:"object_id,omitempty"` + PresignedUrl string `protobuf:"bytes,3,opt,name=presigned_url,json=presignedUrl,proto3" json:"presigned_url,omitempty"` + ErrorMsg string `protobuf:"bytes,4,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` + PutHeaders map[string]string `protobuf:"bytes,5,rep,name=put_headers,json=putHeaders,proto3" json:"put_headers,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ObjectId string `protobuf:"bytes,2,opt,name=object_id,json=objectId,proto3" json:"object_id,omitempty"` - PresignedUrl string `protobuf:"bytes,3,opt,name=presigned_url,json=presignedUrl,proto3" json:"presigned_url,omitempty"` - ErrorMsg string `protobuf:"bytes,4,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` - PutHeaders map[string]string `protobuf:"bytes,5,rep,name=put_headers,json=putHeaders,proto3" json:"put_headers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + sizeCache protoimpl.SizeCache } func (x *CreateObjectResponse) Reset() { *x = CreateObjectResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateObjectResponse) String() string { @@ -603,7 +578,7 @@ func (*CreateObjectResponse) ProtoMessage() {} func (x *CreateObjectResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -654,23 +629,20 @@ func (x *CreateObjectResponse) GetPutHeaders() map[string]string { } type PutObjectRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ObjectContent []byte `protobuf:"bytes,1,opt,name=object_content,json=objectContent,proto3" json:"object_content,omitempty"` - ObjectMetadata *ObjectMetadata `protobuf:"bytes,2,opt,name=object_metadata,json=objectMetadata,proto3" json:"object_metadata,omitempty"` - Hash string `protobuf:"bytes,3,opt,name=hash,proto3" json:"hash,omitempty"` - Overwrite bool `protobuf:"varint,4,opt,name=overwrite,proto3" json:"overwrite,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + ObjectContent []byte `protobuf:"bytes,1,opt,name=object_content,json=objectContent,proto3" json:"object_content,omitempty"` + ObjectMetadata *ObjectMetadata `protobuf:"bytes,2,opt,name=object_metadata,json=objectMetadata,proto3" json:"object_metadata,omitempty"` + Hash string `protobuf:"bytes,3,opt,name=hash,proto3" json:"hash,omitempty"` + Overwrite bool `protobuf:"varint,4,opt,name=overwrite,proto3" json:"overwrite,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PutObjectRequest) Reset() { *x = PutObjectRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PutObjectRequest) String() string { @@ -681,7 +653,7 @@ func (*PutObjectRequest) ProtoMessage() {} func (x *PutObjectRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -725,22 +697,19 @@ func (x *PutObjectRequest) GetOverwrite() bool { } type PutObjectResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ObjectId string `protobuf:"bytes,2,opt,name=object_id,json=objectId,proto3" json:"object_id,omitempty"` + ErrorMsg string `protobuf:"bytes,3,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ObjectId string `protobuf:"bytes,2,opt,name=object_id,json=objectId,proto3" json:"object_id,omitempty"` - ErrorMsg string `protobuf:"bytes,3,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *PutObjectResponse) Reset() { *x = PutObjectResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PutObjectResponse) String() string { @@ -751,7 +720,7 @@ func (*PutObjectResponse) ProtoMessage() {} func (x *PutObjectResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -788,25 +757,22 @@ func (x *PutObjectResponse) GetErrorMsg() string { } type SyncContainerWorkspaceRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ContainerId string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + NewPath string `protobuf:"bytes,3,opt,name=new_path,json=newPath,proto3" json:"new_path,omitempty"` + IsDir bool `protobuf:"varint,4,opt,name=is_dir,json=isDir,proto3" json:"is_dir,omitempty"` + Data []byte `protobuf:"bytes,5,opt,name=data,proto3" json:"data,omitempty"` + Op SyncContainerWorkspaceOperation `protobuf:"varint,6,opt,name=op,proto3,enum=gateway.SyncContainerWorkspaceOperation" json:"op,omitempty"` unknownFields protoimpl.UnknownFields - - ContainerId string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` - Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` - NewPath string `protobuf:"bytes,3,opt,name=new_path,json=newPath,proto3" json:"new_path,omitempty"` - IsDir bool `protobuf:"varint,4,opt,name=is_dir,json=isDir,proto3" json:"is_dir,omitempty"` - Data []byte `protobuf:"bytes,5,opt,name=data,proto3" json:"data,omitempty"` - Op SyncContainerWorkspaceOperation `protobuf:"varint,6,opt,name=op,proto3,enum=gateway.SyncContainerWorkspaceOperation" json:"op,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SyncContainerWorkspaceRequest) Reset() { *x = SyncContainerWorkspaceRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SyncContainerWorkspaceRequest) String() string { @@ -817,7 +783,7 @@ func (*SyncContainerWorkspaceRequest) ProtoMessage() {} func (x *SyncContainerWorkspaceRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -875,20 +841,17 @@ func (x *SyncContainerWorkspaceRequest) GetOp() SyncContainerWorkspaceOperation } type SyncContainerWorkspaceResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SyncContainerWorkspaceResponse) Reset() { *x = SyncContainerWorkspaceResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SyncContainerWorkspaceResponse) String() string { @@ -899,7 +862,7 @@ func (*SyncContainerWorkspaceResponse) ProtoMessage() {} func (x *SyncContainerWorkspaceResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -922,18 +885,16 @@ func (x *SyncContainerWorkspaceResponse) GetOk() bool { } type ListContainersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListContainersRequest) Reset() { *x = ListContainersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListContainersRequest) String() string { @@ -944,7 +905,7 @@ func (*ListContainersRequest) ProtoMessage() {} func (x *ListContainersRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -960,22 +921,19 @@ func (*ListContainersRequest) Descriptor() ([]byte, []int) { } type ListContainersResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Containers []*Container `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` + Ok bool `protobuf:"varint,2,opt,name=ok,proto3" json:"ok,omitempty"` + ErrorMsg string `protobuf:"bytes,3,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Containers []*Container `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` - Ok bool `protobuf:"varint,2,opt,name=ok,proto3" json:"ok,omitempty"` - ErrorMsg string `protobuf:"bytes,3,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListContainersResponse) Reset() { *x = ListContainersResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListContainersResponse) String() string { @@ -986,7 +944,7 @@ func (*ListContainersResponse) ProtoMessage() {} func (x *ListContainersResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1023,20 +981,17 @@ func (x *ListContainersResponse) GetErrorMsg() string { } type StopContainerRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ContainerId string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` unknownFields protoimpl.UnknownFields - - ContainerId string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *StopContainerRequest) Reset() { *x = StopContainerRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StopContainerRequest) String() string { @@ -1047,7 +1002,7 @@ func (*StopContainerRequest) ProtoMessage() {} func (x *StopContainerRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1070,21 +1025,18 @@ func (x *StopContainerRequest) GetContainerId() string { } type StopContainerResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrorMsg string `protobuf:"bytes,2,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrorMsg string `protobuf:"bytes,2,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *StopContainerResponse) Reset() { *x = StopContainerResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StopContainerResponse) String() string { @@ -1095,7 +1047,7 @@ func (*StopContainerResponse) ProtoMessage() {} func (x *StopContainerResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1125,20 +1077,17 @@ func (x *StopContainerResponse) GetErrorMsg() string { } type CheckpointContainerRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ContainerId string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` unknownFields protoimpl.UnknownFields - - ContainerId string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CheckpointContainerRequest) Reset() { *x = CheckpointContainerRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CheckpointContainerRequest) String() string { @@ -1149,7 +1098,7 @@ func (*CheckpointContainerRequest) ProtoMessage() {} func (x *CheckpointContainerRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1172,22 +1121,19 @@ func (x *CheckpointContainerRequest) GetContainerId() string { } type CheckpointContainerResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + CheckpointId string `protobuf:"bytes,2,opt,name=checkpoint_id,json=checkpointId,proto3" json:"checkpoint_id,omitempty"` + ErrorMsg string `protobuf:"bytes,3,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - CheckpointId string `protobuf:"bytes,2,opt,name=checkpoint_id,json=checkpointId,proto3" json:"checkpoint_id,omitempty"` - ErrorMsg string `protobuf:"bytes,3,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CheckpointContainerResponse) Reset() { *x = CheckpointContainerResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CheckpointContainerResponse) String() string { @@ -1198,7 +1144,7 @@ func (*CheckpointContainerResponse) ProtoMessage() {} func (x *CheckpointContainerResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1235,24 +1181,21 @@ func (x *CheckpointContainerResponse) GetErrorMsg() string { } type ContainerStreamMessage struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Payload: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Payload: // // *ContainerStreamMessage_AttachRequest // *ContainerStreamMessage_SyncContainerWorkspace - Payload isContainerStreamMessage_Payload `protobuf_oneof:"payload"` + Payload isContainerStreamMessage_Payload `protobuf_oneof:"payload"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ContainerStreamMessage) Reset() { *x = ContainerStreamMessage{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ContainerStreamMessage) String() string { @@ -1263,7 +1206,7 @@ func (*ContainerStreamMessage) ProtoMessage() {} func (x *ContainerStreamMessage) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1278,23 +1221,27 @@ func (*ContainerStreamMessage) Descriptor() ([]byte, []int) { return file_gateway_proto_rawDescGZIP(), []int{19} } -func (m *ContainerStreamMessage) GetPayload() isContainerStreamMessage_Payload { - if m != nil { - return m.Payload +func (x *ContainerStreamMessage) GetPayload() isContainerStreamMessage_Payload { + if x != nil { + return x.Payload } return nil } func (x *ContainerStreamMessage) GetAttachRequest() *AttachToContainerRequest { - if x, ok := x.GetPayload().(*ContainerStreamMessage_AttachRequest); ok { - return x.AttachRequest + if x != nil { + if x, ok := x.Payload.(*ContainerStreamMessage_AttachRequest); ok { + return x.AttachRequest + } } return nil } func (x *ContainerStreamMessage) GetSyncContainerWorkspace() *SyncContainerWorkspaceRequest { - if x, ok := x.GetPayload().(*ContainerStreamMessage_SyncContainerWorkspace); ok { - return x.SyncContainerWorkspace + if x != nil { + if x, ok := x.Payload.(*ContainerStreamMessage_SyncContainerWorkspace); ok { + return x.SyncContainerWorkspace + } } return nil } @@ -1316,20 +1263,17 @@ func (*ContainerStreamMessage_AttachRequest) isContainerStreamMessage_Payload() func (*ContainerStreamMessage_SyncContainerWorkspace) isContainerStreamMessage_Payload() {} type AttachToContainerRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ContainerId string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` unknownFields protoimpl.UnknownFields - - ContainerId string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AttachToContainerRequest) Reset() { *x = AttachToContainerRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AttachToContainerRequest) String() string { @@ -1340,7 +1284,7 @@ func (*AttachToContainerRequest) ProtoMessage() {} func (x *AttachToContainerRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1363,22 +1307,19 @@ func (x *AttachToContainerRequest) GetContainerId() string { } type AttachToContainerResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Output string `protobuf:"bytes,1,opt,name=output,proto3" json:"output,omitempty"` + Done bool `protobuf:"varint,2,opt,name=done,proto3" json:"done,omitempty"` + ExitCode int32 `protobuf:"varint,3,opt,name=exit_code,json=exitCode,proto3" json:"exit_code,omitempty"` unknownFields protoimpl.UnknownFields - - Output string `protobuf:"bytes,1,opt,name=output,proto3" json:"output,omitempty"` - Done bool `protobuf:"varint,2,opt,name=done,proto3" json:"done,omitempty"` - ExitCode int32 `protobuf:"varint,3,opt,name=exit_code,json=exitCode,proto3" json:"exit_code,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AttachToContainerResponse) Reset() { *x = AttachToContainerResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AttachToContainerResponse) String() string { @@ -1389,7 +1330,7 @@ func (*AttachToContainerResponse) ProtoMessage() {} func (x *AttachToContainerResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1427,21 +1368,18 @@ func (x *AttachToContainerResponse) GetExitCode() int32 { // Task messages type StartTaskRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + TaskId string `protobuf:"bytes,1,opt,name=task_id,json=taskId,proto3" json:"task_id,omitempty"` + ContainerId string `protobuf:"bytes,2,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` unknownFields protoimpl.UnknownFields - - TaskId string `protobuf:"bytes,1,opt,name=task_id,json=taskId,proto3" json:"task_id,omitempty"` - ContainerId string `protobuf:"bytes,2,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *StartTaskRequest) Reset() { *x = StartTaskRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StartTaskRequest) String() string { @@ -1452,7 +1390,7 @@ func (*StartTaskRequest) ProtoMessage() {} func (x *StartTaskRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[22] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1482,20 +1420,17 @@ func (x *StartTaskRequest) GetContainerId() string { } type StartTaskResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + sizeCache protoimpl.SizeCache } func (x *StartTaskResponse) Reset() { *x = StartTaskResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StartTaskResponse) String() string { @@ -1506,7 +1441,7 @@ func (*StartTaskResponse) ProtoMessage() {} func (x *StartTaskResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1529,26 +1464,23 @@ func (x *StartTaskResponse) GetOk() bool { } type EndTaskRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TaskId string `protobuf:"bytes,1,opt,name=task_id,json=taskId,proto3" json:"task_id,omitempty"` - TaskDuration float32 `protobuf:"fixed32,2,opt,name=task_duration,json=taskDuration,proto3" json:"task_duration,omitempty"` - TaskStatus string `protobuf:"bytes,3,opt,name=task_status,json=taskStatus,proto3" json:"task_status,omitempty"` - ContainerId string `protobuf:"bytes,4,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` - ContainerHostname string `protobuf:"bytes,5,opt,name=container_hostname,json=containerHostname,proto3" json:"container_hostname,omitempty"` - KeepWarmSeconds float32 `protobuf:"fixed32,6,opt,name=keep_warm_seconds,json=keepWarmSeconds,proto3" json:"keep_warm_seconds,omitempty"` - Result []byte `protobuf:"bytes,7,opt,name=result,proto3" json:"result,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + TaskId string `protobuf:"bytes,1,opt,name=task_id,json=taskId,proto3" json:"task_id,omitempty"` + TaskDuration float32 `protobuf:"fixed32,2,opt,name=task_duration,json=taskDuration,proto3" json:"task_duration,omitempty"` + TaskStatus string `protobuf:"bytes,3,opt,name=task_status,json=taskStatus,proto3" json:"task_status,omitempty"` + ContainerId string `protobuf:"bytes,4,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + ContainerHostname string `protobuf:"bytes,5,opt,name=container_hostname,json=containerHostname,proto3" json:"container_hostname,omitempty"` + KeepWarmSeconds float32 `protobuf:"fixed32,6,opt,name=keep_warm_seconds,json=keepWarmSeconds,proto3" json:"keep_warm_seconds,omitempty"` + Result []byte `protobuf:"bytes,7,opt,name=result,proto3" json:"result,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *EndTaskRequest) Reset() { *x = EndTaskRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *EndTaskRequest) String() string { @@ -1559,7 +1491,7 @@ func (*EndTaskRequest) ProtoMessage() {} func (x *EndTaskRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[24] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1624,20 +1556,17 @@ func (x *EndTaskRequest) GetResult() []byte { } type EndTaskResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + sizeCache protoimpl.SizeCache } func (x *EndTaskResponse) Reset() { *x = EndTaskResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *EndTaskResponse) String() string { @@ -1648,7 +1577,7 @@ func (*EndTaskResponse) ProtoMessage() {} func (x *EndTaskResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[25] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1671,20 +1600,17 @@ func (x *EndTaskResponse) GetOk() bool { } type StringList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Values []string `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"` unknownFields protoimpl.UnknownFields - - Values []string `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"` + sizeCache protoimpl.SizeCache } func (x *StringList) Reset() { *x = StringList{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StringList) String() string { @@ -1695,7 +1621,7 @@ func (*StringList) ProtoMessage() {} func (x *StringList) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[26] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1718,21 +1644,18 @@ func (x *StringList) GetValues() []string { } type ListTasksRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Filters map[string]*StringList `protobuf:"bytes,1,rep,name=filters,proto3" json:"filters,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` unknownFields protoimpl.UnknownFields - - Filters map[string]*StringList `protobuf:"bytes,1,rep,name=filters,proto3" json:"filters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListTasksRequest) Reset() { *x = ListTasksRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListTasksRequest) String() string { @@ -1743,7 +1666,7 @@ func (*ListTasksRequest) ProtoMessage() {} func (x *ListTasksRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[27] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1773,10 +1696,7 @@ func (x *ListTasksRequest) GetLimit() uint32 { } type Task struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` ContainerId string `protobuf:"bytes,4,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` @@ -1788,15 +1708,15 @@ type Task struct { WorkspaceName string `protobuf:"bytes,10,opt,name=workspace_name,json=workspaceName,proto3" json:"workspace_name,omitempty"` CreatedAt *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Task) Reset() { *x = Task{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Task) String() string { @@ -1807,7 +1727,7 @@ func (*Task) ProtoMessage() {} func (x *Task) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[28] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1900,23 +1820,20 @@ func (x *Task) GetUpdatedAt() *timestamppb.Timestamp { } type ListTasksResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Tasks []*Task `protobuf:"bytes,3,rep,name=tasks,proto3" json:"tasks,omitempty"` + Total int32 `protobuf:"varint,4,opt,name=total,proto3" json:"total,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Tasks []*Task `protobuf:"bytes,3,rep,name=tasks,proto3" json:"tasks,omitempty"` - Total int32 `protobuf:"varint,4,opt,name=total,proto3" json:"total,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListTasksResponse) Reset() { *x = ListTasksResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListTasksResponse) String() string { @@ -1927,7 +1844,7 @@ func (*ListTasksResponse) ProtoMessage() {} func (x *ListTasksResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[29] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1971,20 +1888,17 @@ func (x *ListTasksResponse) GetTotal() int32 { } type StopTasksRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + TaskIds []string `protobuf:"bytes,1,rep,name=task_ids,json=taskIds,proto3" json:"task_ids,omitempty"` unknownFields protoimpl.UnknownFields - - TaskIds []string `protobuf:"bytes,1,rep,name=task_ids,json=taskIds,proto3" json:"task_ids,omitempty"` + sizeCache protoimpl.SizeCache } func (x *StopTasksRequest) Reset() { *x = StopTasksRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[30] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StopTasksRequest) String() string { @@ -1995,7 +1909,7 @@ func (*StopTasksRequest) ProtoMessage() {} func (x *StopTasksRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[30] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2018,21 +1932,18 @@ func (x *StopTasksRequest) GetTaskIds() []string { } type StopTasksResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *StopTasksResponse) Reset() { *x = StopTasksResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[31] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StopTasksResponse) String() string { @@ -2043,7 +1954,7 @@ func (*StopTasksResponse) ProtoMessage() {} func (x *StopTasksResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[31] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2073,22 +1984,19 @@ func (x *StopTasksResponse) GetErrMsg() string { } type Volume struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + MountPath string `protobuf:"bytes,2,opt,name=mount_path,json=mountPath,proto3" json:"mount_path,omitempty"` + Config *MountPointConfig `protobuf:"bytes,3,opt,name=config,proto3,oneof" json:"config,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - MountPath string `protobuf:"bytes,2,opt,name=mount_path,json=mountPath,proto3" json:"mount_path,omitempty"` - Config *MountPointConfig `protobuf:"bytes,3,opt,name=config,proto3,oneof" json:"config,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Volume) Reset() { *x = Volume{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Volume) String() string { @@ -2099,7 +2007,7 @@ func (*Volume) ProtoMessage() {} func (x *Volume) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[32] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2136,20 +2044,17 @@ func (x *Volume) GetConfig() *MountPointConfig { } type SecretVar struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SecretVar) Reset() { *x = SecretVar{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[33] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SecretVar) String() string { @@ -2160,7 +2065,7 @@ func (*SecretVar) ProtoMessage() {} func (x *SecretVar) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[33] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2183,23 +2088,20 @@ func (x *SecretVar) GetName() string { } type Autoscaler struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - MaxContainers uint32 `protobuf:"varint,2,opt,name=max_containers,json=maxContainers,proto3" json:"max_containers,omitempty"` - TasksPerContainer uint32 `protobuf:"varint,3,opt,name=tasks_per_container,json=tasksPerContainer,proto3" json:"tasks_per_container,omitempty"` - MinContainers uint32 `protobuf:"varint,4,opt,name=min_containers,json=minContainers,proto3" json:"min_containers,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + MaxContainers uint32 `protobuf:"varint,2,opt,name=max_containers,json=maxContainers,proto3" json:"max_containers,omitempty"` + TasksPerContainer uint32 `protobuf:"varint,3,opt,name=tasks_per_container,json=tasksPerContainer,proto3" json:"tasks_per_container,omitempty"` + MinContainers uint32 `protobuf:"varint,4,opt,name=min_containers,json=minContainers,proto3" json:"min_containers,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Autoscaler) Reset() { *x = Autoscaler{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Autoscaler) String() string { @@ -2210,7 +2112,7 @@ func (*Autoscaler) ProtoMessage() {} func (x *Autoscaler) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[34] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2254,26 +2156,23 @@ func (x *Autoscaler) GetMinContainers() uint32 { } type LLMConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ModelId string `protobuf:"bytes,1,opt,name=model_id,json=modelId,proto3" json:"model_id,omitempty"` - Engine string `protobuf:"bytes,2,opt,name=engine,proto3" json:"engine,omitempty"` - ServedModelName string `protobuf:"bytes,3,opt,name=served_model_name,json=servedModelName,proto3" json:"served_model_name,omitempty"` - ContextLength int64 `protobuf:"varint,4,opt,name=context_length,json=contextLength,proto3" json:"context_length,omitempty"` - Tokenizer string `protobuf:"bytes,5,opt,name=tokenizer,proto3" json:"tokenizer,omitempty"` - MetricsPath string `protobuf:"bytes,6,opt,name=metrics_path,json=metricsPath,proto3" json:"metrics_path,omitempty"` - SloTier string `protobuf:"bytes,7,opt,name=slo_tier,json=sloTier,proto3" json:"slo_tier,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + ModelId string `protobuf:"bytes,1,opt,name=model_id,json=modelId,proto3" json:"model_id,omitempty"` + Engine string `protobuf:"bytes,2,opt,name=engine,proto3" json:"engine,omitempty"` + ServedModelName string `protobuf:"bytes,3,opt,name=served_model_name,json=servedModelName,proto3" json:"served_model_name,omitempty"` + ContextLength int64 `protobuf:"varint,4,opt,name=context_length,json=contextLength,proto3" json:"context_length,omitempty"` + Tokenizer string `protobuf:"bytes,5,opt,name=tokenizer,proto3" json:"tokenizer,omitempty"` + MetricsPath string `protobuf:"bytes,6,opt,name=metrics_path,json=metricsPath,proto3" json:"metrics_path,omitempty"` + SloTier string `protobuf:"bytes,7,opt,name=slo_tier,json=sloTier,proto3" json:"slo_tier,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LLMConfig) Reset() { *x = LLMConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[35] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LLMConfig) String() string { @@ -2284,7 +2183,7 @@ func (*LLMConfig) ProtoMessage() {} func (x *LLMConfig) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[35] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2349,29 +2248,26 @@ func (x *LLMConfig) GetSloTier() string { } type DatabaseServingConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` - Port uint32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` - ReadinessProbe string `protobuf:"bytes,3,opt,name=readiness_probe,json=readinessProbe,proto3" json:"readiness_probe,omitempty"` - ConnectionEnvName string `protobuf:"bytes,4,opt,name=connection_env_name,json=connectionEnvName,proto3" json:"connection_env_name,omitempty"` - CredentialSecretNames []string `protobuf:"bytes,5,rep,name=credential_secret_names,json=credentialSecretNames,proto3" json:"credential_secret_names,omitempty"` - DurabilityMode string `protobuf:"bytes,6,opt,name=durability_mode,json=durabilityMode,proto3" json:"durability_mode,omitempty"` - UsernameSecretName string `protobuf:"bytes,7,opt,name=username_secret_name,json=usernameSecretName,proto3" json:"username_secret_name,omitempty"` - PasswordSecretName string `protobuf:"bytes,8,opt,name=password_secret_name,json=passwordSecretName,proto3" json:"password_secret_name,omitempty"` - DatabaseSecretName string `protobuf:"bytes,9,opt,name=database_secret_name,json=databaseSecretName,proto3" json:"database_secret_name,omitempty"` - ConnectionUrlSecretName string `protobuf:"bytes,10,opt,name=connection_url_secret_name,json=connectionUrlSecretName,proto3" json:"connection_url_secret_name,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` + Port uint32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` + ReadinessProbe string `protobuf:"bytes,3,opt,name=readiness_probe,json=readinessProbe,proto3" json:"readiness_probe,omitempty"` + ConnectionEnvName string `protobuf:"bytes,4,opt,name=connection_env_name,json=connectionEnvName,proto3" json:"connection_env_name,omitempty"` + CredentialSecretNames []string `protobuf:"bytes,5,rep,name=credential_secret_names,json=credentialSecretNames,proto3" json:"credential_secret_names,omitempty"` + DurabilityMode string `protobuf:"bytes,6,opt,name=durability_mode,json=durabilityMode,proto3" json:"durability_mode,omitempty"` + UsernameSecretName string `protobuf:"bytes,7,opt,name=username_secret_name,json=usernameSecretName,proto3" json:"username_secret_name,omitempty"` + PasswordSecretName string `protobuf:"bytes,8,opt,name=password_secret_name,json=passwordSecretName,proto3" json:"password_secret_name,omitempty"` + DatabaseSecretName string `protobuf:"bytes,9,opt,name=database_secret_name,json=databaseSecretName,proto3" json:"database_secret_name,omitempty"` + ConnectionUrlSecretName string `protobuf:"bytes,10,opt,name=connection_url_secret_name,json=connectionUrlSecretName,proto3" json:"connection_url_secret_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DatabaseServingConfig) Reset() { *x = DatabaseServingConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[36] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DatabaseServingConfig) String() string { @@ -2382,7 +2278,7 @@ func (*DatabaseServingConfig) ProtoMessage() {} func (x *DatabaseServingConfig) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[36] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2468,23 +2364,20 @@ func (x *DatabaseServingConfig) GetConnectionUrlSecretName() string { } type ServingConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` AppKind string `protobuf:"bytes,1,opt,name=app_kind,json=appKind,proto3" json:"app_kind,omitempty"` ServingProtocol string `protobuf:"bytes,2,opt,name=serving_protocol,json=servingProtocol,proto3" json:"serving_protocol,omitempty"` Llm *LLMConfig `protobuf:"bytes,3,opt,name=llm,proto3" json:"llm,omitempty"` Database *DatabaseServingConfig `protobuf:"bytes,4,opt,name=database,proto3" json:"database,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServingConfig) Reset() { *x = ServingConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[37] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ServingConfig) String() string { @@ -2495,7 +2388,7 @@ func (*ServingConfig) ProtoMessage() {} func (x *ServingConfig) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[37] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2539,25 +2432,22 @@ func (x *ServingConfig) GetDatabase() *DatabaseServingConfig { } type DurableDisk struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Size string `protobuf:"bytes,2,opt,name=size,proto3" json:"size,omitempty"` + MountPath string `protobuf:"bytes,3,opt,name=mount_path,json=mountPath,proto3" json:"mount_path,omitempty"` + Filesystem string `protobuf:"bytes,4,opt,name=filesystem,proto3" json:"filesystem,omitempty"` + Driver string `protobuf:"bytes,5,opt,name=driver,proto3" json:"driver,omitempty"` + ReadOnly bool `protobuf:"varint,6,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Size string `protobuf:"bytes,2,opt,name=size,proto3" json:"size,omitempty"` - MountPath string `protobuf:"bytes,3,opt,name=mount_path,json=mountPath,proto3" json:"mount_path,omitempty"` - Filesystem string `protobuf:"bytes,4,opt,name=filesystem,proto3" json:"filesystem,omitempty"` - Driver string `protobuf:"bytes,5,opt,name=driver,proto3" json:"driver,omitempty"` - ReadOnly bool `protobuf:"varint,6,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DurableDisk) Reset() { *x = DurableDisk{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[38] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DurableDisk) String() string { @@ -2568,7 +2458,7 @@ func (*DurableDisk) ProtoMessage() {} func (x *DurableDisk) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[38] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2626,22 +2516,19 @@ func (x *DurableDisk) GetReadOnly() bool { } type TaskPolicy struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timeout int64 `protobuf:"varint,1,opt,name=timeout,proto3" json:"timeout,omitempty"` + MaxRetries uint32 `protobuf:"varint,2,opt,name=max_retries,json=maxRetries,proto3" json:"max_retries,omitempty"` + Ttl uint32 `protobuf:"varint,3,opt,name=ttl,proto3" json:"ttl,omitempty"` unknownFields protoimpl.UnknownFields - - Timeout int64 `protobuf:"varint,1,opt,name=timeout,proto3" json:"timeout,omitempty"` - MaxRetries uint32 `protobuf:"varint,2,opt,name=max_retries,json=maxRetries,proto3" json:"max_retries,omitempty"` - Ttl uint32 `protobuf:"varint,3,opt,name=ttl,proto3" json:"ttl,omitempty"` + sizeCache protoimpl.SizeCache } func (x *TaskPolicy) Reset() { *x = TaskPolicy{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[39] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *TaskPolicy) String() string { @@ -2652,7 +2539,7 @@ func (*TaskPolicy) ProtoMessage() {} func (x *TaskPolicy) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[39] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2689,20 +2576,17 @@ func (x *TaskPolicy) GetTtl() uint32 { } type Schema struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Fields map[string]*SchemaField `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` unknownFields protoimpl.UnknownFields - - Fields map[string]*SchemaField `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + sizeCache protoimpl.SizeCache } func (x *Schema) Reset() { *x = Schema{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[40] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Schema) String() string { @@ -2713,7 +2597,7 @@ func (*Schema) ProtoMessage() {} func (x *Schema) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[40] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2736,21 +2620,18 @@ func (x *Schema) GetFields() map[string]*SchemaField { } type SchemaField struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Fields *Schema `protobuf:"bytes,2,opt,name=fields,proto3" json:"fields,omitempty"` unknownFields protoimpl.UnknownFields - - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - Fields *Schema `protobuf:"bytes,2,opt,name=fields,proto3" json:"fields,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SchemaField) Reset() { *x = SchemaField{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[41] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SchemaField) String() string { @@ -2761,7 +2642,7 @@ func (*SchemaField) ProtoMessage() {} func (x *SchemaField) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[41] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2791,65 +2672,62 @@ func (x *SchemaField) GetFields() *Schema { } type GetOrCreateStubRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ObjectId string `protobuf:"bytes,1,opt,name=object_id,json=objectId,proto3" json:"object_id,omitempty"` - ImageId string `protobuf:"bytes,2,opt,name=image_id,json=imageId,proto3" json:"image_id,omitempty"` - StubType string `protobuf:"bytes,3,opt,name=stub_type,json=stubType,proto3" json:"stub_type,omitempty"` - Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` - PythonVersion string `protobuf:"bytes,5,opt,name=python_version,json=pythonVersion,proto3" json:"python_version,omitempty"` - Cpu int64 `protobuf:"varint,6,opt,name=cpu,proto3" json:"cpu,omitempty"` - Memory int64 `protobuf:"varint,7,opt,name=memory,proto3" json:"memory,omitempty"` - Gpu string `protobuf:"bytes,8,opt,name=gpu,proto3" json:"gpu,omitempty"` - Handler string `protobuf:"bytes,9,opt,name=handler,proto3" json:"handler,omitempty"` - Retries uint32 `protobuf:"varint,10,opt,name=retries,proto3" json:"retries,omitempty"` - Timeout int64 `protobuf:"varint,11,opt,name=timeout,proto3" json:"timeout,omitempty"` - KeepWarmSeconds float32 `protobuf:"fixed32,12,opt,name=keep_warm_seconds,json=keepWarmSeconds,proto3" json:"keep_warm_seconds,omitempty"` - Workers uint32 `protobuf:"varint,13,opt,name=workers,proto3" json:"workers,omitempty"` - MaxPendingTasks uint32 `protobuf:"varint,15,opt,name=max_pending_tasks,json=maxPendingTasks,proto3" json:"max_pending_tasks,omitempty"` - Volumes []*Volume `protobuf:"bytes,16,rep,name=volumes,proto3" json:"volumes,omitempty"` - ForceCreate bool `protobuf:"varint,17,opt,name=force_create,json=forceCreate,proto3" json:"force_create,omitempty"` - OnStart string `protobuf:"bytes,18,opt,name=on_start,json=onStart,proto3" json:"on_start,omitempty"` - CallbackUrl string `protobuf:"bytes,19,opt,name=callback_url,json=callbackUrl,proto3" json:"callback_url,omitempty"` - Authorized bool `protobuf:"varint,20,opt,name=authorized,proto3" json:"authorized,omitempty"` - Secrets []*SecretVar `protobuf:"bytes,21,rep,name=secrets,proto3" json:"secrets,omitempty"` - Autoscaler *Autoscaler `protobuf:"bytes,22,opt,name=autoscaler,proto3" json:"autoscaler,omitempty"` - TaskPolicy *TaskPolicy `protobuf:"bytes,23,opt,name=task_policy,json=taskPolicy,proto3" json:"task_policy,omitempty"` - ConcurrentRequests uint32 `protobuf:"varint,24,opt,name=concurrent_requests,json=concurrentRequests,proto3" json:"concurrent_requests,omitempty"` - Extra string `protobuf:"bytes,25,opt,name=extra,proto3" json:"extra,omitempty"` - CheckpointEnabled bool `protobuf:"varint,26,opt,name=checkpoint_enabled,json=checkpointEnabled,proto3" json:"checkpoint_enabled,omitempty"` - GpuCount uint32 `protobuf:"varint,27,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` - OnDeploy string `protobuf:"bytes,28,opt,name=on_deploy,json=onDeploy,proto3" json:"on_deploy,omitempty"` - OnDeployStubId string `protobuf:"bytes,29,opt,name=on_deploy_stub_id,json=onDeployStubId,proto3" json:"on_deploy_stub_id,omitempty"` - Entrypoint []string `protobuf:"bytes,30,rep,name=entrypoint,proto3" json:"entrypoint,omitempty"` - Ports []uint32 `protobuf:"varint,31,rep,packed,name=ports,proto3" json:"ports,omitempty"` - Env []string `protobuf:"bytes,32,rep,name=env,proto3" json:"env,omitempty"` - AppName string `protobuf:"bytes,33,opt,name=app_name,json=appName,proto3" json:"app_name,omitempty"` - Pricing *PricingPolicy `protobuf:"bytes,34,opt,name=pricing,proto3" json:"pricing,omitempty"` - Inputs *Schema `protobuf:"bytes,35,opt,name=inputs,proto3" json:"inputs,omitempty"` - Outputs *Schema `protobuf:"bytes,36,opt,name=outputs,proto3" json:"outputs,omitempty"` - Tcp bool `protobuf:"varint,37,opt,name=tcp,proto3" json:"tcp,omitempty"` - BlockNetwork bool `protobuf:"varint,38,opt,name=block_network,json=blockNetwork,proto3" json:"block_network,omitempty"` - AllowList []string `protobuf:"bytes,39,rep,name=allow_list,json=allowList,proto3" json:"allow_list,omitempty"` - DockerEnabled bool `protobuf:"varint,40,opt,name=docker_enabled,json=dockerEnabled,proto3" json:"docker_enabled,omitempty"` - Pool *PoolConfig `protobuf:"bytes,41,opt,name=pool,proto3" json:"pool,omitempty"` - IsService bool `protobuf:"varint,42,opt,name=is_service,json=isService,proto3" json:"is_service,omitempty"` - Serving *ServingConfig `protobuf:"bytes,43,opt,name=serving,proto3" json:"serving,omitempty"` - Disks []*DurableDisk `protobuf:"bytes,44,rep,name=disks,proto3" json:"disks,omitempty"` - AllowMarketplace bool `protobuf:"varint,45,opt,name=allow_marketplace,json=allowMarketplace,proto3" json:"allow_marketplace,omitempty"` - CheckpointTrigger *CheckpointTrigger `protobuf:"bytes,46,opt,name=checkpoint_trigger,json=checkpointTrigger,proto3" json:"checkpoint_trigger,omitempty"` - GpuVirtualized bool `protobuf:"varint,47,opt,name=gpu_virtualized,json=gpuVirtualized,proto3" json:"gpu_virtualized,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + ObjectId string `protobuf:"bytes,1,opt,name=object_id,json=objectId,proto3" json:"object_id,omitempty"` + ImageId string `protobuf:"bytes,2,opt,name=image_id,json=imageId,proto3" json:"image_id,omitempty"` + StubType string `protobuf:"bytes,3,opt,name=stub_type,json=stubType,proto3" json:"stub_type,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + PythonVersion string `protobuf:"bytes,5,opt,name=python_version,json=pythonVersion,proto3" json:"python_version,omitempty"` + Cpu int64 `protobuf:"varint,6,opt,name=cpu,proto3" json:"cpu,omitempty"` + Memory int64 `protobuf:"varint,7,opt,name=memory,proto3" json:"memory,omitempty"` + Gpu string `protobuf:"bytes,8,opt,name=gpu,proto3" json:"gpu,omitempty"` + Handler string `protobuf:"bytes,9,opt,name=handler,proto3" json:"handler,omitempty"` + Retries uint32 `protobuf:"varint,10,opt,name=retries,proto3" json:"retries,omitempty"` + Timeout int64 `protobuf:"varint,11,opt,name=timeout,proto3" json:"timeout,omitempty"` + KeepWarmSeconds float32 `protobuf:"fixed32,12,opt,name=keep_warm_seconds,json=keepWarmSeconds,proto3" json:"keep_warm_seconds,omitempty"` + Workers uint32 `protobuf:"varint,13,opt,name=workers,proto3" json:"workers,omitempty"` + MaxPendingTasks uint32 `protobuf:"varint,15,opt,name=max_pending_tasks,json=maxPendingTasks,proto3" json:"max_pending_tasks,omitempty"` + Volumes []*Volume `protobuf:"bytes,16,rep,name=volumes,proto3" json:"volumes,omitempty"` + ForceCreate bool `protobuf:"varint,17,opt,name=force_create,json=forceCreate,proto3" json:"force_create,omitempty"` + OnStart string `protobuf:"bytes,18,opt,name=on_start,json=onStart,proto3" json:"on_start,omitempty"` + CallbackUrl string `protobuf:"bytes,19,opt,name=callback_url,json=callbackUrl,proto3" json:"callback_url,omitempty"` + Authorized bool `protobuf:"varint,20,opt,name=authorized,proto3" json:"authorized,omitempty"` + Secrets []*SecretVar `protobuf:"bytes,21,rep,name=secrets,proto3" json:"secrets,omitempty"` + Autoscaler *Autoscaler `protobuf:"bytes,22,opt,name=autoscaler,proto3" json:"autoscaler,omitempty"` + TaskPolicy *TaskPolicy `protobuf:"bytes,23,opt,name=task_policy,json=taskPolicy,proto3" json:"task_policy,omitempty"` + ConcurrentRequests uint32 `protobuf:"varint,24,opt,name=concurrent_requests,json=concurrentRequests,proto3" json:"concurrent_requests,omitempty"` + Extra string `protobuf:"bytes,25,opt,name=extra,proto3" json:"extra,omitempty"` + CheckpointEnabled bool `protobuf:"varint,26,opt,name=checkpoint_enabled,json=checkpointEnabled,proto3" json:"checkpoint_enabled,omitempty"` + GpuCount uint32 `protobuf:"varint,27,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` + OnDeploy string `protobuf:"bytes,28,opt,name=on_deploy,json=onDeploy,proto3" json:"on_deploy,omitempty"` + OnDeployStubId string `protobuf:"bytes,29,opt,name=on_deploy_stub_id,json=onDeployStubId,proto3" json:"on_deploy_stub_id,omitempty"` + Entrypoint []string `protobuf:"bytes,30,rep,name=entrypoint,proto3" json:"entrypoint,omitempty"` + Ports []uint32 `protobuf:"varint,31,rep,packed,name=ports,proto3" json:"ports,omitempty"` + Env []string `protobuf:"bytes,32,rep,name=env,proto3" json:"env,omitempty"` + AppName string `protobuf:"bytes,33,opt,name=app_name,json=appName,proto3" json:"app_name,omitempty"` + Pricing *PricingPolicy `protobuf:"bytes,34,opt,name=pricing,proto3" json:"pricing,omitempty"` + Inputs *Schema `protobuf:"bytes,35,opt,name=inputs,proto3" json:"inputs,omitempty"` + Outputs *Schema `protobuf:"bytes,36,opt,name=outputs,proto3" json:"outputs,omitempty"` + Tcp bool `protobuf:"varint,37,opt,name=tcp,proto3" json:"tcp,omitempty"` + BlockNetwork bool `protobuf:"varint,38,opt,name=block_network,json=blockNetwork,proto3" json:"block_network,omitempty"` + AllowList []string `protobuf:"bytes,39,rep,name=allow_list,json=allowList,proto3" json:"allow_list,omitempty"` + DockerEnabled bool `protobuf:"varint,40,opt,name=docker_enabled,json=dockerEnabled,proto3" json:"docker_enabled,omitempty"` + Pool *PoolConfig `protobuf:"bytes,41,opt,name=pool,proto3" json:"pool,omitempty"` + IsService bool `protobuf:"varint,42,opt,name=is_service,json=isService,proto3" json:"is_service,omitempty"` + Serving *ServingConfig `protobuf:"bytes,43,opt,name=serving,proto3" json:"serving,omitempty"` + Disks []*DurableDisk `protobuf:"bytes,44,rep,name=disks,proto3" json:"disks,omitempty"` + AllowMarketplace bool `protobuf:"varint,45,opt,name=allow_marketplace,json=allowMarketplace,proto3" json:"allow_marketplace,omitempty"` + CheckpointTrigger *CheckpointTrigger `protobuf:"bytes,46,opt,name=checkpoint_trigger,json=checkpointTrigger,proto3" json:"checkpoint_trigger,omitempty"` + GpuVirtualized bool `protobuf:"varint,47,opt,name=gpu_virtualized,json=gpuVirtualized,proto3" json:"gpu_virtualized,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetOrCreateStubRequest) Reset() { *x = GetOrCreateStubRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[42] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetOrCreateStubRequest) String() string { @@ -2860,7 +2738,7 @@ func (*GetOrCreateStubRequest) ProtoMessage() {} func (x *GetOrCreateStubRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[42] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3198,14 +3076,11 @@ func (x *GetOrCreateStubRequest) GetGpuVirtualized() bool { } type GetOrCreateStubResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - StubId string `protobuf:"bytes,2,opt,name=stub_id,json=stubId,proto3" json:"stub_id,omitempty"` - ErrMsg string `protobuf:"bytes,3,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - WarnMsg string `protobuf:"bytes,4,opt,name=warn_msg,json=warnMsg,proto3" json:"warn_msg,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + StubId string `protobuf:"bytes,2,opt,name=stub_id,json=stubId,proto3" json:"stub_id,omitempty"` + ErrMsg string `protobuf:"bytes,3,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + WarnMsg string `protobuf:"bytes,4,opt,name=warn_msg,json=warnMsg,proto3" json:"warn_msg,omitempty"` // Capacity verdict for the requested GPU types, computed at stub creation: // "available", "low", or "none". Empty when no check applies (CPU-only // workloads, private-pool-only stubs, or pool-selector-bound stubs). @@ -3216,15 +3091,15 @@ type GetOrCreateStubResponse struct { // the GPU request. Set instead of capacity_status "none" so clients can // re-issue stub creation targeting this pool. MatchedPrivatePool string `protobuf:"bytes,7,opt,name=matched_private_pool,json=matchedPrivatePool,proto3" json:"matched_private_pool,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetOrCreateStubResponse) Reset() { *x = GetOrCreateStubResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[43] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetOrCreateStubResponse) String() string { @@ -3235,7 +3110,7 @@ func (*GetOrCreateStubResponse) ProtoMessage() {} func (x *GetOrCreateStubResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[43] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3300,22 +3175,19 @@ func (x *GetOrCreateStubResponse) GetMatchedPrivatePool() string { } type DeployStubRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + StubId string `protobuf:"bytes,1,opt,name=stub_id,json=stubId,proto3" json:"stub_id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Rollout string `protobuf:"bytes,3,opt,name=rollout,proto3" json:"rollout,omitempty"` unknownFields protoimpl.UnknownFields - - StubId string `protobuf:"bytes,1,opt,name=stub_id,json=stubId,proto3" json:"stub_id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Rollout string `protobuf:"bytes,3,opt,name=rollout,proto3" json:"rollout,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeployStubRequest) Reset() { *x = DeployStubRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[44] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeployStubRequest) String() string { @@ -3326,7 +3198,7 @@ func (*DeployStubRequest) ProtoMessage() {} func (x *DeployStubRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[44] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3363,26 +3235,23 @@ func (x *DeployStubRequest) GetRollout() string { } type DeployStubResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + DeploymentId string `protobuf:"bytes,2,opt,name=deployment_id,json=deploymentId,proto3" json:"deployment_id,omitempty"` + Version uint32 `protobuf:"varint,3,opt,name=version,proto3" json:"version,omitempty"` + InvokeUrl string `protobuf:"bytes,4,opt,name=invoke_url,json=invokeUrl,proto3" json:"invoke_url,omitempty"` + ErrMsg string `protobuf:"bytes,5,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + WarnMsg string `protobuf:"bytes,6,opt,name=warn_msg,json=warnMsg,proto3" json:"warn_msg,omitempty"` + RolloutAction string `protobuf:"bytes,7,opt,name=rollout_action,json=rolloutAction,proto3" json:"rollout_action,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - DeploymentId string `protobuf:"bytes,2,opt,name=deployment_id,json=deploymentId,proto3" json:"deployment_id,omitempty"` - Version uint32 `protobuf:"varint,3,opt,name=version,proto3" json:"version,omitempty"` - InvokeUrl string `protobuf:"bytes,4,opt,name=invoke_url,json=invokeUrl,proto3" json:"invoke_url,omitempty"` - ErrMsg string `protobuf:"bytes,5,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - WarnMsg string `protobuf:"bytes,6,opt,name=warn_msg,json=warnMsg,proto3" json:"warn_msg,omitempty"` - RolloutAction string `protobuf:"bytes,7,opt,name=rollout_action,json=rolloutAction,proto3" json:"rollout_action,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeployStubResponse) Reset() { *x = DeployStubResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[45] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeployStubResponse) String() string { @@ -3393,7 +3262,7 @@ func (*DeployStubResponse) ProtoMessage() {} func (x *DeployStubResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[45] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3458,10 +3327,7 @@ func (x *DeployStubResponse) GetRolloutAction() string { } type Deployment struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` Active bool `protobuf:"varint,3,opt,name=active,proto3" json:"active,omitempty"` @@ -3477,15 +3343,15 @@ type Deployment struct { DatabaseKind string `protobuf:"bytes,13,opt,name=database_kind,json=databaseKind,proto3" json:"database_kind,omitempty"` ConnectionStringSecret string `protobuf:"bytes,14,opt,name=connection_string_secret,json=connectionStringSecret,proto3" json:"connection_string_secret,omitempty"` ConnectionEnvName string `protobuf:"bytes,15,opt,name=connection_env_name,json=connectionEnvName,proto3" json:"connection_env_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Deployment) Reset() { *x = Deployment{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[46] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Deployment) String() string { @@ -3496,7 +3362,7 @@ func (*Deployment) ProtoMessage() {} func (x *Deployment) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[46] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3617,21 +3483,18 @@ func (x *Deployment) GetConnectionEnvName() string { } type ListDeploymentsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Filters map[string]*StringList `protobuf:"bytes,1,rep,name=filters,proto3" json:"filters,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` unknownFields protoimpl.UnknownFields - - Filters map[string]*StringList `protobuf:"bytes,1,rep,name=filters,proto3" json:"filters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListDeploymentsRequest) Reset() { *x = ListDeploymentsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[47] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListDeploymentsRequest) String() string { @@ -3642,7 +3505,7 @@ func (*ListDeploymentsRequest) ProtoMessage() {} func (x *ListDeploymentsRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[47] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3672,22 +3535,19 @@ func (x *ListDeploymentsRequest) GetLimit() uint32 { } type ListDeploymentsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Deployments []*Deployment `protobuf:"bytes,3,rep,name=deployments,proto3" json:"deployments,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Deployments []*Deployment `protobuf:"bytes,3,rep,name=deployments,proto3" json:"deployments,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListDeploymentsResponse) Reset() { *x = ListDeploymentsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[48] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListDeploymentsResponse) String() string { @@ -3698,7 +3558,7 @@ func (*ListDeploymentsResponse) ProtoMessage() {} func (x *ListDeploymentsResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[48] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3735,20 +3595,17 @@ func (x *ListDeploymentsResponse) GetDeployments() []*Deployment { } type StopDeploymentRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *StopDeploymentRequest) Reset() { *x = StopDeploymentRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[49] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StopDeploymentRequest) String() string { @@ -3759,7 +3616,7 @@ func (*StopDeploymentRequest) ProtoMessage() {} func (x *StopDeploymentRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[49] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3782,21 +3639,18 @@ func (x *StopDeploymentRequest) GetId() string { } type StopDeploymentResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *StopDeploymentResponse) Reset() { *x = StopDeploymentResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[50] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StopDeploymentResponse) String() string { @@ -3807,7 +3661,7 @@ func (*StopDeploymentResponse) ProtoMessage() {} func (x *StopDeploymentResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[50] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3837,20 +3691,17 @@ func (x *StopDeploymentResponse) GetErrMsg() string { } type StartDeploymentRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *StartDeploymentRequest) Reset() { *x = StartDeploymentRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[51] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StartDeploymentRequest) String() string { @@ -3861,7 +3712,7 @@ func (*StartDeploymentRequest) ProtoMessage() {} func (x *StartDeploymentRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[51] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3884,21 +3735,18 @@ func (x *StartDeploymentRequest) GetId() string { } type StartDeploymentResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *StartDeploymentResponse) Reset() { *x = StartDeploymentResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[52] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StartDeploymentResponse) String() string { @@ -3909,7 +3757,7 @@ func (*StartDeploymentResponse) ProtoMessage() {} func (x *StartDeploymentResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[52] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3939,21 +3787,18 @@ func (x *StartDeploymentResponse) GetErrMsg() string { } type ScaleDeploymentRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Containers uint32 `protobuf:"varint,2,opt,name=containers,proto3" json:"containers,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Containers uint32 `protobuf:"varint,2,opt,name=containers,proto3" json:"containers,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ScaleDeploymentRequest) Reset() { *x = ScaleDeploymentRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[53] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ScaleDeploymentRequest) String() string { @@ -3964,7 +3809,7 @@ func (*ScaleDeploymentRequest) ProtoMessage() {} func (x *ScaleDeploymentRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[53] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3994,21 +3839,18 @@ func (x *ScaleDeploymentRequest) GetContainers() uint32 { } type ScaleDeploymentResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ScaleDeploymentResponse) Reset() { *x = ScaleDeploymentResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[54] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ScaleDeploymentResponse) String() string { @@ -4019,7 +3861,7 @@ func (*ScaleDeploymentResponse) ProtoMessage() {} func (x *ScaleDeploymentResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[54] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4049,20 +3891,17 @@ func (x *ScaleDeploymentResponse) GetErrMsg() string { } type DeleteDeploymentRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteDeploymentRequest) Reset() { *x = DeleteDeploymentRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[55] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteDeploymentRequest) String() string { @@ -4073,7 +3912,7 @@ func (*DeleteDeploymentRequest) ProtoMessage() {} func (x *DeleteDeploymentRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[55] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4096,21 +3935,18 @@ func (x *DeleteDeploymentRequest) GetId() string { } type DeleteDeploymentResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteDeploymentResponse) Reset() { *x = DeleteDeploymentResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[56] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteDeploymentResponse) String() string { @@ -4121,7 +3957,7 @@ func (*DeleteDeploymentResponse) ProtoMessage() {} func (x *DeleteDeploymentResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[56] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4151,29 +3987,26 @@ func (x *DeleteDeploymentResponse) GetErrMsg() string { } type Pool struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Active bool `protobuf:"varint,3,opt,name=active,proto3" json:"active,omitempty"` - Gpu string `protobuf:"bytes,4,opt,name=gpu,proto3" json:"gpu,omitempty"` - MinFreeGpu string `protobuf:"bytes,5,opt,name=minFreeGpu,proto3" json:"minFreeGpu,omitempty"` - MinFreeCpu string `protobuf:"bytes,6,opt,name=minFreeCpu,proto3" json:"minFreeCpu,omitempty"` - MinFreeMemory string `protobuf:"bytes,7,opt,name=minFreeMemory,proto3" json:"minFreeMemory,omitempty"` - DefaultWorkerCpu string `protobuf:"bytes,8,opt,name=defaultWorkerCpu,proto3" json:"defaultWorkerCpu,omitempty"` - DefaultWorkerMemory string `protobuf:"bytes,9,opt,name=defaultWorkerMemory,proto3" json:"defaultWorkerMemory,omitempty"` - DefaultWorkerGpuCount string `protobuf:"bytes,10,opt,name=defaultWorkerGpuCount,proto3" json:"defaultWorkerGpuCount,omitempty"` - State *WorkerPoolState `protobuf:"bytes,11,opt,name=state,proto3" json:"state,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Active bool `protobuf:"varint,3,opt,name=active,proto3" json:"active,omitempty"` + Gpu string `protobuf:"bytes,4,opt,name=gpu,proto3" json:"gpu,omitempty"` + MinFreeGpu string `protobuf:"bytes,5,opt,name=minFreeGpu,proto3" json:"minFreeGpu,omitempty"` + MinFreeCpu string `protobuf:"bytes,6,opt,name=minFreeCpu,proto3" json:"minFreeCpu,omitempty"` + MinFreeMemory string `protobuf:"bytes,7,opt,name=minFreeMemory,proto3" json:"minFreeMemory,omitempty"` + DefaultWorkerCpu string `protobuf:"bytes,8,opt,name=defaultWorkerCpu,proto3" json:"defaultWorkerCpu,omitempty"` + DefaultWorkerMemory string `protobuf:"bytes,9,opt,name=defaultWorkerMemory,proto3" json:"defaultWorkerMemory,omitempty"` + DefaultWorkerGpuCount string `protobuf:"bytes,10,opt,name=defaultWorkerGpuCount,proto3" json:"defaultWorkerGpuCount,omitempty"` + State *WorkerPoolState `protobuf:"bytes,11,opt,name=state,proto3" json:"state,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Pool) Reset() { *x = Pool{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[57] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Pool) String() string { @@ -4184,7 +4017,7 @@ func (*Pool) ProtoMessage() {} func (x *Pool) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[57] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4270,21 +4103,18 @@ func (x *Pool) GetState() *WorkerPoolState { } type ListPoolsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Filters map[string]*StringList `protobuf:"bytes,1,rep,name=filters,proto3" json:"filters,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` unknownFields protoimpl.UnknownFields - - Filters map[string]*StringList `protobuf:"bytes,1,rep,name=filters,proto3" json:"filters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListPoolsRequest) Reset() { *x = ListPoolsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[58] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListPoolsRequest) String() string { @@ -4295,7 +4125,7 @@ func (*ListPoolsRequest) ProtoMessage() {} func (x *ListPoolsRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[58] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4325,22 +4155,19 @@ func (x *ListPoolsRequest) GetLimit() uint32 { } type ListPoolsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Pools []*Pool `protobuf:"bytes,3,rep,name=pools,proto3" json:"pools,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Pools []*Pool `protobuf:"bytes,3,rep,name=pools,proto3" json:"pools,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListPoolsResponse) Reset() { *x = ListPoolsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[59] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListPoolsResponse) String() string { @@ -4351,7 +4178,7 @@ func (*ListPoolsResponse) ProtoMessage() {} func (x *ListPoolsResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[59] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4388,33 +4215,30 @@ func (x *ListPoolsResponse) GetPools() []*Pool { } type PoolConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Gpu []string `protobuf:"bytes,2,rep,name=gpu,proto3" json:"gpu,omitempty"` - Nodes uint32 `protobuf:"varint,3,opt,name=nodes,proto3" json:"nodes,omitempty"` - Ttl string `protobuf:"bytes,4,opt,name=ttl,proto3" json:"ttl,omitempty"` - MaxSpend float64 `protobuf:"fixed64,5,opt,name=max_spend,json=maxSpend,proto3" json:"max_spend,omitempty"` - Providers []string `protobuf:"bytes,6,rep,name=providers,proto3" json:"providers,omitempty"` - Regions []string `protobuf:"bytes,7,rep,name=regions,proto3" json:"regions,omitempty"` - MinReliability float64 `protobuf:"fixed64,8,opt,name=min_reliability,json=minReliability,proto3" json:"min_reliability,omitempty"` - Selector string `protobuf:"bytes,9,opt,name=selector,proto3" json:"selector,omitempty"` - Mode string `protobuf:"bytes,10,opt,name=mode,proto3" json:"mode,omitempty"` - Transport string `protobuf:"bytes,11,opt,name=transport,proto3" json:"transport,omitempty"` - Fallback string `protobuf:"bytes,12,opt,name=fallback,proto3" json:"fallback,omitempty"` - Priority int32 `protobuf:"varint,13,opt,name=priority,proto3" json:"priority,omitempty"` - OfferId string `protobuf:"bytes,14,opt,name=offer_id,json=offerId,proto3" json:"offer_id,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Gpu []string `protobuf:"bytes,2,rep,name=gpu,proto3" json:"gpu,omitempty"` + Nodes uint32 `protobuf:"varint,3,opt,name=nodes,proto3" json:"nodes,omitempty"` + Ttl string `protobuf:"bytes,4,opt,name=ttl,proto3" json:"ttl,omitempty"` + MaxSpend float64 `protobuf:"fixed64,5,opt,name=max_spend,json=maxSpend,proto3" json:"max_spend,omitempty"` + Providers []string `protobuf:"bytes,6,rep,name=providers,proto3" json:"providers,omitempty"` + Regions []string `protobuf:"bytes,7,rep,name=regions,proto3" json:"regions,omitempty"` + MinReliability float64 `protobuf:"fixed64,8,opt,name=min_reliability,json=minReliability,proto3" json:"min_reliability,omitempty"` + Selector string `protobuf:"bytes,9,opt,name=selector,proto3" json:"selector,omitempty"` + Mode string `protobuf:"bytes,10,opt,name=mode,proto3" json:"mode,omitempty"` + Transport string `protobuf:"bytes,11,opt,name=transport,proto3" json:"transport,omitempty"` + Fallback string `protobuf:"bytes,12,opt,name=fallback,proto3" json:"fallback,omitempty"` + Priority int32 `protobuf:"varint,13,opt,name=priority,proto3" json:"priority,omitempty"` + OfferId string `protobuf:"bytes,14,opt,name=offer_id,json=offerId,proto3" json:"offer_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PoolConfig) Reset() { *x = PoolConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[60] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PoolConfig) String() string { @@ -4425,7 +4249,7 @@ func (*PoolConfig) ProtoMessage() {} func (x *PoolConfig) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[60] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4539,38 +4363,35 @@ func (x *PoolConfig) GetOfferId() string { } type PoolOffer struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Provider string `protobuf:"bytes,2,opt,name=provider,proto3" json:"provider,omitempty"` - InstanceType string `protobuf:"bytes,3,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` - Region string `protobuf:"bytes,4,opt,name=region,proto3" json:"region,omitempty"` - Gpu string `protobuf:"bytes,5,opt,name=gpu,proto3" json:"gpu,omitempty"` - GpuCount uint32 `protobuf:"varint,6,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` - CpuMillicores int64 `protobuf:"varint,7,opt,name=cpu_millicores,json=cpuMillicores,proto3" json:"cpu_millicores,omitempty"` - MemoryMb int64 `protobuf:"varint,8,opt,name=memory_mb,json=memoryMb,proto3" json:"memory_mb,omitempty"` - HourlyCostMicros int64 `protobuf:"varint,9,opt,name=hourly_cost_micros,json=hourlyCostMicros,proto3" json:"hourly_cost_micros,omitempty"` - Reliability float64 `protobuf:"fixed64,10,opt,name=reliability,proto3" json:"reliability,omitempty"` - Available uint32 `protobuf:"varint,11,opt,name=available,proto3" json:"available,omitempty"` - StorageMb int64 `protobuf:"varint,12,opt,name=storage_mb,json=storageMb,proto3" json:"storage_mb,omitempty"` - Cloud string `protobuf:"bytes,13,opt,name=cloud,proto3" json:"cloud,omitempty"` - NodeCount uint32 `protobuf:"varint,14,opt,name=node_count,json=nodeCount,proto3" json:"node_count,omitempty"` - DisplayName string `protobuf:"bytes,15,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - Category string `protobuf:"bytes,16,opt,name=category,proto3" json:"category,omitempty"` - RegionDisplayName string `protobuf:"bytes,17,opt,name=region_display_name,json=regionDisplayName,proto3" json:"region_display_name,omitempty"` - Latitude float64 `protobuf:"fixed64,18,opt,name=latitude,proto3" json:"latitude,omitempty"` - Longitude float64 `protobuf:"fixed64,19,opt,name=longitude,proto3" json:"longitude,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Provider string `protobuf:"bytes,2,opt,name=provider,proto3" json:"provider,omitempty"` + InstanceType string `protobuf:"bytes,3,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` + Region string `protobuf:"bytes,4,opt,name=region,proto3" json:"region,omitempty"` + Gpu string `protobuf:"bytes,5,opt,name=gpu,proto3" json:"gpu,omitempty"` + GpuCount uint32 `protobuf:"varint,6,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` + CpuMillicores int64 `protobuf:"varint,7,opt,name=cpu_millicores,json=cpuMillicores,proto3" json:"cpu_millicores,omitempty"` + MemoryMb int64 `protobuf:"varint,8,opt,name=memory_mb,json=memoryMb,proto3" json:"memory_mb,omitempty"` + HourlyCostMicros int64 `protobuf:"varint,9,opt,name=hourly_cost_micros,json=hourlyCostMicros,proto3" json:"hourly_cost_micros,omitempty"` + Reliability float64 `protobuf:"fixed64,10,opt,name=reliability,proto3" json:"reliability,omitempty"` + Available uint32 `protobuf:"varint,11,opt,name=available,proto3" json:"available,omitempty"` + StorageMb int64 `protobuf:"varint,12,opt,name=storage_mb,json=storageMb,proto3" json:"storage_mb,omitempty"` + Cloud string `protobuf:"bytes,13,opt,name=cloud,proto3" json:"cloud,omitempty"` + NodeCount uint32 `protobuf:"varint,14,opt,name=node_count,json=nodeCount,proto3" json:"node_count,omitempty"` + DisplayName string `protobuf:"bytes,15,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Category string `protobuf:"bytes,16,opt,name=category,proto3" json:"category,omitempty"` + RegionDisplayName string `protobuf:"bytes,17,opt,name=region_display_name,json=regionDisplayName,proto3" json:"region_display_name,omitempty"` + Latitude float64 `protobuf:"fixed64,18,opt,name=latitude,proto3" json:"latitude,omitempty"` + Longitude float64 `protobuf:"fixed64,19,opt,name=longitude,proto3" json:"longitude,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PoolOffer) Reset() { *x = PoolOffer{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[61] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PoolOffer) String() string { @@ -4581,7 +4402,7 @@ func (*PoolOffer) ProtoMessage() {} func (x *PoolOffer) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[61] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4730,10 +4551,7 @@ func (x *PoolOffer) GetLongitude() float64 { } type ProviderInstance struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` PoolName string `protobuf:"bytes,2,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` Provider string `protobuf:"bytes,3,opt,name=provider,proto3" json:"provider,omitempty"` @@ -4755,15 +4573,15 @@ type ProviderInstance struct { CpuMillicores int64 `protobuf:"varint,19,opt,name=cpu_millicores,json=cpuMillicores,proto3" json:"cpu_millicores,omitempty"` MemoryMb int64 `protobuf:"varint,20,opt,name=memory_mb,json=memoryMb,proto3" json:"memory_mb,omitempty"` StorageMb int64 `protobuf:"varint,21,opt,name=storage_mb,json=storageMb,proto3" json:"storage_mb,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ProviderInstance) Reset() { *x = ProviderInstance{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[62] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ProviderInstance) String() string { @@ -4774,7 +4592,7 @@ func (*ProviderInstance) ProtoMessage() {} func (x *ProviderInstance) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[62] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4937,10 +4755,7 @@ func (x *ProviderInstance) GetStorageMb() int64 { } type PrivatePool struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Selector string `protobuf:"bytes,2,opt,name=selector,proto3" json:"selector,omitempty"` Config *PoolConfig `protobuf:"bytes,3,opt,name=config,proto3" json:"config,omitempty"` @@ -4954,15 +4769,15 @@ type PrivatePool struct { ReadyMachineCount uint32 `protobuf:"varint,12,opt,name=ready_machine_count,json=readyMachineCount,proto3" json:"ready_machine_count,omitempty"` ReservedNodes uint32 `protobuf:"varint,13,opt,name=reserved_nodes,json=reservedNodes,proto3" json:"reserved_nodes,omitempty"` Byoc *BYOCPoolState `protobuf:"bytes,14,opt,name=byoc,proto3" json:"byoc,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PrivatePool) Reset() { *x = PrivatePool{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[63] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PrivatePool) String() string { @@ -4973,7 +4788,7 @@ func (*PrivatePool) ProtoMessage() {} func (x *PrivatePool) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[63] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5080,20 +4895,17 @@ func (x *PrivatePool) GetByoc() *BYOCPoolState { } type ListPoolOffersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Pool *PoolConfig `protobuf:"bytes,1,opt,name=pool,proto3" json:"pool,omitempty"` unknownFields protoimpl.UnknownFields - - Pool *PoolConfig `protobuf:"bytes,1,opt,name=pool,proto3" json:"pool,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListPoolOffersRequest) Reset() { *x = ListPoolOffersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[64] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListPoolOffersRequest) String() string { @@ -5104,7 +4916,7 @@ func (*ListPoolOffersRequest) ProtoMessage() {} func (x *ListPoolOffersRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[64] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5127,22 +4939,19 @@ func (x *ListPoolOffersRequest) GetPool() *PoolConfig { } type ListPoolOffersResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Offers []*PoolOffer `protobuf:"bytes,3,rep,name=offers,proto3" json:"offers,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Offers []*PoolOffer `protobuf:"bytes,3,rep,name=offers,proto3" json:"offers,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListPoolOffersResponse) Reset() { *x = ListPoolOffersResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[65] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListPoolOffersResponse) String() string { @@ -5153,7 +4962,7 @@ func (*ListPoolOffersResponse) ProtoMessage() {} func (x *ListPoolOffersResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[65] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5190,21 +4999,18 @@ func (x *ListPoolOffersResponse) GetOffers() []*PoolOffer { } type LaunchPoolCapacityRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Pool *PoolConfig `protobuf:"bytes,1,opt,name=pool,proto3" json:"pool,omitempty"` + Nodes uint32 `protobuf:"varint,2,opt,name=nodes,proto3" json:"nodes,omitempty"` unknownFields protoimpl.UnknownFields - - Pool *PoolConfig `protobuf:"bytes,1,opt,name=pool,proto3" json:"pool,omitempty"` - Nodes uint32 `protobuf:"varint,2,opt,name=nodes,proto3" json:"nodes,omitempty"` + sizeCache protoimpl.SizeCache } func (x *LaunchPoolCapacityRequest) Reset() { *x = LaunchPoolCapacityRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[66] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LaunchPoolCapacityRequest) String() string { @@ -5215,7 +5021,7 @@ func (*LaunchPoolCapacityRequest) ProtoMessage() {} func (x *LaunchPoolCapacityRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[66] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5245,25 +5051,22 @@ func (x *LaunchPoolCapacityRequest) GetNodes() uint32 { } type LaunchPoolCapacityResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Pool *PrivatePool `protobuf:"bytes,3,opt,name=pool,proto3" json:"pool,omitempty"` - ErrorCode string `protobuf:"bytes,4,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"` - RequiredCents int64 `protobuf:"varint,5,opt,name=required_cents,json=requiredCents,proto3" json:"required_cents,omitempty"` - AvailableCents int64 `protobuf:"varint,6,opt,name=available_cents,json=availableCents,proto3" json:"available_cents,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Pool *PrivatePool `protobuf:"bytes,3,opt,name=pool,proto3" json:"pool,omitempty"` + ErrorCode string `protobuf:"bytes,4,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"` + RequiredCents int64 `protobuf:"varint,5,opt,name=required_cents,json=requiredCents,proto3" json:"required_cents,omitempty"` + AvailableCents int64 `protobuf:"varint,6,opt,name=available_cents,json=availableCents,proto3" json:"available_cents,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LaunchPoolCapacityResponse) Reset() { *x = LaunchPoolCapacityResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[67] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[67] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LaunchPoolCapacityResponse) String() string { @@ -5274,7 +5077,7 @@ func (*LaunchPoolCapacityResponse) ProtoMessage() {} func (x *LaunchPoolCapacityResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[67] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5332,21 +5135,18 @@ func (x *LaunchPoolCapacityResponse) GetAvailableCents() int64 { } type ListPrivatePoolsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Filters map[string]*StringList `protobuf:"bytes,1,rep,name=filters,proto3" json:"filters,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` unknownFields protoimpl.UnknownFields - - Filters map[string]*StringList `protobuf:"bytes,1,rep,name=filters,proto3" json:"filters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListPrivatePoolsRequest) Reset() { *x = ListPrivatePoolsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[68] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[68] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListPrivatePoolsRequest) String() string { @@ -5357,7 +5157,7 @@ func (*ListPrivatePoolsRequest) ProtoMessage() {} func (x *ListPrivatePoolsRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[68] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5387,22 +5187,19 @@ func (x *ListPrivatePoolsRequest) GetLimit() uint32 { } type ListPrivatePoolsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Pools []*PrivatePool `protobuf:"bytes,3,rep,name=pools,proto3" json:"pools,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Pools []*PrivatePool `protobuf:"bytes,3,rep,name=pools,proto3" json:"pools,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListPrivatePoolsResponse) Reset() { *x = ListPrivatePoolsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[69] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[69] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListPrivatePoolsResponse) String() string { @@ -5413,7 +5210,7 @@ func (*ListPrivatePoolsResponse) ProtoMessage() {} func (x *ListPrivatePoolsResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[69] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5450,28 +5247,25 @@ func (x *ListPrivatePoolsResponse) GetPools() []*PrivatePool { } type CreateBYOCPoolRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + PoolName string `protobuf:"bytes,2,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + Region string `protobuf:"bytes,3,opt,name=region,proto3" json:"region,omitempty"` + InstanceType string `protobuf:"bytes,4,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` + DesiredNodes uint32 `protobuf:"varint,5,opt,name=desired_nodes,json=desiredNodes,proto3" json:"desired_nodes,omitempty"` + MaxNodes uint32 `protobuf:"varint,6,opt,name=max_nodes,json=maxNodes,proto3" json:"max_nodes,omitempty"` + AccountId string `protobuf:"bytes,7,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` + Gpu string `protobuf:"bytes,8,opt,name=gpu,proto3" json:"gpu,omitempty"` + GpuCount uint32 `protobuf:"varint,9,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` unknownFields protoimpl.UnknownFields - - Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` - PoolName string `protobuf:"bytes,2,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` - Region string `protobuf:"bytes,3,opt,name=region,proto3" json:"region,omitempty"` - InstanceType string `protobuf:"bytes,4,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` - DesiredNodes uint32 `protobuf:"varint,5,opt,name=desired_nodes,json=desiredNodes,proto3" json:"desired_nodes,omitempty"` - MaxNodes uint32 `protobuf:"varint,6,opt,name=max_nodes,json=maxNodes,proto3" json:"max_nodes,omitempty"` - AccountId string `protobuf:"bytes,7,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` - Gpu string `protobuf:"bytes,8,opt,name=gpu,proto3" json:"gpu,omitempty"` - GpuCount uint32 `protobuf:"varint,9,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreateBYOCPoolRequest) Reset() { *x = CreateBYOCPoolRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[70] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[70] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateBYOCPoolRequest) String() string { @@ -5482,7 +5276,7 @@ func (*CreateBYOCPoolRequest) ProtoMessage() {} func (x *CreateBYOCPoolRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[70] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5561,26 +5355,23 @@ func (x *CreateBYOCPoolRequest) GetGpuCount() uint32 { } type CreateBYOCPoolResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Pool *PrivatePool `protobuf:"bytes,3,opt,name=pool,proto3" json:"pool,omitempty"` + SetupUrl string `protobuf:"bytes,4,opt,name=setup_url,json=setupUrl,proto3" json:"setup_url,omitempty"` + ResourceName string `protobuf:"bytes,5,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` + ResourceUrl string `protobuf:"bytes,6,opt,name=resource_url,json=resourceUrl,proto3" json:"resource_url,omitempty"` + Byoc *BYOCPoolState `protobuf:"bytes,7,opt,name=byoc,proto3" json:"byoc,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Pool *PrivatePool `protobuf:"bytes,3,opt,name=pool,proto3" json:"pool,omitempty"` - SetupUrl string `protobuf:"bytes,4,opt,name=setup_url,json=setupUrl,proto3" json:"setup_url,omitempty"` - ResourceName string `protobuf:"bytes,5,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` - ResourceUrl string `protobuf:"bytes,6,opt,name=resource_url,json=resourceUrl,proto3" json:"resource_url,omitempty"` - Byoc *BYOCPoolState `protobuf:"bytes,7,opt,name=byoc,proto3" json:"byoc,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreateBYOCPoolResponse) Reset() { *x = CreateBYOCPoolResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[71] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[71] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateBYOCPoolResponse) String() string { @@ -5591,7 +5382,7 @@ func (*CreateBYOCPoolResponse) ProtoMessage() {} func (x *CreateBYOCPoolResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[71] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5656,39 +5447,36 @@ func (x *CreateBYOCPoolResponse) GetByoc() *BYOCPoolState { } type BYOCPoolState struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` - AccountId string `protobuf:"bytes,2,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` - Region string `protobuf:"bytes,3,opt,name=region,proto3" json:"region,omitempty"` - ResourceName string `protobuf:"bytes,4,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` - ResourceUrl string `protobuf:"bytes,5,opt,name=resource_url,json=resourceUrl,proto3" json:"resource_url,omitempty"` - DestroyUrl string `protobuf:"bytes,6,opt,name=destroy_url,json=destroyUrl,proto3" json:"destroy_url,omitempty"` - Phase string `protobuf:"bytes,7,opt,name=phase,proto3" json:"phase,omitempty"` - DesiredNodes uint32 `protobuf:"varint,8,opt,name=desired_nodes,json=desiredNodes,proto3" json:"desired_nodes,omitempty"` - MaxNodes uint32 `protobuf:"varint,9,opt,name=max_nodes,json=maxNodes,proto3" json:"max_nodes,omitempty"` - TargetSandboxes uint32 `protobuf:"varint,10,opt,name=target_sandboxes,json=targetSandboxes,proto3" json:"target_sandboxes,omitempty"` - SandboxesPerNode uint32 `protobuf:"varint,11,opt,name=sandboxes_per_node,json=sandboxesPerNode,proto3" json:"sandboxes_per_node,omitempty"` - InstanceType string `protobuf:"bytes,12,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` - MachineCount uint32 `protobuf:"varint,13,opt,name=machine_count,json=machineCount,proto3" json:"machine_count,omitempty"` - ReadyMachineCount uint32 `protobuf:"varint,14,opt,name=ready_machine_count,json=readyMachineCount,proto3" json:"ready_machine_count,omitempty"` - Message string `protobuf:"bytes,15,opt,name=message,proto3" json:"message,omitempty"` - HourlyCostMicros int64 `protobuf:"varint,16,opt,name=hourly_cost_micros,json=hourlyCostMicros,proto3" json:"hourly_cost_micros,omitempty"` - TotalHourlyCostMicros int64 `protobuf:"varint,17,opt,name=total_hourly_cost_micros,json=totalHourlyCostMicros,proto3" json:"total_hourly_cost_micros,omitempty"` - DirectScaleEnabled bool `protobuf:"varint,18,opt,name=direct_scale_enabled,json=directScaleEnabled,proto3" json:"direct_scale_enabled,omitempty"` - Gpu string `protobuf:"bytes,19,opt,name=gpu,proto3" json:"gpu,omitempty"` - GpuCount uint32 `protobuf:"varint,20,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + AccountId string `protobuf:"bytes,2,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` + Region string `protobuf:"bytes,3,opt,name=region,proto3" json:"region,omitempty"` + ResourceName string `protobuf:"bytes,4,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` + ResourceUrl string `protobuf:"bytes,5,opt,name=resource_url,json=resourceUrl,proto3" json:"resource_url,omitempty"` + DestroyUrl string `protobuf:"bytes,6,opt,name=destroy_url,json=destroyUrl,proto3" json:"destroy_url,omitempty"` + Phase string `protobuf:"bytes,7,opt,name=phase,proto3" json:"phase,omitempty"` + DesiredNodes uint32 `protobuf:"varint,8,opt,name=desired_nodes,json=desiredNodes,proto3" json:"desired_nodes,omitempty"` + MaxNodes uint32 `protobuf:"varint,9,opt,name=max_nodes,json=maxNodes,proto3" json:"max_nodes,omitempty"` + TargetSandboxes uint32 `protobuf:"varint,10,opt,name=target_sandboxes,json=targetSandboxes,proto3" json:"target_sandboxes,omitempty"` + SandboxesPerNode uint32 `protobuf:"varint,11,opt,name=sandboxes_per_node,json=sandboxesPerNode,proto3" json:"sandboxes_per_node,omitempty"` + InstanceType string `protobuf:"bytes,12,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` + MachineCount uint32 `protobuf:"varint,13,opt,name=machine_count,json=machineCount,proto3" json:"machine_count,omitempty"` + ReadyMachineCount uint32 `protobuf:"varint,14,opt,name=ready_machine_count,json=readyMachineCount,proto3" json:"ready_machine_count,omitempty"` + Message string `protobuf:"bytes,15,opt,name=message,proto3" json:"message,omitempty"` + HourlyCostMicros int64 `protobuf:"varint,16,opt,name=hourly_cost_micros,json=hourlyCostMicros,proto3" json:"hourly_cost_micros,omitempty"` + TotalHourlyCostMicros int64 `protobuf:"varint,17,opt,name=total_hourly_cost_micros,json=totalHourlyCostMicros,proto3" json:"total_hourly_cost_micros,omitempty"` + DirectScaleEnabled bool `protobuf:"varint,18,opt,name=direct_scale_enabled,json=directScaleEnabled,proto3" json:"direct_scale_enabled,omitempty"` + Gpu string `protobuf:"bytes,19,opt,name=gpu,proto3" json:"gpu,omitempty"` + GpuCount uint32 `protobuf:"varint,20,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *BYOCPoolState) Reset() { *x = BYOCPoolState{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[72] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[72] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *BYOCPoolState) String() string { @@ -5699,7 +5487,7 @@ func (*BYOCPoolState) ProtoMessage() {} func (x *BYOCPoolState) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[72] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5855,20 +5643,17 @@ func (x *BYOCPoolState) GetGpuCount() uint32 { } type GetBYOCPoolRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` unknownFields protoimpl.UnknownFields - - PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetBYOCPoolRequest) Reset() { *x = GetBYOCPoolRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[73] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[73] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetBYOCPoolRequest) String() string { @@ -5879,7 +5664,7 @@ func (*GetBYOCPoolRequest) ProtoMessage() {} func (x *GetBYOCPoolRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[73] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5902,26 +5687,23 @@ func (x *GetBYOCPoolRequest) GetPoolName() string { } type GetBYOCPoolResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Pool *PrivatePool `protobuf:"bytes,3,opt,name=pool,proto3" json:"pool,omitempty"` - Ready bool `protobuf:"varint,4,opt,name=ready,proto3" json:"ready,omitempty"` - ReadyMachineCount uint32 `protobuf:"varint,5,opt,name=ready_machine_count,json=readyMachineCount,proto3" json:"ready_machine_count,omitempty"` - MachineCount uint32 `protobuf:"varint,6,opt,name=machine_count,json=machineCount,proto3" json:"machine_count,omitempty"` - Byoc *BYOCPoolState `protobuf:"bytes,7,opt,name=byoc,proto3" json:"byoc,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Pool *PrivatePool `protobuf:"bytes,3,opt,name=pool,proto3" json:"pool,omitempty"` + Ready bool `protobuf:"varint,4,opt,name=ready,proto3" json:"ready,omitempty"` + ReadyMachineCount uint32 `protobuf:"varint,5,opt,name=ready_machine_count,json=readyMachineCount,proto3" json:"ready_machine_count,omitempty"` + MachineCount uint32 `protobuf:"varint,6,opt,name=machine_count,json=machineCount,proto3" json:"machine_count,omitempty"` + Byoc *BYOCPoolState `protobuf:"bytes,7,opt,name=byoc,proto3" json:"byoc,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetBYOCPoolResponse) Reset() { *x = GetBYOCPoolResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[74] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[74] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetBYOCPoolResponse) String() string { @@ -5932,7 +5714,7 @@ func (*GetBYOCPoolResponse) ProtoMessage() {} func (x *GetBYOCPoolResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[74] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5997,22 +5779,19 @@ func (x *GetBYOCPoolResponse) GetByoc() *BYOCPoolState { } type ScaleBYOCPoolRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + DesiredNodes uint32 `protobuf:"varint,2,opt,name=desired_nodes,json=desiredNodes,proto3" json:"desired_nodes,omitempty"` + MaxNodes uint32 `protobuf:"varint,3,opt,name=max_nodes,json=maxNodes,proto3" json:"max_nodes,omitempty"` unknownFields protoimpl.UnknownFields - - PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` - DesiredNodes uint32 `protobuf:"varint,2,opt,name=desired_nodes,json=desiredNodes,proto3" json:"desired_nodes,omitempty"` - MaxNodes uint32 `protobuf:"varint,3,opt,name=max_nodes,json=maxNodes,proto3" json:"max_nodes,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ScaleBYOCPoolRequest) Reset() { *x = ScaleBYOCPoolRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[75] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[75] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ScaleBYOCPoolRequest) String() string { @@ -6023,7 +5802,7 @@ func (*ScaleBYOCPoolRequest) ProtoMessage() {} func (x *ScaleBYOCPoolRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[75] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6060,23 +5839,20 @@ func (x *ScaleBYOCPoolRequest) GetMaxNodes() uint32 { } type ScaleBYOCPoolResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Pool *PrivatePool `protobuf:"bytes,3,opt,name=pool,proto3" json:"pool,omitempty"` + Byoc *BYOCPoolState `protobuf:"bytes,4,opt,name=byoc,proto3" json:"byoc,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Pool *PrivatePool `protobuf:"bytes,3,opt,name=pool,proto3" json:"pool,omitempty"` - Byoc *BYOCPoolState `protobuf:"bytes,4,opt,name=byoc,proto3" json:"byoc,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ScaleBYOCPoolResponse) Reset() { *x = ScaleBYOCPoolResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[76] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[76] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ScaleBYOCPoolResponse) String() string { @@ -6087,7 +5863,7 @@ func (*ScaleBYOCPoolResponse) ProtoMessage() {} func (x *ScaleBYOCPoolResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[76] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6131,10 +5907,7 @@ func (x *ScaleBYOCPoolResponse) GetByoc() *BYOCPoolState { } type MarketplaceListing struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` SellerWorkspaceId string `protobuf:"bytes,2,opt,name=seller_workspace_id,json=sellerWorkspaceId,proto3" json:"seller_workspace_id,omitempty"` DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` @@ -6153,15 +5926,15 @@ type MarketplaceListing struct { Runtime string `protobuf:"bytes,16,opt,name=runtime,proto3" json:"runtime,omitempty"` // Seller-set on-demand rate, per GPU per hour. PricePerGpuHourCents uint32 `protobuf:"varint,17,opt,name=price_per_gpu_hour_cents,json=pricePerGpuHourCents,proto3" json:"price_per_gpu_hour_cents,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MarketplaceListing) Reset() { *x = MarketplaceListing{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[77] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[77] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MarketplaceListing) String() string { @@ -6172,7 +5945,7 @@ func (*MarketplaceListing) ProtoMessage() {} func (x *MarketplaceListing) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[77] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6307,10 +6080,7 @@ func (x *MarketplaceListing) GetPricePerGpuHourCents() uint32 { } type MarketplaceOffer struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` ListingId string `protobuf:"bytes,1,opt,name=listing_id,json=listingId,proto3" json:"listing_id,omitempty"` SellerWorkspaceId string `protobuf:"bytes,2,opt,name=seller_workspace_id,json=sellerWorkspaceId,proto3" json:"seller_workspace_id,omitempty"` DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` @@ -6332,15 +6102,15 @@ type MarketplaceOffer struct { // returned by marketplace search. Public bool `protobuf:"varint,18,opt,name=public,proto3" json:"public,omitempty"` PricePerGpuHourCents uint32 `protobuf:"varint,19,opt,name=price_per_gpu_hour_cents,json=pricePerGpuHourCents,proto3" json:"price_per_gpu_hour_cents,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MarketplaceOffer) Reset() { *x = MarketplaceOffer{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[78] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[78] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MarketplaceOffer) String() string { @@ -6351,7 +6121,7 @@ func (*MarketplaceOffer) ProtoMessage() {} func (x *MarketplaceOffer) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[78] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6500,30 +6270,27 @@ func (x *MarketplaceOffer) GetPricePerGpuHourCents() uint32 { } type CreateMarketplaceListingRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - Gpu string `protobuf:"bytes,2,opt,name=gpu,proto3" json:"gpu,omitempty"` - GpuCount uint32 `protobuf:"varint,3,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` - Source string `protobuf:"bytes,4,opt,name=source,proto3" json:"source,omitempty"` - Preemptible bool `protobuf:"varint,5,opt,name=preemptible,proto3" json:"preemptible,omitempty"` - Public bool `protobuf:"varint,6,opt,name=public,proto3" json:"public,omitempty"` - Region string `protobuf:"bytes,7,opt,name=region,proto3" json:"region,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Gpu string `protobuf:"bytes,2,opt,name=gpu,proto3" json:"gpu,omitempty"` + GpuCount uint32 `protobuf:"varint,3,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` + Source string `protobuf:"bytes,4,opt,name=source,proto3" json:"source,omitempty"` + Preemptible bool `protobuf:"varint,5,opt,name=preemptible,proto3" json:"preemptible,omitempty"` + Public bool `protobuf:"varint,6,opt,name=public,proto3" json:"public,omitempty"` + Region string `protobuf:"bytes,7,opt,name=region,proto3" json:"region,omitempty"` // Optional pool the listing's machines join. Reusing a pool across listings // shares machine caches; defaults to a name derived from the GPU type. PoolName string `protobuf:"bytes,8,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` PricePerGpuHourCents uint32 `protobuf:"varint,9,opt,name=price_per_gpu_hour_cents,json=pricePerGpuHourCents,proto3" json:"price_per_gpu_hour_cents,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CreateMarketplaceListingRequest) Reset() { *x = CreateMarketplaceListingRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[79] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[79] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateMarketplaceListingRequest) String() string { @@ -6534,7 +6301,7 @@ func (*CreateMarketplaceListingRequest) ProtoMessage() {} func (x *CreateMarketplaceListingRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[79] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6613,22 +6380,19 @@ func (x *CreateMarketplaceListingRequest) GetPricePerGpuHourCents() uint32 { } type CreateMarketplaceListingResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Listing *MarketplaceListing `protobuf:"bytes,3,opt,name=listing,proto3" json:"listing,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Listing *MarketplaceListing `protobuf:"bytes,3,opt,name=listing,proto3" json:"listing,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreateMarketplaceListingResponse) Reset() { *x = CreateMarketplaceListingResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[80] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[80] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateMarketplaceListingResponse) String() string { @@ -6639,7 +6403,7 @@ func (*CreateMarketplaceListingResponse) ProtoMessage() {} func (x *CreateMarketplaceListingResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[80] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6676,29 +6440,26 @@ func (x *CreateMarketplaceListingResponse) GetListing() *MarketplaceListing { } type UpdateMarketplaceListingRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ListingId string `protobuf:"bytes,1,opt,name=listing_id,json=listingId,proto3" json:"listing_id,omitempty"` - DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - Gpu string `protobuf:"bytes,3,opt,name=gpu,proto3" json:"gpu,omitempty"` - GpuCount uint32 `protobuf:"varint,4,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` - Source string `protobuf:"bytes,5,opt,name=source,proto3" json:"source,omitempty"` - Preemptible *bool `protobuf:"varint,6,opt,name=preemptible,proto3,oneof" json:"preemptible,omitempty"` - Public *bool `protobuf:"varint,7,opt,name=public,proto3,oneof" json:"public,omitempty"` - Status string `protobuf:"bytes,8,opt,name=status,proto3" json:"status,omitempty"` - Region string `protobuf:"bytes,9,opt,name=region,proto3" json:"region,omitempty"` - PricePerGpuHourCents *uint32 `protobuf:"varint,10,opt,name=price_per_gpu_hour_cents,json=pricePerGpuHourCents,proto3,oneof" json:"price_per_gpu_hour_cents,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + ListingId string `protobuf:"bytes,1,opt,name=listing_id,json=listingId,proto3" json:"listing_id,omitempty"` + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Gpu string `protobuf:"bytes,3,opt,name=gpu,proto3" json:"gpu,omitempty"` + GpuCount uint32 `protobuf:"varint,4,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` + Source string `protobuf:"bytes,5,opt,name=source,proto3" json:"source,omitempty"` + Preemptible *bool `protobuf:"varint,6,opt,name=preemptible,proto3,oneof" json:"preemptible,omitempty"` + Public *bool `protobuf:"varint,7,opt,name=public,proto3,oneof" json:"public,omitempty"` + Status string `protobuf:"bytes,8,opt,name=status,proto3" json:"status,omitempty"` + Region string `protobuf:"bytes,9,opt,name=region,proto3" json:"region,omitempty"` + PricePerGpuHourCents *uint32 `protobuf:"varint,10,opt,name=price_per_gpu_hour_cents,json=pricePerGpuHourCents,proto3,oneof" json:"price_per_gpu_hour_cents,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateMarketplaceListingRequest) Reset() { *x = UpdateMarketplaceListingRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[81] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[81] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateMarketplaceListingRequest) String() string { @@ -6709,7 +6470,7 @@ func (*UpdateMarketplaceListingRequest) ProtoMessage() {} func (x *UpdateMarketplaceListingRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[81] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6795,22 +6556,19 @@ func (x *UpdateMarketplaceListingRequest) GetPricePerGpuHourCents() uint32 { } type UpdateMarketplaceListingResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Listing *MarketplaceListing `protobuf:"bytes,3,opt,name=listing,proto3" json:"listing,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Listing *MarketplaceListing `protobuf:"bytes,3,opt,name=listing,proto3" json:"listing,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UpdateMarketplaceListingResponse) Reset() { *x = UpdateMarketplaceListingResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[82] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[82] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateMarketplaceListingResponse) String() string { @@ -6821,7 +6579,7 @@ func (*UpdateMarketplaceListingResponse) ProtoMessage() {} func (x *UpdateMarketplaceListingResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[82] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6858,20 +6616,17 @@ func (x *UpdateMarketplaceListingResponse) GetListing() *MarketplaceListing { } type DeleteMarketplaceListingRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ListingId string `protobuf:"bytes,1,opt,name=listing_id,json=listingId,proto3" json:"listing_id,omitempty"` unknownFields protoimpl.UnknownFields - - ListingId string `protobuf:"bytes,1,opt,name=listing_id,json=listingId,proto3" json:"listing_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteMarketplaceListingRequest) Reset() { *x = DeleteMarketplaceListingRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[83] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[83] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteMarketplaceListingRequest) String() string { @@ -6882,7 +6637,7 @@ func (*DeleteMarketplaceListingRequest) ProtoMessage() {} func (x *DeleteMarketplaceListingRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[83] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6905,21 +6660,18 @@ func (x *DeleteMarketplaceListingRequest) GetListingId() string { } type DeleteMarketplaceListingResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteMarketplaceListingResponse) Reset() { *x = DeleteMarketplaceListingResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[84] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[84] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteMarketplaceListingResponse) String() string { @@ -6930,7 +6682,7 @@ func (*DeleteMarketplaceListingResponse) ProtoMessage() {} func (x *DeleteMarketplaceListingResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[84] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6960,20 +6712,17 @@ func (x *DeleteMarketplaceListingResponse) GetErrMsg() string { } type ListMarketplaceListingsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Limit uint32 `protobuf:"varint,1,opt,name=limit,proto3" json:"limit,omitempty"` unknownFields protoimpl.UnknownFields - - Limit uint32 `protobuf:"varint,1,opt,name=limit,proto3" json:"limit,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListMarketplaceListingsRequest) Reset() { *x = ListMarketplaceListingsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[85] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[85] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListMarketplaceListingsRequest) String() string { @@ -6984,7 +6733,7 @@ func (*ListMarketplaceListingsRequest) ProtoMessage() {} func (x *ListMarketplaceListingsRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[85] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7007,22 +6756,19 @@ func (x *ListMarketplaceListingsRequest) GetLimit() uint32 { } type ListMarketplaceListingsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Listings []*MarketplaceListing `protobuf:"bytes,3,rep,name=listings,proto3" json:"listings,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Listings []*MarketplaceListing `protobuf:"bytes,3,rep,name=listings,proto3" json:"listings,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListMarketplaceListingsResponse) Reset() { *x = ListMarketplaceListingsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[86] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[86] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListMarketplaceListingsResponse) String() string { @@ -7033,7 +6779,7 @@ func (*ListMarketplaceListingsResponse) ProtoMessage() {} func (x *ListMarketplaceListingsResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[86] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7070,21 +6816,18 @@ func (x *ListMarketplaceListingsResponse) GetListings() []*MarketplaceListing { } type GetMarketplaceJoinCommandRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ListingId string `protobuf:"bytes,1,opt,name=listing_id,json=listingId,proto3" json:"listing_id,omitempty"` + Ttl string `protobuf:"bytes,2,opt,name=ttl,proto3" json:"ttl,omitempty"` unknownFields protoimpl.UnknownFields - - ListingId string `protobuf:"bytes,1,opt,name=listing_id,json=listingId,proto3" json:"listing_id,omitempty"` - Ttl string `protobuf:"bytes,2,opt,name=ttl,proto3" json:"ttl,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetMarketplaceJoinCommandRequest) Reset() { *x = GetMarketplaceJoinCommandRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[87] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[87] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetMarketplaceJoinCommandRequest) String() string { @@ -7095,7 +6838,7 @@ func (*GetMarketplaceJoinCommandRequest) ProtoMessage() {} func (x *GetMarketplaceJoinCommandRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[87] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7125,24 +6868,21 @@ func (x *GetMarketplaceJoinCommandRequest) GetTtl() string { } type GetMarketplaceJoinCommandResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Command string `protobuf:"bytes,3,opt,name=command,proto3" json:"command,omitempty"` + Token string `protobuf:"bytes,4,opt,name=token,proto3" json:"token,omitempty"` + ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Command string `protobuf:"bytes,3,opt,name=command,proto3" json:"command,omitempty"` - Token string `protobuf:"bytes,4,opt,name=token,proto3" json:"token,omitempty"` - ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetMarketplaceJoinCommandResponse) Reset() { *x = GetMarketplaceJoinCommandResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[88] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[88] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetMarketplaceJoinCommandResponse) String() string { @@ -7153,7 +6893,7 @@ func (*GetMarketplaceJoinCommandResponse) ProtoMessage() {} func (x *GetMarketplaceJoinCommandResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[88] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7204,21 +6944,18 @@ func (x *GetMarketplaceJoinCommandResponse) GetExpiresAt() *timestamppb.Timestam } type ListMarketplaceOffersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Gpu string `protobuf:"bytes,1,opt,name=gpu,proto3" json:"gpu,omitempty"` + Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` unknownFields protoimpl.UnknownFields - - Gpu string `protobuf:"bytes,1,opt,name=gpu,proto3" json:"gpu,omitempty"` - Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListMarketplaceOffersRequest) Reset() { *x = ListMarketplaceOffersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[89] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[89] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListMarketplaceOffersRequest) String() string { @@ -7229,7 +6966,7 @@ func (*ListMarketplaceOffersRequest) ProtoMessage() {} func (x *ListMarketplaceOffersRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[89] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7259,22 +6996,19 @@ func (x *ListMarketplaceOffersRequest) GetLimit() uint32 { } type ListMarketplaceOffersResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Offers []*MarketplaceOffer `protobuf:"bytes,3,rep,name=offers,proto3" json:"offers,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Offers []*MarketplaceOffer `protobuf:"bytes,3,rep,name=offers,proto3" json:"offers,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListMarketplaceOffersResponse) Reset() { *x = ListMarketplaceOffersResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[90] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[90] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListMarketplaceOffersResponse) String() string { @@ -7285,7 +7019,7 @@ func (*ListMarketplaceOffersResponse) ProtoMessage() {} func (x *ListMarketplaceOffersResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[90] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7322,20 +7056,17 @@ func (x *ListMarketplaceOffersResponse) GetOffers() []*MarketplaceOffer { } type GetMarketplaceOfferRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ListingId string `protobuf:"bytes,1,opt,name=listing_id,json=listingId,proto3" json:"listing_id,omitempty"` unknownFields protoimpl.UnknownFields - - ListingId string `protobuf:"bytes,1,opt,name=listing_id,json=listingId,proto3" json:"listing_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetMarketplaceOfferRequest) Reset() { *x = GetMarketplaceOfferRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[91] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[91] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetMarketplaceOfferRequest) String() string { @@ -7346,7 +7077,7 @@ func (*GetMarketplaceOfferRequest) ProtoMessage() {} func (x *GetMarketplaceOfferRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[91] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7369,22 +7100,19 @@ func (x *GetMarketplaceOfferRequest) GetListingId() string { } type GetMarketplaceOfferResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Offer *MarketplaceOffer `protobuf:"bytes,3,opt,name=offer,proto3" json:"offer,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Offer *MarketplaceOffer `protobuf:"bytes,3,opt,name=offer,proto3" json:"offer,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetMarketplaceOfferResponse) Reset() { *x = GetMarketplaceOfferResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[92] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[92] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetMarketplaceOfferResponse) String() string { @@ -7395,7 +7123,7 @@ func (*GetMarketplaceOfferResponse) ProtoMessage() {} func (x *GetMarketplaceOfferResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[92] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7434,10 +7162,7 @@ func (x *GetMarketplaceOfferResponse) GetOffer() *MarketplaceOffer { // A buyer's exclusive hold on GPUs of one seller machine. Billed on-demand // while held; workloads are launched onto it machine-pinned. type MarketplaceRental struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` ListingId string `protobuf:"bytes,2,opt,name=listing_id,json=listingId,proto3" json:"listing_id,omitempty"` ListingName string `protobuf:"bytes,3,opt,name=listing_name,json=listingName,proto3" json:"listing_name,omitempty"` @@ -7451,15 +7176,15 @@ type MarketplaceRental struct { // Rate snapshotted when the rental was created; seller price changes don't // affect rentals already held. PricePerGpuHourCents uint32 `protobuf:"varint,11,opt,name=price_per_gpu_hour_cents,json=pricePerGpuHourCents,proto3" json:"price_per_gpu_hour_cents,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MarketplaceRental) Reset() { *x = MarketplaceRental{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[93] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[93] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MarketplaceRental) String() string { @@ -7470,7 +7195,7 @@ func (*MarketplaceRental) ProtoMessage() {} func (x *MarketplaceRental) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[93] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7563,22 +7288,19 @@ func (x *MarketplaceRental) GetPricePerGpuHourCents() uint32 { } type CreateMarketplaceRentalRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ListingId string `protobuf:"bytes,1,opt,name=listing_id,json=listingId,proto3" json:"listing_id,omitempty"` + MachineId string `protobuf:"bytes,2,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` + GpuCount uint32 `protobuf:"varint,3,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` unknownFields protoimpl.UnknownFields - - ListingId string `protobuf:"bytes,1,opt,name=listing_id,json=listingId,proto3" json:"listing_id,omitempty"` - MachineId string `protobuf:"bytes,2,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` - GpuCount uint32 `protobuf:"varint,3,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreateMarketplaceRentalRequest) Reset() { *x = CreateMarketplaceRentalRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[94] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[94] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateMarketplaceRentalRequest) String() string { @@ -7589,7 +7311,7 @@ func (*CreateMarketplaceRentalRequest) ProtoMessage() {} func (x *CreateMarketplaceRentalRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[94] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7626,22 +7348,19 @@ func (x *CreateMarketplaceRentalRequest) GetGpuCount() uint32 { } type CreateMarketplaceRentalResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Rental *MarketplaceRental `protobuf:"bytes,3,opt,name=rental,proto3" json:"rental,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Rental *MarketplaceRental `protobuf:"bytes,3,opt,name=rental,proto3" json:"rental,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreateMarketplaceRentalResponse) Reset() { *x = CreateMarketplaceRentalResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[95] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[95] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateMarketplaceRentalResponse) String() string { @@ -7652,7 +7371,7 @@ func (*CreateMarketplaceRentalResponse) ProtoMessage() {} func (x *CreateMarketplaceRentalResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[95] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7689,18 +7408,16 @@ func (x *CreateMarketplaceRentalResponse) GetRental() *MarketplaceRental { } type ListMarketplaceRentalsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListMarketplaceRentalsRequest) Reset() { *x = ListMarketplaceRentalsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[96] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[96] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListMarketplaceRentalsRequest) String() string { @@ -7711,7 +7428,7 @@ func (*ListMarketplaceRentalsRequest) ProtoMessage() {} func (x *ListMarketplaceRentalsRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[96] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7727,22 +7444,19 @@ func (*ListMarketplaceRentalsRequest) Descriptor() ([]byte, []int) { } type ListMarketplaceRentalsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Rentals []*MarketplaceRental `protobuf:"bytes,3,rep,name=rentals,proto3" json:"rentals,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Rentals []*MarketplaceRental `protobuf:"bytes,3,rep,name=rentals,proto3" json:"rentals,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListMarketplaceRentalsResponse) Reset() { *x = ListMarketplaceRentalsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[97] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[97] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListMarketplaceRentalsResponse) String() string { @@ -7753,7 +7467,7 @@ func (*ListMarketplaceRentalsResponse) ProtoMessage() {} func (x *ListMarketplaceRentalsResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[97] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7790,20 +7504,17 @@ func (x *ListMarketplaceRentalsResponse) GetRentals() []*MarketplaceRental { } type DeleteMarketplaceRentalRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + RentalId string `protobuf:"bytes,1,opt,name=rental_id,json=rentalId,proto3" json:"rental_id,omitempty"` unknownFields protoimpl.UnknownFields - - RentalId string `protobuf:"bytes,1,opt,name=rental_id,json=rentalId,proto3" json:"rental_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteMarketplaceRentalRequest) Reset() { *x = DeleteMarketplaceRentalRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[98] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[98] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteMarketplaceRentalRequest) String() string { @@ -7814,7 +7525,7 @@ func (*DeleteMarketplaceRentalRequest) ProtoMessage() {} func (x *DeleteMarketplaceRentalRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[98] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7837,21 +7548,18 @@ func (x *DeleteMarketplaceRentalRequest) GetRentalId() string { } type DeleteMarketplaceRentalResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteMarketplaceRentalResponse) Reset() { *x = DeleteMarketplaceRentalResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[99] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[99] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteMarketplaceRentalResponse) String() string { @@ -7862,7 +7570,7 @@ func (*DeleteMarketplaceRentalResponse) ProtoMessage() {} func (x *DeleteMarketplaceRentalResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[99] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7892,28 +7600,25 @@ func (x *DeleteMarketplaceRentalResponse) GetErrMsg() string { } type LaunchRentalWorkloadRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RentalId string `protobuf:"bytes,1,opt,name=rental_id,json=rentalId,proto3" json:"rental_id,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + RentalId string `protobuf:"bytes,1,opt,name=rental_id,json=rentalId,proto3" json:"rental_id,omitempty"` // "pod" runs the image's own entrypoint (e.g. a vLLM server); "shell" // starts an SSH-able container reachable via `beam shell`. - Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` - ImageId string `protobuf:"bytes,3,opt,name=image_id,json=imageId,proto3" json:"image_id,omitempty"` - Command []string `protobuf:"bytes,4,rep,name=command,proto3" json:"command,omitempty"` - Ports []uint32 `protobuf:"varint,5,rep,packed,name=ports,proto3" json:"ports,omitempty"` - GpuCount uint32 `protobuf:"varint,6,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` - Env []string `protobuf:"bytes,7,rep,name=env,proto3" json:"env,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + ImageId string `protobuf:"bytes,3,opt,name=image_id,json=imageId,proto3" json:"image_id,omitempty"` + Command []string `protobuf:"bytes,4,rep,name=command,proto3" json:"command,omitempty"` + Ports []uint32 `protobuf:"varint,5,rep,packed,name=ports,proto3" json:"ports,omitempty"` + GpuCount uint32 `protobuf:"varint,6,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` + Env []string `protobuf:"bytes,7,rep,name=env,proto3" json:"env,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LaunchRentalWorkloadRequest) Reset() { *x = LaunchRentalWorkloadRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[100] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[100] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LaunchRentalWorkloadRequest) String() string { @@ -7924,7 +7629,7 @@ func (*LaunchRentalWorkloadRequest) ProtoMessage() {} func (x *LaunchRentalWorkloadRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[100] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7989,27 +7694,24 @@ func (x *LaunchRentalWorkloadRequest) GetEnv() []string { } type LaunchRentalWorkloadResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + ContainerId string `protobuf:"bytes,3,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + StubId string `protobuf:"bytes,4,opt,name=stub_id,json=stubId,proto3" json:"stub_id,omitempty"` + Url string `protobuf:"bytes,5,opt,name=url,proto3" json:"url,omitempty"` + ShellCommand string `protobuf:"bytes,6,opt,name=shell_command,json=shellCommand,proto3" json:"shell_command,omitempty"` + Username string `protobuf:"bytes,7,opt,name=username,proto3" json:"username,omitempty"` + Password string `protobuf:"bytes,8,opt,name=password,proto3" json:"password,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - ContainerId string `protobuf:"bytes,3,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` - StubId string `protobuf:"bytes,4,opt,name=stub_id,json=stubId,proto3" json:"stub_id,omitempty"` - Url string `protobuf:"bytes,5,opt,name=url,proto3" json:"url,omitempty"` - ShellCommand string `protobuf:"bytes,6,opt,name=shell_command,json=shellCommand,proto3" json:"shell_command,omitempty"` - Username string `protobuf:"bytes,7,opt,name=username,proto3" json:"username,omitempty"` - Password string `protobuf:"bytes,8,opt,name=password,proto3" json:"password,omitempty"` + sizeCache protoimpl.SizeCache } func (x *LaunchRentalWorkloadResponse) Reset() { *x = LaunchRentalWorkloadResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[101] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[101] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LaunchRentalWorkloadResponse) String() string { @@ -8020,7 +7722,7 @@ func (*LaunchRentalWorkloadResponse) ProtoMessage() {} func (x *LaunchRentalWorkloadResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[101] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8092,21 +7794,18 @@ func (x *LaunchRentalWorkloadResponse) GetPassword() string { } type ListMarketplaceMachinesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ListingId string `protobuf:"bytes,1,opt,name=listing_id,json=listingId,proto3" json:"listing_id,omitempty"` + Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` unknownFields protoimpl.UnknownFields - - ListingId string `protobuf:"bytes,1,opt,name=listing_id,json=listingId,proto3" json:"listing_id,omitempty"` - Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListMarketplaceMachinesRequest) Reset() { *x = ListMarketplaceMachinesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[102] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[102] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListMarketplaceMachinesRequest) String() string { @@ -8117,7 +7816,7 @@ func (*ListMarketplaceMachinesRequest) ProtoMessage() {} func (x *ListMarketplaceMachinesRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[102] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8147,22 +7846,19 @@ func (x *ListMarketplaceMachinesRequest) GetLimit() uint32 { } type ListMarketplaceMachinesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Machines []*Machine `protobuf:"bytes,3,rep,name=machines,proto3" json:"machines,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Machines []*Machine `protobuf:"bytes,3,rep,name=machines,proto3" json:"machines,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListMarketplaceMachinesResponse) Reset() { *x = ListMarketplaceMachinesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[103] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[103] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListMarketplaceMachinesResponse) String() string { @@ -8173,7 +7869,7 @@ func (*ListMarketplaceMachinesResponse) ProtoMessage() {} func (x *ListMarketplaceMachinesResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[103] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8210,21 +7906,18 @@ func (x *ListMarketplaceMachinesResponse) GetMachines() []*Machine { } type ListMachineContainersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + MachineId string `protobuf:"bytes,2,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` unknownFields protoimpl.UnknownFields - - PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` - MachineId string `protobuf:"bytes,2,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListMachineContainersRequest) Reset() { *x = ListMachineContainersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[104] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[104] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListMachineContainersRequest) String() string { @@ -8235,7 +7928,7 @@ func (*ListMachineContainersRequest) ProtoMessage() {} func (x *ListMachineContainersRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[104] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8265,29 +7958,26 @@ func (x *ListMachineContainersRequest) GetMachineId() string { } type MachineContainer struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ContainerId string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + StubId string `protobuf:"bytes,2,opt,name=stub_id,json=stubId,proto3" json:"stub_id,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + WorkspaceId string `protobuf:"bytes,4,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` + Gpu string `protobuf:"bytes,5,opt,name=gpu,proto3" json:"gpu,omitempty"` + GpuCount uint32 `protobuf:"varint,6,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` + Cpu int64 `protobuf:"varint,7,opt,name=cpu,proto3" json:"cpu,omitempty"` + Memory int64 `protobuf:"varint,8,opt,name=memory,proto3" json:"memory,omitempty"` + ScheduledAt int64 `protobuf:"varint,9,opt,name=scheduled_at,json=scheduledAt,proto3" json:"scheduled_at,omitempty"` + StartedAt int64 `protobuf:"varint,10,opt,name=started_at,json=startedAt,proto3" json:"started_at,omitempty"` unknownFields protoimpl.UnknownFields - - ContainerId string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` - StubId string `protobuf:"bytes,2,opt,name=stub_id,json=stubId,proto3" json:"stub_id,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - WorkspaceId string `protobuf:"bytes,4,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` - Gpu string `protobuf:"bytes,5,opt,name=gpu,proto3" json:"gpu,omitempty"` - GpuCount uint32 `protobuf:"varint,6,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` - Cpu int64 `protobuf:"varint,7,opt,name=cpu,proto3" json:"cpu,omitempty"` - Memory int64 `protobuf:"varint,8,opt,name=memory,proto3" json:"memory,omitempty"` - ScheduledAt int64 `protobuf:"varint,9,opt,name=scheduled_at,json=scheduledAt,proto3" json:"scheduled_at,omitempty"` - StartedAt int64 `protobuf:"varint,10,opt,name=started_at,json=startedAt,proto3" json:"started_at,omitempty"` + sizeCache protoimpl.SizeCache } func (x *MachineContainer) Reset() { *x = MachineContainer{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[105] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[105] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MachineContainer) String() string { @@ -8298,7 +7988,7 @@ func (*MachineContainer) ProtoMessage() {} func (x *MachineContainer) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[105] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8384,22 +8074,19 @@ func (x *MachineContainer) GetStartedAt() int64 { } type ListMachineContainersResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Containers []*MachineContainer `protobuf:"bytes,3,rep,name=containers,proto3" json:"containers,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Containers []*MachineContainer `protobuf:"bytes,3,rep,name=containers,proto3" json:"containers,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListMachineContainersResponse) Reset() { *x = ListMachineContainersResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[106] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[106] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListMachineContainersResponse) String() string { @@ -8410,7 +8097,7 @@ func (*ListMachineContainersResponse) ProtoMessage() {} func (x *ListMachineContainersResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[106] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8447,20 +8134,17 @@ func (x *ListMachineContainersResponse) GetContainers() []*MachineContainer { } type CreatePoolRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Pool *PoolConfig `protobuf:"bytes,1,opt,name=pool,proto3" json:"pool,omitempty"` unknownFields protoimpl.UnknownFields - - Pool *PoolConfig `protobuf:"bytes,1,opt,name=pool,proto3" json:"pool,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreatePoolRequest) Reset() { *x = CreatePoolRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[107] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[107] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreatePoolRequest) String() string { @@ -8471,7 +8155,7 @@ func (*CreatePoolRequest) ProtoMessage() {} func (x *CreatePoolRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[107] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8494,22 +8178,19 @@ func (x *CreatePoolRequest) GetPool() *PoolConfig { } type CreatePoolResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Pool *PrivatePool `protobuf:"bytes,3,opt,name=pool,proto3" json:"pool,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Pool *PrivatePool `protobuf:"bytes,3,opt,name=pool,proto3" json:"pool,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreatePoolResponse) Reset() { *x = CreatePoolResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[108] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[108] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreatePoolResponse) String() string { @@ -8520,7 +8201,7 @@ func (*CreatePoolResponse) ProtoMessage() {} func (x *CreatePoolResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[108] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8557,20 +8238,17 @@ func (x *CreatePoolResponse) GetPool() *PrivatePool { } type DeletePoolRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeletePoolRequest) Reset() { *x = DeletePoolRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[109] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[109] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeletePoolRequest) String() string { @@ -8581,7 +8259,7 @@ func (*DeletePoolRequest) ProtoMessage() {} func (x *DeletePoolRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[109] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8604,21 +8282,18 @@ func (x *DeletePoolRequest) GetName() string { } type DeletePoolResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeletePoolResponse) Reset() { *x = DeletePoolResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[110] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[110] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeletePoolResponse) String() string { @@ -8629,7 +8304,7 @@ func (*DeletePoolResponse) ProtoMessage() {} func (x *DeletePoolResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[110] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8659,22 +8334,19 @@ func (x *DeletePoolResponse) GetErrMsg() string { } type ExtendPoolCapacityRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Ttl string `protobuf:"bytes,2,opt,name=ttl,proto3" json:"ttl,omitempty"` + MaxSpend float64 `protobuf:"fixed64,3,opt,name=max_spend,json=maxSpend,proto3" json:"max_spend,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Ttl string `protobuf:"bytes,2,opt,name=ttl,proto3" json:"ttl,omitempty"` - MaxSpend float64 `protobuf:"fixed64,3,opt,name=max_spend,json=maxSpend,proto3" json:"max_spend,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ExtendPoolCapacityRequest) Reset() { *x = ExtendPoolCapacityRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[111] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[111] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ExtendPoolCapacityRequest) String() string { @@ -8685,7 +8357,7 @@ func (*ExtendPoolCapacityRequest) ProtoMessage() {} func (x *ExtendPoolCapacityRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[111] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8722,22 +8394,19 @@ func (x *ExtendPoolCapacityRequest) GetMaxSpend() float64 { } type ExtendPoolCapacityResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Pool *PrivatePool `protobuf:"bytes,3,opt,name=pool,proto3" json:"pool,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Pool *PrivatePool `protobuf:"bytes,3,opt,name=pool,proto3" json:"pool,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ExtendPoolCapacityResponse) Reset() { *x = ExtendPoolCapacityResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[112] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[112] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ExtendPoolCapacityResponse) String() string { @@ -8748,7 +8417,7 @@ func (*ExtendPoolCapacityResponse) ProtoMessage() {} func (x *ExtendPoolCapacityResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[112] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8785,21 +8454,18 @@ func (x *ExtendPoolCapacityResponse) GetPool() *PrivatePool { } type CreatePoolJoinTokenRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + Ttl string `protobuf:"bytes,2,opt,name=ttl,proto3" json:"ttl,omitempty"` unknownFields protoimpl.UnknownFields - - PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` - Ttl string `protobuf:"bytes,2,opt,name=ttl,proto3" json:"ttl,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreatePoolJoinTokenRequest) Reset() { *x = CreatePoolJoinTokenRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[113] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[113] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreatePoolJoinTokenRequest) String() string { @@ -8810,7 +8476,7 @@ func (*CreatePoolJoinTokenRequest) ProtoMessage() {} func (x *CreatePoolJoinTokenRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[113] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8840,23 +8506,20 @@ func (x *CreatePoolJoinTokenRequest) GetTtl() string { } type CreatePoolJoinTokenResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Token string `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"` + ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Token string `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"` - ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreatePoolJoinTokenResponse) Reset() { *x = CreatePoolJoinTokenResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[114] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[114] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreatePoolJoinTokenResponse) String() string { @@ -8867,7 +8530,7 @@ func (*CreatePoolJoinTokenResponse) ProtoMessage() {} func (x *CreatePoolJoinTokenResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[114] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8911,20 +8574,17 @@ func (x *CreatePoolJoinTokenResponse) GetExpiresAt() *timestamppb.Timestamp { } type RevokePoolJoinTokenRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` unknownFields protoimpl.UnknownFields - - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RevokePoolJoinTokenRequest) Reset() { *x = RevokePoolJoinTokenRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[115] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[115] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RevokePoolJoinTokenRequest) String() string { @@ -8935,7 +8595,7 @@ func (*RevokePoolJoinTokenRequest) ProtoMessage() {} func (x *RevokePoolJoinTokenRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[115] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -8958,21 +8618,18 @@ func (x *RevokePoolJoinTokenRequest) GetToken() string { } type RevokePoolJoinTokenResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RevokePoolJoinTokenResponse) Reset() { *x = RevokePoolJoinTokenResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[116] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[116] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RevokePoolJoinTokenResponse) String() string { @@ -8983,7 +8640,7 @@ func (*RevokePoolJoinTokenResponse) ProtoMessage() {} func (x *RevokePoolJoinTokenResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[116] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -9013,21 +8670,18 @@ func (x *RevokePoolJoinTokenResponse) GetErrMsg() string { } type GetPoolJoinCommandRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + Ttl string `protobuf:"bytes,2,opt,name=ttl,proto3" json:"ttl,omitempty"` unknownFields protoimpl.UnknownFields - - PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` - Ttl string `protobuf:"bytes,2,opt,name=ttl,proto3" json:"ttl,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetPoolJoinCommandRequest) Reset() { *x = GetPoolJoinCommandRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[117] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[117] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetPoolJoinCommandRequest) String() string { @@ -9038,7 +8692,7 @@ func (*GetPoolJoinCommandRequest) ProtoMessage() {} func (x *GetPoolJoinCommandRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[117] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -9068,24 +8722,21 @@ func (x *GetPoolJoinCommandRequest) GetTtl() string { } type GetPoolJoinCommandResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Command string `protobuf:"bytes,3,opt,name=command,proto3" json:"command,omitempty"` + Token string `protobuf:"bytes,4,opt,name=token,proto3" json:"token,omitempty"` + ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Command string `protobuf:"bytes,3,opt,name=command,proto3" json:"command,omitempty"` - Token string `protobuf:"bytes,4,opt,name=token,proto3" json:"token,omitempty"` - ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetPoolJoinCommandResponse) Reset() { *x = GetPoolJoinCommandResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[118] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[118] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetPoolJoinCommandResponse) String() string { @@ -9096,7 +8747,7 @@ func (*GetPoolJoinCommandResponse) ProtoMessage() {} func (x *GetPoolJoinCommandResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[118] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -9147,21 +8798,18 @@ func (x *GetPoolJoinCommandResponse) GetExpiresAt() *timestamppb.Timestamp { } type ListPoolMachinesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` unknownFields protoimpl.UnknownFields - - PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` - Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListPoolMachinesRequest) Reset() { *x = ListPoolMachinesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[119] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[119] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListPoolMachinesRequest) String() string { @@ -9172,7 +8820,7 @@ func (*ListPoolMachinesRequest) ProtoMessage() {} func (x *ListPoolMachinesRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[119] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -9202,22 +8850,19 @@ func (x *ListPoolMachinesRequest) GetLimit() uint32 { } type ListPoolMachinesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Machines []*Machine `protobuf:"bytes,3,rep,name=machines,proto3" json:"machines,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Machines []*Machine `protobuf:"bytes,3,rep,name=machines,proto3" json:"machines,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListPoolMachinesResponse) Reset() { *x = ListPoolMachinesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[120] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[120] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListPoolMachinesResponse) String() string { @@ -9228,7 +8873,7 @@ func (*ListPoolMachinesResponse) ProtoMessage() {} func (x *ListPoolMachinesResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[120] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -9265,36 +8910,33 @@ func (x *ListPoolMachinesResponse) GetMachines() []*Machine { } type AgentBootstrapConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - GatewayHttpUrl string `protobuf:"bytes,1,opt,name=gateway_http_url,json=gatewayHttpUrl,proto3" json:"gateway_http_url,omitempty"` - GatewayGrpcHost string `protobuf:"bytes,2,opt,name=gateway_grpc_host,json=gatewayGrpcHost,proto3" json:"gateway_grpc_host,omitempty"` - GatewayGrpcPort int32 `protobuf:"varint,3,opt,name=gateway_grpc_port,json=gatewayGrpcPort,proto3" json:"gateway_grpc_port,omitempty"` - GatewayGrpcTls bool `protobuf:"varint,4,opt,name=gateway_grpc_tls,json=gatewayGrpcTls,proto3" json:"gateway_grpc_tls,omitempty"` - WorkspaceId string `protobuf:"bytes,5,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` - PoolName string `protobuf:"bytes,6,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` - Transport string `protobuf:"bytes,7,opt,name=transport,proto3" json:"transport,omitempty"` - Executor string `protobuf:"bytes,8,opt,name=executor,proto3" json:"executor,omitempty"` - Fallback string `protobuf:"bytes,9,opt,name=fallback,proto3" json:"fallback,omitempty"` - DisabledServices []string `protobuf:"bytes,10,rep,name=disabled_services,json=disabledServices,proto3" json:"disabled_services,omitempty"` - ImageRegistryStore string `protobuf:"bytes,11,opt,name=image_registry_store,json=imageRegistryStore,proto3" json:"image_registry_store,omitempty"` - ImageClipVersion uint32 `protobuf:"varint,12,opt,name=image_clip_version,json=imageClipVersion,proto3" json:"image_clip_version,omitempty"` - ImageLocalCacheEnabled bool `protobuf:"varint,13,opt,name=image_local_cache_enabled,json=imageLocalCacheEnabled,proto3" json:"image_local_cache_enabled,omitempty"` - Telemetry *AgentTelemetryConfig `protobuf:"bytes,14,opt,name=telemetry,proto3" json:"telemetry,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + GatewayHttpUrl string `protobuf:"bytes,1,opt,name=gateway_http_url,json=gatewayHttpUrl,proto3" json:"gateway_http_url,omitempty"` + GatewayGrpcHost string `protobuf:"bytes,2,opt,name=gateway_grpc_host,json=gatewayGrpcHost,proto3" json:"gateway_grpc_host,omitempty"` + GatewayGrpcPort int32 `protobuf:"varint,3,opt,name=gateway_grpc_port,json=gatewayGrpcPort,proto3" json:"gateway_grpc_port,omitempty"` + GatewayGrpcTls bool `protobuf:"varint,4,opt,name=gateway_grpc_tls,json=gatewayGrpcTls,proto3" json:"gateway_grpc_tls,omitempty"` + WorkspaceId string `protobuf:"bytes,5,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` + PoolName string `protobuf:"bytes,6,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + Transport string `protobuf:"bytes,7,opt,name=transport,proto3" json:"transport,omitempty"` + Executor string `protobuf:"bytes,8,opt,name=executor,proto3" json:"executor,omitempty"` + Fallback string `protobuf:"bytes,9,opt,name=fallback,proto3" json:"fallback,omitempty"` + DisabledServices []string `protobuf:"bytes,10,rep,name=disabled_services,json=disabledServices,proto3" json:"disabled_services,omitempty"` + ImageRegistryStore string `protobuf:"bytes,11,opt,name=image_registry_store,json=imageRegistryStore,proto3" json:"image_registry_store,omitempty"` + ImageClipVersion uint32 `protobuf:"varint,12,opt,name=image_clip_version,json=imageClipVersion,proto3" json:"image_clip_version,omitempty"` + ImageLocalCacheEnabled bool `protobuf:"varint,13,opt,name=image_local_cache_enabled,json=imageLocalCacheEnabled,proto3" json:"image_local_cache_enabled,omitempty"` + Telemetry *AgentTelemetryConfig `protobuf:"bytes,14,opt,name=telemetry,proto3" json:"telemetry,omitempty"` // Only set for marketplace pools: lets workers on seller machines meter // buyer usage and report it to the billing service. - Billing *AgentBillingConfig `protobuf:"bytes,15,opt,name=billing,proto3" json:"billing,omitempty"` + Billing *AgentBillingConfig `protobuf:"bytes,15,opt,name=billing,proto3" json:"billing,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AgentBootstrapConfig) Reset() { *x = AgentBootstrapConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[121] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[121] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AgentBootstrapConfig) String() string { @@ -9305,7 +8947,7 @@ func (*AgentBootstrapConfig) ProtoMessage() {} func (x *AgentBootstrapConfig) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[121] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -9426,24 +9068,21 @@ func (x *AgentBootstrapConfig) GetBilling() *AgentBillingConfig { } type AgentBillingConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - UsageEndpoint string `protobuf:"bytes,1,opt,name=usage_endpoint,json=usageEndpoint,proto3" json:"usage_endpoint,omitempty"` - UsageToken string `protobuf:"bytes,2,opt,name=usage_token,json=usageToken,proto3" json:"usage_token,omitempty"` - CostHookEndpoint string `protobuf:"bytes,3,opt,name=cost_hook_endpoint,json=costHookEndpoint,proto3" json:"cost_hook_endpoint,omitempty"` - CostHookToken string `protobuf:"bytes,4,opt,name=cost_hook_token,json=costHookToken,proto3" json:"cost_hook_token,omitempty"` - BillableMarginPct float64 `protobuf:"fixed64,5,opt,name=billable_margin_pct,json=billableMarginPct,proto3" json:"billable_margin_pct,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + UsageEndpoint string `protobuf:"bytes,1,opt,name=usage_endpoint,json=usageEndpoint,proto3" json:"usage_endpoint,omitempty"` + UsageToken string `protobuf:"bytes,2,opt,name=usage_token,json=usageToken,proto3" json:"usage_token,omitempty"` + CostHookEndpoint string `protobuf:"bytes,3,opt,name=cost_hook_endpoint,json=costHookEndpoint,proto3" json:"cost_hook_endpoint,omitempty"` + CostHookToken string `protobuf:"bytes,4,opt,name=cost_hook_token,json=costHookToken,proto3" json:"cost_hook_token,omitempty"` + BillableMarginPct float64 `protobuf:"fixed64,5,opt,name=billable_margin_pct,json=billableMarginPct,proto3" json:"billable_margin_pct,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AgentBillingConfig) Reset() { *x = AgentBillingConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[122] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[122] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AgentBillingConfig) String() string { @@ -9454,7 +9093,7 @@ func (*AgentBillingConfig) ProtoMessage() {} func (x *AgentBillingConfig) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[122] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -9505,23 +9144,20 @@ func (x *AgentBillingConfig) GetBillableMarginPct() float64 { } type AgentTelemetryConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + StreamPrefix string `protobuf:"bytes,2,opt,name=stream_prefix,json=streamPrefix,proto3" json:"stream_prefix,omitempty"` + Logs *AgentTelemetrySinkConfig `protobuf:"bytes,3,opt,name=logs,proto3" json:"logs,omitempty"` + Events *AgentTelemetrySinkConfig `protobuf:"bytes,4,opt,name=events,proto3" json:"events,omitempty"` unknownFields protoimpl.UnknownFields - - Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` - StreamPrefix string `protobuf:"bytes,2,opt,name=stream_prefix,json=streamPrefix,proto3" json:"stream_prefix,omitempty"` - Logs *AgentTelemetrySinkConfig `protobuf:"bytes,3,opt,name=logs,proto3" json:"logs,omitempty"` - Events *AgentTelemetrySinkConfig `protobuf:"bytes,4,opt,name=events,proto3" json:"events,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AgentTelemetryConfig) Reset() { *x = AgentTelemetryConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[123] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[123] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AgentTelemetryConfig) String() string { @@ -9532,7 +9168,7 @@ func (*AgentTelemetryConfig) ProtoMessage() {} func (x *AgentTelemetryConfig) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[123] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -9576,22 +9212,19 @@ func (x *AgentTelemetryConfig) GetEvents() *AgentTelemetrySinkConfig { } type AgentTelemetrySinkConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Destination string `protobuf:"bytes,1,opt,name=destination,proto3" json:"destination,omitempty"` + Credential string `protobuf:"bytes,2,opt,name=credential,proto3" json:"credential,omitempty"` + StreamPrefix string `protobuf:"bytes,3,opt,name=stream_prefix,json=streamPrefix,proto3" json:"stream_prefix,omitempty"` unknownFields protoimpl.UnknownFields - - Destination string `protobuf:"bytes,1,opt,name=destination,proto3" json:"destination,omitempty"` - Credential string `protobuf:"bytes,2,opt,name=credential,proto3" json:"credential,omitempty"` - StreamPrefix string `protobuf:"bytes,3,opt,name=stream_prefix,json=streamPrefix,proto3" json:"stream_prefix,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AgentTelemetrySinkConfig) Reset() { *x = AgentTelemetrySinkConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[124] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[124] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AgentTelemetrySinkConfig) String() string { @@ -9602,7 +9235,7 @@ func (*AgentTelemetrySinkConfig) ProtoMessage() {} func (x *AgentTelemetrySinkConfig) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[124] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -9639,10 +9272,7 @@ func (x *AgentTelemetrySinkConfig) GetStreamPrefix() string { } type JoinAgentRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` JoinToken string `protobuf:"bytes,1,opt,name=join_token,json=joinToken,proto3" json:"join_token,omitempty"` MachineFingerprint string `protobuf:"bytes,2,opt,name=machine_fingerprint,json=machineFingerprint,proto3" json:"machine_fingerprint,omitempty"` Hostname string `protobuf:"bytes,3,opt,name=hostname,proto3" json:"hostname,omitempty"` @@ -9662,16 +9292,16 @@ type JoinAgentRequest struct { // Optional per-machine worker image override. The gateway remembers the // generated value as a baseline so untouched installs continue to follow // future image tag changes while manually edited values remain pinned. - WorkerImage string `protobuf:"bytes,17,opt,name=worker_image,json=workerImage,proto3" json:"worker_image,omitempty"` + WorkerImage string `protobuf:"bytes,17,opt,name=worker_image,json=workerImage,proto3" json:"worker_image,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *JoinAgentRequest) Reset() { *x = JoinAgentRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[125] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[125] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *JoinAgentRequest) String() string { @@ -9682,7 +9312,7 @@ func (*JoinAgentRequest) ProtoMessage() {} func (x *JoinAgentRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[125] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -9817,26 +9447,23 @@ func (x *JoinAgentRequest) GetWorkerImage() string { } type JoinAgentResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + WorkspaceId string `protobuf:"bytes,3,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` + PoolName string `protobuf:"bytes,4,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + MachineId string `protobuf:"bytes,5,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` + AgentToken string `protobuf:"bytes,6,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` + Bootstrap *AgentBootstrapConfig `protobuf:"bytes,7,opt,name=bootstrap,proto3" json:"bootstrap,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - WorkspaceId string `protobuf:"bytes,3,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` - PoolName string `protobuf:"bytes,4,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` - MachineId string `protobuf:"bytes,5,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` - AgentToken string `protobuf:"bytes,6,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` - Bootstrap *AgentBootstrapConfig `protobuf:"bytes,7,opt,name=bootstrap,proto3" json:"bootstrap,omitempty"` + sizeCache protoimpl.SizeCache } func (x *JoinAgentResponse) Reset() { *x = JoinAgentResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[126] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[126] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *JoinAgentResponse) String() string { @@ -9847,7 +9474,7 @@ func (*JoinAgentResponse) ProtoMessage() {} func (x *JoinAgentResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[126] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -9912,23 +9539,20 @@ func (x *JoinAgentResponse) GetBootstrap() *AgentBootstrapConfig { } type AgentPreflightCheck struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Ok bool `protobuf:"varint,2,opt,name=ok,proto3" json:"ok,omitempty"` + Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` + Severity string `protobuf:"bytes,4,opt,name=severity,proto3" json:"severity,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Ok bool `protobuf:"varint,2,opt,name=ok,proto3" json:"ok,omitempty"` - Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` - Severity string `protobuf:"bytes,4,opt,name=severity,proto3" json:"severity,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AgentPreflightCheck) Reset() { *x = AgentPreflightCheck{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[127] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[127] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AgentPreflightCheck) String() string { @@ -9939,7 +9563,7 @@ func (*AgentPreflightCheck) ProtoMessage() {} func (x *AgentPreflightCheck) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[127] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -9983,34 +9607,31 @@ func (x *AgentPreflightCheck) GetSeverity() string { } type AgentRoute struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + RouteId string `protobuf:"bytes,1,opt,name=route_id,json=routeId,proto3" json:"route_id,omitempty"` + WorkspaceId string `protobuf:"bytes,2,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` + PoolName string `protobuf:"bytes,3,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + MachineId string `protobuf:"bytes,4,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` + WorkerId string `protobuf:"bytes,5,opt,name=worker_id,json=workerId,proto3" json:"worker_id,omitempty"` + ContainerId string `protobuf:"bytes,6,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + Kind string `protobuf:"bytes,7,opt,name=kind,proto3" json:"kind,omitempty"` + Port int32 `protobuf:"varint,8,opt,name=port,proto3" json:"port,omitempty"` + Protocol string `protobuf:"bytes,9,opt,name=protocol,proto3" json:"protocol,omitempty"` + Transport string `protobuf:"bytes,10,opt,name=transport,proto3" json:"transport,omitempty"` + LocalTarget string `protobuf:"bytes,11,opt,name=local_target,json=localTarget,proto3" json:"local_target,omitempty"` + ProxyTarget string `protobuf:"bytes,12,opt,name=proxy_target,json=proxyTarget,proto3" json:"proxy_target,omitempty"` + State string `protobuf:"bytes,13,opt,name=state,proto3" json:"state,omitempty"` + Error string `protobuf:"bytes,14,opt,name=error,proto3" json:"error,omitempty"` + UpdatedAt int64 `protobuf:"varint,15,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` unknownFields protoimpl.UnknownFields - - RouteId string `protobuf:"bytes,1,opt,name=route_id,json=routeId,proto3" json:"route_id,omitempty"` - WorkspaceId string `protobuf:"bytes,2,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` - PoolName string `protobuf:"bytes,3,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` - MachineId string `protobuf:"bytes,4,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` - WorkerId string `protobuf:"bytes,5,opt,name=worker_id,json=workerId,proto3" json:"worker_id,omitempty"` - ContainerId string `protobuf:"bytes,6,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` - Kind string `protobuf:"bytes,7,opt,name=kind,proto3" json:"kind,omitempty"` - Port int32 `protobuf:"varint,8,opt,name=port,proto3" json:"port,omitempty"` - Protocol string `protobuf:"bytes,9,opt,name=protocol,proto3" json:"protocol,omitempty"` - Transport string `protobuf:"bytes,10,opt,name=transport,proto3" json:"transport,omitempty"` - LocalTarget string `protobuf:"bytes,11,opt,name=local_target,json=localTarget,proto3" json:"local_target,omitempty"` - ProxyTarget string `protobuf:"bytes,12,opt,name=proxy_target,json=proxyTarget,proto3" json:"proxy_target,omitempty"` - State string `protobuf:"bytes,13,opt,name=state,proto3" json:"state,omitempty"` - Error string `protobuf:"bytes,14,opt,name=error,proto3" json:"error,omitempty"` - UpdatedAt int64 `protobuf:"varint,15,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AgentRoute) Reset() { *x = AgentRoute{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[128] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[128] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AgentRoute) String() string { @@ -10021,7 +9642,7 @@ func (*AgentRoute) ProtoMessage() {} func (x *AgentRoute) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[128] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -10142,21 +9763,18 @@ func (x *AgentRoute) GetUpdatedAt() int64 { } type RequestAgentTransportCredentialRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + AgentToken string `protobuf:"bytes,1,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` + Transport string `protobuf:"bytes,2,opt,name=transport,proto3" json:"transport,omitempty"` unknownFields protoimpl.UnknownFields - - AgentToken string `protobuf:"bytes,1,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` - Transport string `protobuf:"bytes,2,opt,name=transport,proto3" json:"transport,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RequestAgentTransportCredentialRequest) Reset() { *x = RequestAgentTransportCredentialRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[129] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[129] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RequestAgentTransportCredentialRequest) String() string { @@ -10167,7 +9785,7 @@ func (*RequestAgentTransportCredentialRequest) ProtoMessage() {} func (x *RequestAgentTransportCredentialRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[129] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -10197,25 +9815,22 @@ func (x *RequestAgentTransportCredentialRequest) GetTransport() string { } type RequestAgentTransportCredentialResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + AuthKey string `protobuf:"bytes,3,opt,name=auth_key,json=authKey,proto3" json:"auth_key,omitempty"` + ControlUrl string `protobuf:"bytes,4,opt,name=control_url,json=controlUrl,proto3" json:"control_url,omitempty"` + Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` + Ephemeral bool `protobuf:"varint,6,opt,name=ephemeral,proto3" json:"ephemeral,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - AuthKey string `protobuf:"bytes,3,opt,name=auth_key,json=authKey,proto3" json:"auth_key,omitempty"` - ControlUrl string `protobuf:"bytes,4,opt,name=control_url,json=controlUrl,proto3" json:"control_url,omitempty"` - Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` - Ephemeral bool `protobuf:"varint,6,opt,name=ephemeral,proto3" json:"ephemeral,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RequestAgentTransportCredentialResponse) Reset() { *x = RequestAgentTransportCredentialResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[130] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[130] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RequestAgentTransportCredentialResponse) String() string { @@ -10226,7 +9841,7 @@ func (*RequestAgentTransportCredentialResponse) ProtoMessage() {} func (x *RequestAgentTransportCredentialResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[130] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -10283,32 +9898,29 @@ func (x *RequestAgentTransportCredentialResponse) GetEphemeral() bool { return false } -type ListAgentRoutesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type CreateNodeEnrollmentRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + AgentToken string `protobuf:"bytes,1,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` unknownFields protoimpl.UnknownFields - - AgentToken string `protobuf:"bytes,1,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *ListAgentRoutesRequest) Reset() { - *x = ListAgentRoutesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[131] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } +func (x *CreateNodeEnrollmentRequest) Reset() { + *x = CreateNodeEnrollmentRequest{} + mi := &file_gateway_proto_msgTypes[131] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *ListAgentRoutesRequest) String() string { +func (x *CreateNodeEnrollmentRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListAgentRoutesRequest) ProtoMessage() {} +func (*CreateNodeEnrollmentRequest) ProtoMessage() {} -func (x *ListAgentRoutesRequest) ProtoReflect() protoreflect.Message { +func (x *CreateNodeEnrollmentRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[131] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -10318,46 +9930,43 @@ func (x *ListAgentRoutesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListAgentRoutesRequest.ProtoReflect.Descriptor instead. -func (*ListAgentRoutesRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use CreateNodeEnrollmentRequest.ProtoReflect.Descriptor instead. +func (*CreateNodeEnrollmentRequest) Descriptor() ([]byte, []int) { return file_gateway_proto_rawDescGZIP(), []int{131} } -func (x *ListAgentRoutesRequest) GetAgentToken() string { +func (x *CreateNodeEnrollmentRequest) GetAgentToken() string { if x != nil { return x.AgentToken } return "" } -type ListAgentRoutesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Routes []*AgentRoute `protobuf:"bytes,3,rep,name=routes,proto3" json:"routes,omitempty"` +type CreateNodeEnrollmentResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrorMsg string `protobuf:"bytes,2,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` + EnrollmentToken string `protobuf:"bytes,3,opt,name=enrollment_token,json=enrollmentToken,proto3" json:"enrollment_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *ListAgentRoutesResponse) Reset() { - *x = ListAgentRoutesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[132] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } +func (x *CreateNodeEnrollmentResponse) Reset() { + *x = CreateNodeEnrollmentResponse{} + mi := &file_gateway_proto_msgTypes[132] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *ListAgentRoutesResponse) String() string { +func (x *CreateNodeEnrollmentResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListAgentRoutesResponse) ProtoMessage() {} +func (*CreateNodeEnrollmentResponse) ProtoMessage() {} -func (x *ListAgentRoutesResponse) ProtoReflect() protoreflect.Message { +func (x *CreateNodeEnrollmentResponse) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[132] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -10367,63 +9976,55 @@ func (x *ListAgentRoutesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListAgentRoutesResponse.ProtoReflect.Descriptor instead. -func (*ListAgentRoutesResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use CreateNodeEnrollmentResponse.ProtoReflect.Descriptor instead. +func (*CreateNodeEnrollmentResponse) Descriptor() ([]byte, []int) { return file_gateway_proto_rawDescGZIP(), []int{132} } -func (x *ListAgentRoutesResponse) GetOk() bool { +func (x *CreateNodeEnrollmentResponse) GetOk() bool { if x != nil { return x.Ok } return false } -func (x *ListAgentRoutesResponse) GetErrMsg() string { +func (x *CreateNodeEnrollmentResponse) GetErrorMsg() string { if x != nil { - return x.ErrMsg + return x.ErrorMsg } return "" } -func (x *ListAgentRoutesResponse) GetRoutes() []*AgentRoute { +func (x *CreateNodeEnrollmentResponse) GetEnrollmentToken() string { if x != nil { - return x.Routes + return x.EnrollmentToken } - return nil + return "" } -type UpdateAgentRouteStatusRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type DeleteNodeEnrollmentRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + AgentToken string `protobuf:"bytes,1,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` unknownFields protoimpl.UnknownFields - - AgentToken string `protobuf:"bytes,1,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` - RouteId string `protobuf:"bytes,2,opt,name=route_id,json=routeId,proto3" json:"route_id,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - ProxyTarget string `protobuf:"bytes,4,opt,name=proxy_target,json=proxyTarget,proto3" json:"proxy_target,omitempty"` - Error string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"` - Attrs map[string]string `protobuf:"bytes,6,rep,name=attrs,proto3" json:"attrs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + sizeCache protoimpl.SizeCache } -func (x *UpdateAgentRouteStatusRequest) Reset() { - *x = UpdateAgentRouteStatusRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[133] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } +func (x *DeleteNodeEnrollmentRequest) Reset() { + *x = DeleteNodeEnrollmentRequest{} + mi := &file_gateway_proto_msgTypes[133] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *UpdateAgentRouteStatusRequest) String() string { +func (x *DeleteNodeEnrollmentRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateAgentRouteStatusRequest) ProtoMessage() {} +func (*DeleteNodeEnrollmentRequest) ProtoMessage() {} -func (x *UpdateAgentRouteStatusRequest) ProtoReflect() protoreflect.Message { +func (x *DeleteNodeEnrollmentRequest) ProtoReflect() protoreflect.Message { mi := &file_gateway_proto_msgTypes[133] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -10433,47 +10034,252 @@ func (x *UpdateAgentRouteStatusRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateAgentRouteStatusRequest.ProtoReflect.Descriptor instead. -func (*UpdateAgentRouteStatusRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use DeleteNodeEnrollmentRequest.ProtoReflect.Descriptor instead. +func (*DeleteNodeEnrollmentRequest) Descriptor() ([]byte, []int) { return file_gateway_proto_rawDescGZIP(), []int{133} } -func (x *UpdateAgentRouteStatusRequest) GetAgentToken() string { +func (x *DeleteNodeEnrollmentRequest) GetAgentToken() string { if x != nil { return x.AgentToken } return "" } -func (x *UpdateAgentRouteStatusRequest) GetRouteId() string { - if x != nil { - return x.RouteId - } - return "" +type DeleteNodeEnrollmentResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrorMsg string `protobuf:"bytes,2,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *UpdateAgentRouteStatusRequest) GetState() string { +func (x *DeleteNodeEnrollmentResponse) Reset() { + *x = DeleteNodeEnrollmentResponse{} + mi := &file_gateway_proto_msgTypes[134] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteNodeEnrollmentResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteNodeEnrollmentResponse) ProtoMessage() {} + +func (x *DeleteNodeEnrollmentResponse) ProtoReflect() protoreflect.Message { + mi := &file_gateway_proto_msgTypes[134] if x != nil { - return x.State + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *UpdateAgentRouteStatusRequest) GetProxyTarget() string { +// Deprecated: Use DeleteNodeEnrollmentResponse.ProtoReflect.Descriptor instead. +func (*DeleteNodeEnrollmentResponse) Descriptor() ([]byte, []int) { + return file_gateway_proto_rawDescGZIP(), []int{134} +} + +func (x *DeleteNodeEnrollmentResponse) GetOk() bool { if x != nil { - return x.ProxyTarget + return x.Ok } - return "" + return false } -func (x *UpdateAgentRouteStatusRequest) GetError() string { +func (x *DeleteNodeEnrollmentResponse) GetErrorMsg() string { if x != nil { - return x.Error + return x.ErrorMsg } return "" } -func (x *UpdateAgentRouteStatusRequest) GetAttrs() map[string]string { +type ListAgentRoutesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + AgentToken string `protobuf:"bytes,1,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListAgentRoutesRequest) Reset() { + *x = ListAgentRoutesRequest{} + mi := &file_gateway_proto_msgTypes[135] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListAgentRoutesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAgentRoutesRequest) ProtoMessage() {} + +func (x *ListAgentRoutesRequest) ProtoReflect() protoreflect.Message { + mi := &file_gateway_proto_msgTypes[135] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListAgentRoutesRequest.ProtoReflect.Descriptor instead. +func (*ListAgentRoutesRequest) Descriptor() ([]byte, []int) { + return file_gateway_proto_rawDescGZIP(), []int{135} +} + +func (x *ListAgentRoutesRequest) GetAgentToken() string { + if x != nil { + return x.AgentToken + } + return "" +} + +type ListAgentRoutesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Routes []*AgentRoute `protobuf:"bytes,3,rep,name=routes,proto3" json:"routes,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListAgentRoutesResponse) Reset() { + *x = ListAgentRoutesResponse{} + mi := &file_gateway_proto_msgTypes[136] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListAgentRoutesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAgentRoutesResponse) ProtoMessage() {} + +func (x *ListAgentRoutesResponse) ProtoReflect() protoreflect.Message { + mi := &file_gateway_proto_msgTypes[136] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListAgentRoutesResponse.ProtoReflect.Descriptor instead. +func (*ListAgentRoutesResponse) Descriptor() ([]byte, []int) { + return file_gateway_proto_rawDescGZIP(), []int{136} +} + +func (x *ListAgentRoutesResponse) GetOk() bool { + if x != nil { + return x.Ok + } + return false +} + +func (x *ListAgentRoutesResponse) GetErrMsg() string { + if x != nil { + return x.ErrMsg + } + return "" +} + +func (x *ListAgentRoutesResponse) GetRoutes() []*AgentRoute { + if x != nil { + return x.Routes + } + return nil +} + +type UpdateAgentRouteStatusRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + AgentToken string `protobuf:"bytes,1,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` + RouteId string `protobuf:"bytes,2,opt,name=route_id,json=routeId,proto3" json:"route_id,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + ProxyTarget string `protobuf:"bytes,4,opt,name=proxy_target,json=proxyTarget,proto3" json:"proxy_target,omitempty"` + Error string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"` + Attrs map[string]string `protobuf:"bytes,6,rep,name=attrs,proto3" json:"attrs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateAgentRouteStatusRequest) Reset() { + *x = UpdateAgentRouteStatusRequest{} + mi := &file_gateway_proto_msgTypes[137] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateAgentRouteStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateAgentRouteStatusRequest) ProtoMessage() {} + +func (x *UpdateAgentRouteStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_gateway_proto_msgTypes[137] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateAgentRouteStatusRequest.ProtoReflect.Descriptor instead. +func (*UpdateAgentRouteStatusRequest) Descriptor() ([]byte, []int) { + return file_gateway_proto_rawDescGZIP(), []int{137} +} + +func (x *UpdateAgentRouteStatusRequest) GetAgentToken() string { + if x != nil { + return x.AgentToken + } + return "" +} + +func (x *UpdateAgentRouteStatusRequest) GetRouteId() string { + if x != nil { + return x.RouteId + } + return "" +} + +func (x *UpdateAgentRouteStatusRequest) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *UpdateAgentRouteStatusRequest) GetProxyTarget() string { + if x != nil { + return x.ProxyTarget + } + return "" +} + +func (x *UpdateAgentRouteStatusRequest) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *UpdateAgentRouteStatusRequest) GetAttrs() map[string]string { if x != nil { return x.Attrs } @@ -10481,21 +10287,18 @@ func (x *UpdateAgentRouteStatusRequest) GetAttrs() map[string]string { } type UpdateAgentRouteStatusResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UpdateAgentRouteStatusResponse) Reset() { *x = UpdateAgentRouteStatusResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[134] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[138] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateAgentRouteStatusResponse) String() string { @@ -10505,8 +10308,8 @@ func (x *UpdateAgentRouteStatusResponse) String() string { func (*UpdateAgentRouteStatusResponse) ProtoMessage() {} func (x *UpdateAgentRouteStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[134] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[138] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -10518,7 +10321,7 @@ func (x *UpdateAgentRouteStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateAgentRouteStatusResponse.ProtoReflect.Descriptor instead. func (*UpdateAgentRouteStatusResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{134} + return file_gateway_proto_rawDescGZIP(), []int{138} } func (x *UpdateAgentRouteStatusResponse) GetOk() bool { @@ -10536,23 +10339,20 @@ func (x *UpdateAgentRouteStatusResponse) GetErrMsg() string { } type AgentWorkerSlot struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - WorkerId string `protobuf:"bytes,1,opt,name=worker_id,json=workerId,proto3" json:"worker_id,omitempty"` - WorkerToken string `protobuf:"bytes,2,opt,name=worker_token,json=workerToken,proto3" json:"worker_token,omitempty"` - PoolName string `protobuf:"bytes,3,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` - MachineId string `protobuf:"bytes,4,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` - Cpu int64 `protobuf:"varint,5,opt,name=cpu,proto3" json:"cpu,omitempty"` - Memory int64 `protobuf:"varint,6,opt,name=memory,proto3" json:"memory,omitempty"` - Gpu string `protobuf:"bytes,7,opt,name=gpu,proto3" json:"gpu,omitempty"` - GpuCount uint32 `protobuf:"varint,8,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` - GpuAssignment string `protobuf:"bytes,9,opt,name=gpu_assignment,json=gpuAssignment,proto3" json:"gpu_assignment,omitempty"` - NetworkPrefix string `protobuf:"bytes,10,opt,name=network_prefix,json=networkPrefix,proto3" json:"network_prefix,omitempty"` - WorkerImage string `protobuf:"bytes,11,opt,name=worker_image,json=workerImage,proto3" json:"worker_image,omitempty"` - NetworkSlotPoolSize uint32 `protobuf:"varint,12,opt,name=network_slot_pool_size,json=networkSlotPoolSize,proto3" json:"network_slot_pool_size,omitempty"` - ContainerStartConcurrency uint32 `protobuf:"varint,13,opt,name=container_start_concurrency,json=containerStartConcurrency,proto3" json:"container_start_concurrency,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + WorkerId string `protobuf:"bytes,1,opt,name=worker_id,json=workerId,proto3" json:"worker_id,omitempty"` + WorkerToken string `protobuf:"bytes,2,opt,name=worker_token,json=workerToken,proto3" json:"worker_token,omitempty"` + PoolName string `protobuf:"bytes,3,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + MachineId string `protobuf:"bytes,4,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` + Cpu int64 `protobuf:"varint,5,opt,name=cpu,proto3" json:"cpu,omitempty"` + Memory int64 `protobuf:"varint,6,opt,name=memory,proto3" json:"memory,omitempty"` + Gpu string `protobuf:"bytes,7,opt,name=gpu,proto3" json:"gpu,omitempty"` + GpuCount uint32 `protobuf:"varint,8,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` + GpuAssignment string `protobuf:"bytes,9,opt,name=gpu_assignment,json=gpuAssignment,proto3" json:"gpu_assignment,omitempty"` + NetworkPrefix string `protobuf:"bytes,10,opt,name=network_prefix,json=networkPrefix,proto3" json:"network_prefix,omitempty"` + WorkerImage string `protobuf:"bytes,11,opt,name=worker_image,json=workerImage,proto3" json:"worker_image,omitempty"` + NetworkSlotPoolSize uint32 `protobuf:"varint,12,opt,name=network_slot_pool_size,json=networkSlotPoolSize,proto3" json:"network_slot_pool_size,omitempty"` + ContainerStartConcurrency uint32 `protobuf:"varint,13,opt,name=container_start_concurrency,json=containerStartConcurrency,proto3" json:"container_start_concurrency,omitempty"` // Pool mode ("private" / "marketplace" / "external") and the container // runtime the worker must run with. Marketplace slots prefer gVisor but can // fall back to runc for incompatible GPU families. @@ -10575,15 +10375,15 @@ type AgentWorkerSlot struct { // Deterministic identity of the restart-relevant slot specification. Generation string `protobuf:"bytes,25,opt,name=generation,proto3" json:"generation,omitempty"` CpuAffinityEnforced bool `protobuf:"varint,26,opt,name=cpu_affinity_enforced,json=cpuAffinityEnforced,proto3" json:"cpu_affinity_enforced,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AgentWorkerSlot) Reset() { *x = AgentWorkerSlot{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[135] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[139] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AgentWorkerSlot) String() string { @@ -10593,8 +10393,8 @@ func (x *AgentWorkerSlot) String() string { func (*AgentWorkerSlot) ProtoMessage() {} func (x *AgentWorkerSlot) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[135] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[139] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -10606,7 +10406,7 @@ func (x *AgentWorkerSlot) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentWorkerSlot.ProtoReflect.Descriptor instead. func (*AgentWorkerSlot) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{135} + return file_gateway_proto_rawDescGZIP(), []int{139} } func (x *AgentWorkerSlot) GetWorkerId() string { @@ -10792,20 +10592,17 @@ func (x *AgentWorkerSlot) GetCpuAffinityEnforced() bool { } type StreamAgentRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + AgentToken string `protobuf:"bytes,1,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` unknownFields protoimpl.UnknownFields - - AgentToken string `protobuf:"bytes,1,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` + sizeCache protoimpl.SizeCache } func (x *StreamAgentRequest) Reset() { *x = StreamAgentRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[136] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[140] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StreamAgentRequest) String() string { @@ -10815,8 +10612,8 @@ func (x *StreamAgentRequest) String() string { func (*StreamAgentRequest) ProtoMessage() {} func (x *StreamAgentRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[136] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[140] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -10828,7 +10625,7 @@ func (x *StreamAgentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamAgentRequest.ProtoReflect.Descriptor instead. func (*StreamAgentRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{136} + return file_gateway_proto_rawDescGZIP(), []int{140} } func (x *StreamAgentRequest) GetAgentToken() string { @@ -10839,23 +10636,20 @@ func (x *StreamAgentRequest) GetAgentToken() string { } type StreamAgentResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Routes []*AgentRoute `protobuf:"bytes,3,rep,name=routes,proto3" json:"routes,omitempty"` + Slots []*AgentWorkerSlot `protobuf:"bytes,4,rep,name=slots,proto3" json:"slots,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Routes []*AgentRoute `protobuf:"bytes,3,rep,name=routes,proto3" json:"routes,omitempty"` - Slots []*AgentWorkerSlot `protobuf:"bytes,4,rep,name=slots,proto3" json:"slots,omitempty"` + sizeCache protoimpl.SizeCache } func (x *StreamAgentResponse) Reset() { *x = StreamAgentResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[137] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[141] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StreamAgentResponse) String() string { @@ -10865,8 +10659,8 @@ func (x *StreamAgentResponse) String() string { func (*StreamAgentResponse) ProtoMessage() {} func (x *StreamAgentResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[137] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[141] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -10878,7 +10672,7 @@ func (x *StreamAgentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamAgentResponse.ProtoReflect.Descriptor instead. func (*StreamAgentResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{137} + return file_gateway_proto_rawDescGZIP(), []int{141} } func (x *StreamAgentResponse) GetOk() bool { @@ -10910,25 +10704,22 @@ func (x *StreamAgentResponse) GetSlots() []*AgentWorkerSlot { } type AgentLogRecord struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` - WorkerId string `protobuf:"bytes,2,opt,name=worker_id,json=workerId,proto3" json:"worker_id,omitempty"` - Level string `protobuf:"bytes,3,opt,name=level,proto3" json:"level,omitempty"` - Stream string `protobuf:"bytes,4,opt,name=stream,proto3" json:"stream,omitempty"` - Line string `protobuf:"bytes,5,opt,name=line,proto3" json:"line,omitempty"` - TimestampUnixNano int64 `protobuf:"varint,6,opt,name=timestamp_unix_nano,json=timestampUnixNano,proto3" json:"timestamp_unix_nano,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` + WorkerId string `protobuf:"bytes,2,opt,name=worker_id,json=workerId,proto3" json:"worker_id,omitempty"` + Level string `protobuf:"bytes,3,opt,name=level,proto3" json:"level,omitempty"` + Stream string `protobuf:"bytes,4,opt,name=stream,proto3" json:"stream,omitempty"` + Line string `protobuf:"bytes,5,opt,name=line,proto3" json:"line,omitempty"` + TimestampUnixNano int64 `protobuf:"varint,6,opt,name=timestamp_unix_nano,json=timestampUnixNano,proto3" json:"timestamp_unix_nano,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AgentLogRecord) Reset() { *x = AgentLogRecord{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[138] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[142] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AgentLogRecord) String() string { @@ -10938,8 +10729,8 @@ func (x *AgentLogRecord) String() string { func (*AgentLogRecord) ProtoMessage() {} func (x *AgentLogRecord) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[138] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[142] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -10951,7 +10742,7 @@ func (x *AgentLogRecord) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentLogRecord.ProtoReflect.Descriptor instead. func (*AgentLogRecord) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{138} + return file_gateway_proto_rawDescGZIP(), []int{142} } func (x *AgentLogRecord) GetSource() string { @@ -10997,32 +10788,29 @@ func (x *AgentLogRecord) GetTimestampUnixNano() int64 { } type AgentMetricSnapshot struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TimestampUnixNano int64 `protobuf:"varint,1,opt,name=timestamp_unix_nano,json=timestampUnixNano,proto3" json:"timestamp_unix_nano,omitempty"` - CpuUtilizationPct float32 `protobuf:"fixed32,2,opt,name=cpu_utilization_pct,json=cpuUtilizationPct,proto3" json:"cpu_utilization_pct,omitempty"` - MemoryUsedMb uint64 `protobuf:"varint,3,opt,name=memory_used_mb,json=memoryUsedMb,proto3" json:"memory_used_mb,omitempty"` - MemoryTotalMb uint64 `protobuf:"varint,4,opt,name=memory_total_mb,json=memoryTotalMb,proto3" json:"memory_total_mb,omitempty"` - MemoryUtilizationPct float32 `protobuf:"fixed32,5,opt,name=memory_utilization_pct,json=memoryUtilizationPct,proto3" json:"memory_utilization_pct,omitempty"` - DiskUsedMb uint64 `protobuf:"varint,6,opt,name=disk_used_mb,json=diskUsedMb,proto3" json:"disk_used_mb,omitempty"` - DiskTotalMb uint64 `protobuf:"varint,7,opt,name=disk_total_mb,json=diskTotalMb,proto3" json:"disk_total_mb,omitempty"` - DiskUsagePct float32 `protobuf:"fixed32,8,opt,name=disk_usage_pct,json=diskUsagePct,proto3" json:"disk_usage_pct,omitempty"` - DiskPath string `protobuf:"bytes,9,opt,name=disk_path,json=diskPath,proto3" json:"disk_path,omitempty"` - WorkerCount uint32 `protobuf:"varint,10,opt,name=worker_count,json=workerCount,proto3" json:"worker_count,omitempty"` - ContainerCount uint32 `protobuf:"varint,11,opt,name=container_count,json=containerCount,proto3" json:"container_count,omitempty"` - FreeGpuCount uint32 `protobuf:"varint,12,opt,name=free_gpu_count,json=freeGpuCount,proto3" json:"free_gpu_count,omitempty"` - PathMetrics []*MachinePathMetrics `protobuf:"bytes,13,rep,name=path_metrics,json=pathMetrics,proto3" json:"path_metrics,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + TimestampUnixNano int64 `protobuf:"varint,1,opt,name=timestamp_unix_nano,json=timestampUnixNano,proto3" json:"timestamp_unix_nano,omitempty"` + CpuUtilizationPct float32 `protobuf:"fixed32,2,opt,name=cpu_utilization_pct,json=cpuUtilizationPct,proto3" json:"cpu_utilization_pct,omitempty"` + MemoryUsedMb uint64 `protobuf:"varint,3,opt,name=memory_used_mb,json=memoryUsedMb,proto3" json:"memory_used_mb,omitempty"` + MemoryTotalMb uint64 `protobuf:"varint,4,opt,name=memory_total_mb,json=memoryTotalMb,proto3" json:"memory_total_mb,omitempty"` + MemoryUtilizationPct float32 `protobuf:"fixed32,5,opt,name=memory_utilization_pct,json=memoryUtilizationPct,proto3" json:"memory_utilization_pct,omitempty"` + DiskUsedMb uint64 `protobuf:"varint,6,opt,name=disk_used_mb,json=diskUsedMb,proto3" json:"disk_used_mb,omitempty"` + DiskTotalMb uint64 `protobuf:"varint,7,opt,name=disk_total_mb,json=diskTotalMb,proto3" json:"disk_total_mb,omitempty"` + DiskUsagePct float32 `protobuf:"fixed32,8,opt,name=disk_usage_pct,json=diskUsagePct,proto3" json:"disk_usage_pct,omitempty"` + DiskPath string `protobuf:"bytes,9,opt,name=disk_path,json=diskPath,proto3" json:"disk_path,omitempty"` + WorkerCount uint32 `protobuf:"varint,10,opt,name=worker_count,json=workerCount,proto3" json:"worker_count,omitempty"` + ContainerCount uint32 `protobuf:"varint,11,opt,name=container_count,json=containerCount,proto3" json:"container_count,omitempty"` + FreeGpuCount uint32 `protobuf:"varint,12,opt,name=free_gpu_count,json=freeGpuCount,proto3" json:"free_gpu_count,omitempty"` + PathMetrics []*MachinePathMetrics `protobuf:"bytes,13,rep,name=path_metrics,json=pathMetrics,proto3" json:"path_metrics,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AgentMetricSnapshot) Reset() { *x = AgentMetricSnapshot{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[139] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[143] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AgentMetricSnapshot) String() string { @@ -11032,8 +10820,8 @@ func (x *AgentMetricSnapshot) String() string { func (*AgentMetricSnapshot) ProtoMessage() {} func (x *AgentMetricSnapshot) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[139] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[143] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -11045,7 +10833,7 @@ func (x *AgentMetricSnapshot) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentMetricSnapshot.ProtoReflect.Descriptor instead. func (*AgentMetricSnapshot) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{139} + return file_gateway_proto_rawDescGZIP(), []int{143} } func (x *AgentMetricSnapshot) GetTimestampUnixNano() int64 { @@ -11140,25 +10928,22 @@ func (x *AgentMetricSnapshot) GetPathMetrics() []*MachinePathMetrics { } type AgentEventRecord struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Action string `protobuf:"bytes,1,opt,name=action,proto3" json:"action,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` - Attrs map[string]string `protobuf:"bytes,4,rep,name=attrs,proto3" json:"attrs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - TimestampUnixNano int64 `protobuf:"varint,5,opt,name=timestamp_unix_nano,json=timestampUnixNano,proto3" json:"timestamp_unix_nano,omitempty"` - EventType string `protobuf:"bytes,6,opt,name=event_type,json=eventType,proto3" json:"event_type,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Action string `protobuf:"bytes,1,opt,name=action,proto3" json:"action,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` + Attrs map[string]string `protobuf:"bytes,4,rep,name=attrs,proto3" json:"attrs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + TimestampUnixNano int64 `protobuf:"varint,5,opt,name=timestamp_unix_nano,json=timestampUnixNano,proto3" json:"timestamp_unix_nano,omitempty"` + EventType string `protobuf:"bytes,6,opt,name=event_type,json=eventType,proto3" json:"event_type,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AgentEventRecord) Reset() { *x = AgentEventRecord{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[140] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[144] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AgentEventRecord) String() string { @@ -11168,8 +10953,8 @@ func (x *AgentEventRecord) String() string { func (*AgentEventRecord) ProtoMessage() {} func (x *AgentEventRecord) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[140] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[144] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -11181,7 +10966,7 @@ func (x *AgentEventRecord) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentEventRecord.ProtoReflect.Descriptor instead. func (*AgentEventRecord) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{140} + return file_gateway_proto_rawDescGZIP(), []int{144} } func (x *AgentEventRecord) GetAction() string { @@ -11227,23 +11012,20 @@ func (x *AgentEventRecord) GetEventType() string { } type AgentTelemetryRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + AgentToken string `protobuf:"bytes,1,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` + Logs []*AgentLogRecord `protobuf:"bytes,2,rep,name=logs,proto3" json:"logs,omitempty"` + Metrics *AgentMetricSnapshot `protobuf:"bytes,3,opt,name=metrics,proto3" json:"metrics,omitempty"` + Events []*AgentEventRecord `protobuf:"bytes,4,rep,name=events,proto3" json:"events,omitempty"` unknownFields protoimpl.UnknownFields - - AgentToken string `protobuf:"bytes,1,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` - Logs []*AgentLogRecord `protobuf:"bytes,2,rep,name=logs,proto3" json:"logs,omitempty"` - Metrics *AgentMetricSnapshot `protobuf:"bytes,3,opt,name=metrics,proto3" json:"metrics,omitempty"` - Events []*AgentEventRecord `protobuf:"bytes,4,rep,name=events,proto3" json:"events,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AgentTelemetryRequest) Reset() { *x = AgentTelemetryRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[141] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[145] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AgentTelemetryRequest) String() string { @@ -11253,8 +11035,8 @@ func (x *AgentTelemetryRequest) String() string { func (*AgentTelemetryRequest) ProtoMessage() {} func (x *AgentTelemetryRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[141] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[145] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -11266,7 +11048,7 @@ func (x *AgentTelemetryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentTelemetryRequest.ProtoReflect.Descriptor instead. func (*AgentTelemetryRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{141} + return file_gateway_proto_rawDescGZIP(), []int{145} } func (x *AgentTelemetryRequest) GetAgentToken() string { @@ -11298,21 +11080,18 @@ func (x *AgentTelemetryRequest) GetEvents() []*AgentEventRecord { } type AgentTelemetryResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AgentTelemetryResponse) Reset() { *x = AgentTelemetryResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[142] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[146] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AgentTelemetryResponse) String() string { @@ -11322,8 +11101,8 @@ func (x *AgentTelemetryResponse) String() string { func (*AgentTelemetryResponse) ProtoMessage() {} func (x *AgentTelemetryResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[142] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[146] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -11335,7 +11114,7 @@ func (x *AgentTelemetryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentTelemetryResponse.ProtoReflect.Descriptor instead. func (*AgentTelemetryResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{142} + return file_gateway_proto_rawDescGZIP(), []int{146} } func (x *AgentTelemetryResponse) GetOk() bool { @@ -11353,35 +11132,32 @@ func (x *AgentTelemetryResponse) GetErrMsg() string { } type Machine struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Cpu int64 `protobuf:"varint,2,opt,name=cpu,proto3" json:"cpu,omitempty"` - Memory int64 `protobuf:"varint,3,opt,name=memory,proto3" json:"memory,omitempty"` - Gpu string `protobuf:"bytes,4,opt,name=gpu,proto3" json:"gpu,omitempty"` - GpuCount uint32 `protobuf:"varint,5,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` - Status string `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"` - PoolName string `protobuf:"bytes,7,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` - ProviderName string `protobuf:"bytes,8,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` - RegistrationToken string `protobuf:"bytes,9,opt,name=registration_token,json=registrationToken,proto3" json:"registration_token,omitempty"` - TailscaleUrl string `protobuf:"bytes,10,opt,name=tailscale_url,json=tailscaleUrl,proto3" json:"tailscale_url,omitempty"` - TailscaleAuth string `protobuf:"bytes,11,opt,name=tailscale_auth,json=tailscaleAuth,proto3" json:"tailscale_auth,omitempty"` - LastKeepalive string `protobuf:"bytes,12,opt,name=last_keepalive,json=lastKeepalive,proto3" json:"last_keepalive,omitempty"` - Created string `protobuf:"bytes,13,opt,name=created,proto3" json:"created,omitempty"` - AgentVersion string `protobuf:"bytes,14,opt,name=agent_version,json=agentVersion,proto3" json:"agent_version,omitempty"` - MachineMetrics *MachineMetrics `protobuf:"bytes,15,opt,name=machine_metrics,json=machineMetrics,proto3" json:"machine_metrics,omitempty"` - UserData string `protobuf:"bytes,16,opt,name=user_data,json=userData,proto3" json:"user_data,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Cpu int64 `protobuf:"varint,2,opt,name=cpu,proto3" json:"cpu,omitempty"` + Memory int64 `protobuf:"varint,3,opt,name=memory,proto3" json:"memory,omitempty"` + Gpu string `protobuf:"bytes,4,opt,name=gpu,proto3" json:"gpu,omitempty"` + GpuCount uint32 `protobuf:"varint,5,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` + Status string `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"` + PoolName string `protobuf:"bytes,7,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + ProviderName string `protobuf:"bytes,8,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` + RegistrationToken string `protobuf:"bytes,9,opt,name=registration_token,json=registrationToken,proto3" json:"registration_token,omitempty"` + TailscaleUrl string `protobuf:"bytes,10,opt,name=tailscale_url,json=tailscaleUrl,proto3" json:"tailscale_url,omitempty"` + TailscaleAuth string `protobuf:"bytes,11,opt,name=tailscale_auth,json=tailscaleAuth,proto3" json:"tailscale_auth,omitempty"` + LastKeepalive string `protobuf:"bytes,12,opt,name=last_keepalive,json=lastKeepalive,proto3" json:"last_keepalive,omitempty"` + Created string `protobuf:"bytes,13,opt,name=created,proto3" json:"created,omitempty"` + AgentVersion string `protobuf:"bytes,14,opt,name=agent_version,json=agentVersion,proto3" json:"agent_version,omitempty"` + MachineMetrics *MachineMetrics `protobuf:"bytes,15,opt,name=machine_metrics,json=machineMetrics,proto3" json:"machine_metrics,omitempty"` + UserData string `protobuf:"bytes,16,opt,name=user_data,json=userData,proto3" json:"user_data,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Machine) Reset() { *x = Machine{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[143] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[147] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Machine) String() string { @@ -11391,8 +11167,8 @@ func (x *Machine) String() string { func (*Machine) ProtoMessage() {} func (x *Machine) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[143] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[147] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -11404,7 +11180,7 @@ func (x *Machine) ProtoReflect() protoreflect.Message { // Deprecated: Use Machine.ProtoReflect.Descriptor instead. func (*Machine) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{143} + return file_gateway_proto_rawDescGZIP(), []int{147} } func (x *Machine) GetId() string { @@ -11520,36 +11296,33 @@ func (x *Machine) GetUserData() string { } type MachineMetrics struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TotalCpuAvailable int32 `protobuf:"varint,1,opt,name=total_cpu_available,json=totalCpuAvailable,proto3" json:"total_cpu_available,omitempty"` - TotalMemoryAvailable int32 `protobuf:"varint,2,opt,name=total_memory_available,json=totalMemoryAvailable,proto3" json:"total_memory_available,omitempty"` - CpuUtilizationPct float32 `protobuf:"fixed32,3,opt,name=cpu_utilization_pct,json=cpuUtilizationPct,proto3" json:"cpu_utilization_pct,omitempty"` - MemoryUtilizationPct float32 `protobuf:"fixed32,4,opt,name=memory_utilization_pct,json=memoryUtilizationPct,proto3" json:"memory_utilization_pct,omitempty"` - WorkerCount int32 `protobuf:"varint,5,opt,name=worker_count,json=workerCount,proto3" json:"worker_count,omitempty"` - ContainerCount int32 `protobuf:"varint,6,opt,name=container_count,json=containerCount,proto3" json:"container_count,omitempty"` - FreeGpuCount int32 `protobuf:"varint,7,opt,name=free_gpu_count,json=freeGpuCount,proto3" json:"free_gpu_count,omitempty"` - CacheUsagePct float32 `protobuf:"fixed32,8,opt,name=cache_usage_pct,json=cacheUsagePct,proto3" json:"cache_usage_pct,omitempty"` - CacheCapacity int32 `protobuf:"varint,9,opt,name=cache_capacity,json=cacheCapacity,proto3" json:"cache_capacity,omitempty"` - CacheMemoryUsage int32 `protobuf:"varint,10,opt,name=cache_memory_usage,json=cacheMemoryUsage,proto3" json:"cache_memory_usage,omitempty"` - CacheCpuUsage float32 `protobuf:"fixed32,11,opt,name=cache_cpu_usage,json=cacheCpuUsage,proto3" json:"cache_cpu_usage,omitempty"` - MemoryUsedMb int64 `protobuf:"varint,12,opt,name=memory_used_mb,json=memoryUsedMb,proto3" json:"memory_used_mb,omitempty"` - MemoryTotalMb int64 `protobuf:"varint,13,opt,name=memory_total_mb,json=memoryTotalMb,proto3" json:"memory_total_mb,omitempty"` - DiskUsedMb int64 `protobuf:"varint,14,opt,name=disk_used_mb,json=diskUsedMb,proto3" json:"disk_used_mb,omitempty"` - DiskTotalMb int64 `protobuf:"varint,15,opt,name=disk_total_mb,json=diskTotalMb,proto3" json:"disk_total_mb,omitempty"` - DiskUsagePct float32 `protobuf:"fixed32,16,opt,name=disk_usage_pct,json=diskUsagePct,proto3" json:"disk_usage_pct,omitempty"` - PathMetrics []*MachinePathMetrics `protobuf:"bytes,17,rep,name=path_metrics,json=pathMetrics,proto3" json:"path_metrics,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + TotalCpuAvailable int32 `protobuf:"varint,1,opt,name=total_cpu_available,json=totalCpuAvailable,proto3" json:"total_cpu_available,omitempty"` + TotalMemoryAvailable int32 `protobuf:"varint,2,opt,name=total_memory_available,json=totalMemoryAvailable,proto3" json:"total_memory_available,omitempty"` + CpuUtilizationPct float32 `protobuf:"fixed32,3,opt,name=cpu_utilization_pct,json=cpuUtilizationPct,proto3" json:"cpu_utilization_pct,omitempty"` + MemoryUtilizationPct float32 `protobuf:"fixed32,4,opt,name=memory_utilization_pct,json=memoryUtilizationPct,proto3" json:"memory_utilization_pct,omitempty"` + WorkerCount int32 `protobuf:"varint,5,opt,name=worker_count,json=workerCount,proto3" json:"worker_count,omitempty"` + ContainerCount int32 `protobuf:"varint,6,opt,name=container_count,json=containerCount,proto3" json:"container_count,omitempty"` + FreeGpuCount int32 `protobuf:"varint,7,opt,name=free_gpu_count,json=freeGpuCount,proto3" json:"free_gpu_count,omitempty"` + CacheUsagePct float32 `protobuf:"fixed32,8,opt,name=cache_usage_pct,json=cacheUsagePct,proto3" json:"cache_usage_pct,omitempty"` + CacheCapacity int32 `protobuf:"varint,9,opt,name=cache_capacity,json=cacheCapacity,proto3" json:"cache_capacity,omitempty"` + CacheMemoryUsage int32 `protobuf:"varint,10,opt,name=cache_memory_usage,json=cacheMemoryUsage,proto3" json:"cache_memory_usage,omitempty"` + CacheCpuUsage float32 `protobuf:"fixed32,11,opt,name=cache_cpu_usage,json=cacheCpuUsage,proto3" json:"cache_cpu_usage,omitempty"` + MemoryUsedMb int64 `protobuf:"varint,12,opt,name=memory_used_mb,json=memoryUsedMb,proto3" json:"memory_used_mb,omitempty"` + MemoryTotalMb int64 `protobuf:"varint,13,opt,name=memory_total_mb,json=memoryTotalMb,proto3" json:"memory_total_mb,omitempty"` + DiskUsedMb int64 `protobuf:"varint,14,opt,name=disk_used_mb,json=diskUsedMb,proto3" json:"disk_used_mb,omitempty"` + DiskTotalMb int64 `protobuf:"varint,15,opt,name=disk_total_mb,json=diskTotalMb,proto3" json:"disk_total_mb,omitempty"` + DiskUsagePct float32 `protobuf:"fixed32,16,opt,name=disk_usage_pct,json=diskUsagePct,proto3" json:"disk_usage_pct,omitempty"` + PathMetrics []*MachinePathMetrics `protobuf:"bytes,17,rep,name=path_metrics,json=pathMetrics,proto3" json:"path_metrics,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MachineMetrics) Reset() { *x = MachineMetrics{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[144] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[148] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MachineMetrics) String() string { @@ -11559,8 +11332,8 @@ func (x *MachineMetrics) String() string { func (*MachineMetrics) ProtoMessage() {} func (x *MachineMetrics) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[144] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[148] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -11572,7 +11345,7 @@ func (x *MachineMetrics) ProtoReflect() protoreflect.Message { // Deprecated: Use MachineMetrics.ProtoReflect.Descriptor instead. func (*MachineMetrics) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{144} + return file_gateway_proto_rawDescGZIP(), []int{148} } func (x *MachineMetrics) GetTotalCpuAvailable() int32 { @@ -11695,25 +11468,22 @@ func (x *MachineMetrics) GetPathMetrics() []*MachinePathMetrics { } type MachinePathMetrics struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Label string `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"` + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + UsedMb uint64 `protobuf:"varint,3,opt,name=used_mb,json=usedMb,proto3" json:"used_mb,omitempty"` + TotalMb uint64 `protobuf:"varint,4,opt,name=total_mb,json=totalMb,proto3" json:"total_mb,omitempty"` + AvailableMb uint64 `protobuf:"varint,5,opt,name=available_mb,json=availableMb,proto3" json:"available_mb,omitempty"` + UsagePct float32 `protobuf:"fixed32,6,opt,name=usage_pct,json=usagePct,proto3" json:"usage_pct,omitempty"` unknownFields protoimpl.UnknownFields - - Label string `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"` - Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` - UsedMb uint64 `protobuf:"varint,3,opt,name=used_mb,json=usedMb,proto3" json:"used_mb,omitempty"` - TotalMb uint64 `protobuf:"varint,4,opt,name=total_mb,json=totalMb,proto3" json:"total_mb,omitempty"` - AvailableMb uint64 `protobuf:"varint,5,opt,name=available_mb,json=availableMb,proto3" json:"available_mb,omitempty"` - UsagePct float32 `protobuf:"fixed32,6,opt,name=usage_pct,json=usagePct,proto3" json:"usage_pct,omitempty"` + sizeCache protoimpl.SizeCache } func (x *MachinePathMetrics) Reset() { *x = MachinePathMetrics{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[145] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[149] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MachinePathMetrics) String() string { @@ -11723,8 +11493,8 @@ func (x *MachinePathMetrics) String() string { func (*MachinePathMetrics) ProtoMessage() {} func (x *MachinePathMetrics) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[145] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[149] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -11736,7 +11506,7 @@ func (x *MachinePathMetrics) ProtoReflect() protoreflect.Message { // Deprecated: Use MachinePathMetrics.ProtoReflect.Descriptor instead. func (*MachinePathMetrics) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{145} + return file_gateway_proto_rawDescGZIP(), []int{149} } func (x *MachinePathMetrics) GetLabel() string { @@ -11782,21 +11552,18 @@ func (x *MachinePathMetrics) GetUsagePct() float32 { } type ListMachinesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` unknownFields protoimpl.UnknownFields - - PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` - Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListMachinesRequest) Reset() { *x = ListMachinesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[146] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[150] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListMachinesRequest) String() string { @@ -11806,8 +11573,8 @@ func (x *ListMachinesRequest) String() string { func (*ListMachinesRequest) ProtoMessage() {} func (x *ListMachinesRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[146] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[150] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -11819,7 +11586,7 @@ func (x *ListMachinesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMachinesRequest.ProtoReflect.Descriptor instead. func (*ListMachinesRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{146} + return file_gateway_proto_rawDescGZIP(), []int{150} } func (x *ListMachinesRequest) GetPoolName() string { @@ -11837,28 +11604,25 @@ func (x *ListMachinesRequest) GetLimit() uint32 { } type ListMachinesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Machines []*Machine `protobuf:"bytes,3,rep,name=machines,proto3" json:"machines,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Machines []*Machine `protobuf:"bytes,3,rep,name=machines,proto3" json:"machines,omitempty"` // gpus reports live worker availability per GPU type (a worker with that // GPU is currently registered). - Gpus map[string]bool `protobuf:"bytes,4,rep,name=gpus,proto3" json:"gpus,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + Gpus map[string]bool `protobuf:"bytes,4,rep,name=gpus,proto3" json:"gpus,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` // supported_gpus reports pool-config-based serverless support per GPU // type: true when a pool could serve the GPU even if scaled to zero. - SupportedGpus map[string]bool `protobuf:"bytes,5,rep,name=supported_gpus,json=supportedGpus,proto3" json:"supported_gpus,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + SupportedGpus map[string]bool `protobuf:"bytes,5,rep,name=supported_gpus,json=supportedGpus,proto3" json:"supported_gpus,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListMachinesResponse) Reset() { *x = ListMachinesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[147] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[151] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListMachinesResponse) String() string { @@ -11868,8 +11632,8 @@ func (x *ListMachinesResponse) String() string { func (*ListMachinesResponse) ProtoMessage() {} func (x *ListMachinesResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[147] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[151] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -11881,7 +11645,7 @@ func (x *ListMachinesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMachinesResponse.ProtoReflect.Descriptor instead. func (*ListMachinesResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{147} + return file_gateway_proto_rawDescGZIP(), []int{151} } func (x *ListMachinesResponse) GetOk() bool { @@ -11920,20 +11684,17 @@ func (x *ListMachinesResponse) GetSupportedGpus() map[string]bool { } type CreateMachineRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` unknownFields protoimpl.UnknownFields - - PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreateMachineRequest) Reset() { *x = CreateMachineRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[148] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[152] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateMachineRequest) String() string { @@ -11943,8 +11704,8 @@ func (x *CreateMachineRequest) String() string { func (*CreateMachineRequest) ProtoMessage() {} func (x *CreateMachineRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[148] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[152] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -11956,7 +11717,7 @@ func (x *CreateMachineRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateMachineRequest.ProtoReflect.Descriptor instead. func (*CreateMachineRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{148} + return file_gateway_proto_rawDescGZIP(), []int{152} } func (x *CreateMachineRequest) GetPoolName() string { @@ -11967,28 +11728,25 @@ func (x *CreateMachineRequest) GetPoolName() string { } type CreateMachineResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Machine *Machine `protobuf:"bytes,3,opt,name=machine,proto3" json:"machine,omitempty"` - AgentUpstreamUrl string `protobuf:"bytes,4,opt,name=agent_upstream_url,json=agentUpstreamUrl,proto3" json:"agent_upstream_url,omitempty"` - AgentUpstreamBranch string `protobuf:"bytes,5,opt,name=agent_upstream_branch,json=agentUpstreamBranch,proto3" json:"agent_upstream_branch,omitempty"` - AgentUpstreamToken string `protobuf:"bytes,6,opt,name=agent_upstream_token,json=agentUpstreamToken,proto3" json:"agent_upstream_token,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Machine *Machine `protobuf:"bytes,3,opt,name=machine,proto3" json:"machine,omitempty"` + AgentUpstreamUrl string `protobuf:"bytes,4,opt,name=agent_upstream_url,json=agentUpstreamUrl,proto3" json:"agent_upstream_url,omitempty"` + AgentUpstreamBranch string `protobuf:"bytes,5,opt,name=agent_upstream_branch,json=agentUpstreamBranch,proto3" json:"agent_upstream_branch,omitempty"` + AgentUpstreamToken string `protobuf:"bytes,6,opt,name=agent_upstream_token,json=agentUpstreamToken,proto3" json:"agent_upstream_token,omitempty"` // Agent-backed managed pools return the systemd installer here. The join // token embedded in the command is short-lived and machine-bound. InstallCommand string `protobuf:"bytes,7,opt,name=install_command,json=installCommand,proto3" json:"install_command,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CreateMachineResponse) Reset() { *x = CreateMachineResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[149] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[153] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateMachineResponse) String() string { @@ -11998,8 +11756,8 @@ func (x *CreateMachineResponse) String() string { func (*CreateMachineResponse) ProtoMessage() {} func (x *CreateMachineResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[149] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[153] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -12011,7 +11769,7 @@ func (x *CreateMachineResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateMachineResponse.ProtoReflect.Descriptor instead. func (*CreateMachineResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{149} + return file_gateway_proto_rawDescGZIP(), []int{153} } func (x *CreateMachineResponse) GetOk() bool { @@ -12064,21 +11822,18 @@ func (x *CreateMachineResponse) GetInstallCommand() string { } type DeleteMachineRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + MachineId string `protobuf:"bytes,1,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` + PoolName string `protobuf:"bytes,2,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` unknownFields protoimpl.UnknownFields - - MachineId string `protobuf:"bytes,1,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` - PoolName string `protobuf:"bytes,2,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteMachineRequest) Reset() { *x = DeleteMachineRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[150] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[154] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteMachineRequest) String() string { @@ -12088,8 +11843,8 @@ func (x *DeleteMachineRequest) String() string { func (*DeleteMachineRequest) ProtoMessage() {} func (x *DeleteMachineRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[150] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[154] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -12101,7 +11856,7 @@ func (x *DeleteMachineRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteMachineRequest.ProtoReflect.Descriptor instead. func (*DeleteMachineRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{150} + return file_gateway_proto_rawDescGZIP(), []int{154} } func (x *DeleteMachineRequest) GetMachineId() string { @@ -12119,21 +11874,18 @@ func (x *DeleteMachineRequest) GetPoolName() string { } type DeleteMachineResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteMachineResponse) Reset() { *x = DeleteMachineResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[151] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[155] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteMachineResponse) String() string { @@ -12143,8 +11895,8 @@ func (x *DeleteMachineResponse) String() string { func (*DeleteMachineResponse) ProtoMessage() {} func (x *DeleteMachineResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[151] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[155] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -12156,7 +11908,7 @@ func (x *DeleteMachineResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteMachineResponse.ProtoReflect.Descriptor instead. func (*DeleteMachineResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{151} + return file_gateway_proto_rawDescGZIP(), []int{155} } func (x *DeleteMachineResponse) GetOk() bool { @@ -12174,27 +11926,24 @@ func (x *DeleteMachineResponse) GetErrMsg() string { } type Token struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + TokenId string `protobuf:"bytes,1,opt,name=token_id,json=tokenId,proto3" json:"token_id,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Active bool `protobuf:"varint,3,opt,name=active,proto3" json:"active,omitempty"` + Reusable bool `protobuf:"varint,4,opt,name=reusable,proto3" json:"reusable,omitempty"` + WorkspaceId *uint32 `protobuf:"varint,5,opt,name=workspace_id,json=workspaceId,proto3,oneof" json:"workspace_id,omitempty"` + TokenType string `protobuf:"bytes,6,opt,name=token_type,json=tokenType,proto3" json:"token_type,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` unknownFields protoimpl.UnknownFields - - TokenId string `protobuf:"bytes,1,opt,name=token_id,json=tokenId,proto3" json:"token_id,omitempty"` - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - Active bool `protobuf:"varint,3,opt,name=active,proto3" json:"active,omitempty"` - Reusable bool `protobuf:"varint,4,opt,name=reusable,proto3" json:"reusable,omitempty"` - WorkspaceId *uint32 `protobuf:"varint,5,opt,name=workspace_id,json=workspaceId,proto3,oneof" json:"workspace_id,omitempty"` - TokenType string `protobuf:"bytes,6,opt,name=token_type,json=tokenType,proto3" json:"token_type,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Token) Reset() { *x = Token{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[152] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[156] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Token) String() string { @@ -12204,8 +11953,8 @@ func (x *Token) String() string { func (*Token) ProtoMessage() {} func (x *Token) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[152] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[156] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -12217,7 +11966,7 @@ func (x *Token) ProtoReflect() protoreflect.Message { // Deprecated: Use Token.ProtoReflect.Descriptor instead. func (*Token) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{152} + return file_gateway_proto_rawDescGZIP(), []int{156} } func (x *Token) GetTokenId() string { @@ -12277,18 +12026,16 @@ func (x *Token) GetUpdatedAt() *timestamppb.Timestamp { } type ListTokensRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListTokensRequest) Reset() { *x = ListTokensRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[153] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[157] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListTokensRequest) String() string { @@ -12298,8 +12045,8 @@ func (x *ListTokensRequest) String() string { func (*ListTokensRequest) ProtoMessage() {} func (x *ListTokensRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[153] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[157] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -12311,26 +12058,23 @@ func (x *ListTokensRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTokensRequest.ProtoReflect.Descriptor instead. func (*ListTokensRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{153} + return file_gateway_proto_rawDescGZIP(), []int{157} } type ListTokensResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Tokens []*Token `protobuf:"bytes,3,rep,name=tokens,proto3" json:"tokens,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Tokens []*Token `protobuf:"bytes,3,rep,name=tokens,proto3" json:"tokens,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListTokensResponse) Reset() { *x = ListTokensResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[154] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[158] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListTokensResponse) String() string { @@ -12340,8 +12084,8 @@ func (x *ListTokensResponse) String() string { func (*ListTokensResponse) ProtoMessage() {} func (x *ListTokensResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[154] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[158] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -12353,7 +12097,7 @@ func (x *ListTokensResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTokensResponse.ProtoReflect.Descriptor instead. func (*ListTokensResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{154} + return file_gateway_proto_rawDescGZIP(), []int{158} } func (x *ListTokensResponse) GetOk() bool { @@ -12378,20 +12122,17 @@ func (x *ListTokensResponse) GetTokens() []*Token { } type CreateTokenRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + TokenType string `protobuf:"bytes,1,opt,name=token_type,json=tokenType,proto3" json:"token_type,omitempty"` unknownFields protoimpl.UnknownFields - - TokenType string `protobuf:"bytes,1,opt,name=token_type,json=tokenType,proto3" json:"token_type,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreateTokenRequest) Reset() { *x = CreateTokenRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[155] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[159] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateTokenRequest) String() string { @@ -12401,8 +12142,8 @@ func (x *CreateTokenRequest) String() string { func (*CreateTokenRequest) ProtoMessage() {} func (x *CreateTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[155] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[159] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -12414,7 +12155,7 @@ func (x *CreateTokenRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTokenRequest.ProtoReflect.Descriptor instead. func (*CreateTokenRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{155} + return file_gateway_proto_rawDescGZIP(), []int{159} } func (x *CreateTokenRequest) GetTokenType() string { @@ -12425,22 +12166,19 @@ func (x *CreateTokenRequest) GetTokenType() string { } type CreateTokenResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Token *Token `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Token *Token `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreateTokenResponse) Reset() { *x = CreateTokenResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[156] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[160] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateTokenResponse) String() string { @@ -12450,8 +12188,8 @@ func (x *CreateTokenResponse) String() string { func (*CreateTokenResponse) ProtoMessage() {} func (x *CreateTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[156] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[160] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -12463,7 +12201,7 @@ func (x *CreateTokenResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTokenResponse.ProtoReflect.Descriptor instead. func (*CreateTokenResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{156} + return file_gateway_proto_rawDescGZIP(), []int{160} } func (x *CreateTokenResponse) GetOk() bool { @@ -12488,20 +12226,17 @@ func (x *CreateTokenResponse) GetToken() *Token { } type ToggleTokenRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + TokenId string `protobuf:"bytes,1,opt,name=token_id,json=tokenId,proto3" json:"token_id,omitempty"` unknownFields protoimpl.UnknownFields - - TokenId string `protobuf:"bytes,1,opt,name=token_id,json=tokenId,proto3" json:"token_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ToggleTokenRequest) Reset() { *x = ToggleTokenRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[157] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[161] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ToggleTokenRequest) String() string { @@ -12511,8 +12246,8 @@ func (x *ToggleTokenRequest) String() string { func (*ToggleTokenRequest) ProtoMessage() {} func (x *ToggleTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[157] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[161] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -12524,7 +12259,7 @@ func (x *ToggleTokenRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ToggleTokenRequest.ProtoReflect.Descriptor instead. func (*ToggleTokenRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{157} + return file_gateway_proto_rawDescGZIP(), []int{161} } func (x *ToggleTokenRequest) GetTokenId() string { @@ -12535,22 +12270,19 @@ func (x *ToggleTokenRequest) GetTokenId() string { } type ToggleTokenResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Token *Token `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Token *Token `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ToggleTokenResponse) Reset() { *x = ToggleTokenResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[158] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[162] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ToggleTokenResponse) String() string { @@ -12560,8 +12292,8 @@ func (x *ToggleTokenResponse) String() string { func (*ToggleTokenResponse) ProtoMessage() {} func (x *ToggleTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[158] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[162] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -12573,7 +12305,7 @@ func (x *ToggleTokenResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ToggleTokenResponse.ProtoReflect.Descriptor instead. func (*ToggleTokenResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{158} + return file_gateway_proto_rawDescGZIP(), []int{162} } func (x *ToggleTokenResponse) GetOk() bool { @@ -12598,20 +12330,17 @@ func (x *ToggleTokenResponse) GetToken() *Token { } type DeleteTokenRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + TokenId string `protobuf:"bytes,1,opt,name=token_id,json=tokenId,proto3" json:"token_id,omitempty"` unknownFields protoimpl.UnknownFields - - TokenId string `protobuf:"bytes,1,opt,name=token_id,json=tokenId,proto3" json:"token_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteTokenRequest) Reset() { *x = DeleteTokenRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[159] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[163] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteTokenRequest) String() string { @@ -12621,8 +12350,8 @@ func (x *DeleteTokenRequest) String() string { func (*DeleteTokenRequest) ProtoMessage() {} func (x *DeleteTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[159] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[163] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -12634,7 +12363,7 @@ func (x *DeleteTokenRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTokenRequest.ProtoReflect.Descriptor instead. func (*DeleteTokenRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{159} + return file_gateway_proto_rawDescGZIP(), []int{163} } func (x *DeleteTokenRequest) GetTokenId() string { @@ -12645,21 +12374,18 @@ func (x *DeleteTokenRequest) GetTokenId() string { } type DeleteTokenResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteTokenResponse) Reset() { *x = DeleteTokenResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[160] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[164] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteTokenResponse) String() string { @@ -12669,8 +12395,8 @@ func (x *DeleteTokenResponse) String() string { func (*DeleteTokenResponse) ProtoMessage() {} func (x *DeleteTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[160] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[164] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -12682,7 +12408,7 @@ func (x *DeleteTokenResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTokenResponse.ProtoReflect.Descriptor instead. func (*DeleteTokenResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{160} + return file_gateway_proto_rawDescGZIP(), []int{164} } func (x *DeleteTokenResponse) GetOk() bool { @@ -12700,23 +12426,20 @@ func (x *DeleteTokenResponse) GetErrMsg() string { } type GetURLRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + StubId string `protobuf:"bytes,1,opt,name=stub_id,json=stubId,proto3" json:"stub_id,omitempty"` + DeploymentId string `protobuf:"bytes,2,opt,name=deployment_id,json=deploymentId,proto3" json:"deployment_id,omitempty"` + UrlType string `protobuf:"bytes,3,opt,name=url_type,json=urlType,proto3" json:"url_type,omitempty"` + IsShell bool `protobuf:"varint,4,opt,name=is_shell,json=isShell,proto3" json:"is_shell,omitempty"` unknownFields protoimpl.UnknownFields - - StubId string `protobuf:"bytes,1,opt,name=stub_id,json=stubId,proto3" json:"stub_id,omitempty"` - DeploymentId string `protobuf:"bytes,2,opt,name=deployment_id,json=deploymentId,proto3" json:"deployment_id,omitempty"` - UrlType string `protobuf:"bytes,3,opt,name=url_type,json=urlType,proto3" json:"url_type,omitempty"` - IsShell bool `protobuf:"varint,4,opt,name=is_shell,json=isShell,proto3" json:"is_shell,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetURLRequest) Reset() { *x = GetURLRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[161] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[165] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetURLRequest) String() string { @@ -12726,8 +12449,8 @@ func (x *GetURLRequest) String() string { func (*GetURLRequest) ProtoMessage() {} func (x *GetURLRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[161] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[165] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -12739,7 +12462,7 @@ func (x *GetURLRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetURLRequest.ProtoReflect.Descriptor instead. func (*GetURLRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{161} + return file_gateway_proto_rawDescGZIP(), []int{165} } func (x *GetURLRequest) GetStubId() string { @@ -12771,22 +12494,19 @@ func (x *GetURLRequest) GetIsShell() bool { } type GetURLResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetURLResponse) Reset() { *x = GetURLResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[162] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[166] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetURLResponse) String() string { @@ -12796,8 +12516,8 @@ func (x *GetURLResponse) String() string { func (*GetURLResponse) ProtoMessage() {} func (x *GetURLResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[162] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[166] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -12809,7 +12529,7 @@ func (x *GetURLResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetURLResponse.ProtoReflect.Descriptor instead. func (*GetURLResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{162} + return file_gateway_proto_rawDescGZIP(), []int{166} } func (x *GetURLResponse) GetOk() bool { @@ -12834,18 +12554,16 @@ func (x *GetURLResponse) GetUrl() string { } type ListWorkersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListWorkersRequest) Reset() { *x = ListWorkersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[163] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[167] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListWorkersRequest) String() string { @@ -12855,8 +12573,8 @@ func (x *ListWorkersRequest) String() string { func (*ListWorkersRequest) ProtoMessage() {} func (x *ListWorkersRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[163] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[167] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -12868,26 +12586,23 @@ func (x *ListWorkersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkersRequest.ProtoReflect.Descriptor instead. func (*ListWorkersRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{163} + return file_gateway_proto_rawDescGZIP(), []int{167} } type ListWorkersResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Workers []*Worker `protobuf:"bytes,3,rep,name=workers,proto3" json:"workers,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Workers []*Worker `protobuf:"bytes,3,rep,name=workers,proto3" json:"workers,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListWorkersResponse) Reset() { *x = ListWorkersResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[164] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[168] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListWorkersResponse) String() string { @@ -12897,8 +12612,8 @@ func (x *ListWorkersResponse) String() string { func (*ListWorkersResponse) ProtoMessage() {} func (x *ListWorkersResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[164] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[168] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -12910,7 +12625,7 @@ func (x *ListWorkersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkersResponse.ProtoReflect.Descriptor instead. func (*ListWorkersResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{164} + return file_gateway_proto_rawDescGZIP(), []int{168} } func (x *ListWorkersResponse) GetOk() bool { @@ -12935,20 +12650,17 @@ func (x *ListWorkersResponse) GetWorkers() []*Worker { } type CordonWorkerRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + WorkerId string `protobuf:"bytes,1,opt,name=worker_id,json=workerId,proto3" json:"worker_id,omitempty"` unknownFields protoimpl.UnknownFields - - WorkerId string `protobuf:"bytes,1,opt,name=worker_id,json=workerId,proto3" json:"worker_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CordonWorkerRequest) Reset() { *x = CordonWorkerRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[165] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[169] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CordonWorkerRequest) String() string { @@ -12958,8 +12670,8 @@ func (x *CordonWorkerRequest) String() string { func (*CordonWorkerRequest) ProtoMessage() {} func (x *CordonWorkerRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[165] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[169] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -12971,7 +12683,7 @@ func (x *CordonWorkerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CordonWorkerRequest.ProtoReflect.Descriptor instead. func (*CordonWorkerRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{165} + return file_gateway_proto_rawDescGZIP(), []int{169} } func (x *CordonWorkerRequest) GetWorkerId() string { @@ -12982,21 +12694,18 @@ func (x *CordonWorkerRequest) GetWorkerId() string { } type CordonWorkerResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CordonWorkerResponse) Reset() { *x = CordonWorkerResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[166] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[170] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CordonWorkerResponse) String() string { @@ -13006,8 +12715,8 @@ func (x *CordonWorkerResponse) String() string { func (*CordonWorkerResponse) ProtoMessage() {} func (x *CordonWorkerResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[166] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[170] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13019,7 +12728,7 @@ func (x *CordonWorkerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CordonWorkerResponse.ProtoReflect.Descriptor instead. func (*CordonWorkerResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{166} + return file_gateway_proto_rawDescGZIP(), []int{170} } func (x *CordonWorkerResponse) GetOk() bool { @@ -13037,20 +12746,17 @@ func (x *CordonWorkerResponse) GetErrMsg() string { } type UncordonWorkerRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + WorkerId string `protobuf:"bytes,1,opt,name=worker_id,json=workerId,proto3" json:"worker_id,omitempty"` unknownFields protoimpl.UnknownFields - - WorkerId string `protobuf:"bytes,1,opt,name=worker_id,json=workerId,proto3" json:"worker_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UncordonWorkerRequest) Reset() { *x = UncordonWorkerRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[167] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[171] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UncordonWorkerRequest) String() string { @@ -13060,8 +12766,8 @@ func (x *UncordonWorkerRequest) String() string { func (*UncordonWorkerRequest) ProtoMessage() {} func (x *UncordonWorkerRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[167] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[171] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13073,7 +12779,7 @@ func (x *UncordonWorkerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UncordonWorkerRequest.ProtoReflect.Descriptor instead. func (*UncordonWorkerRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{167} + return file_gateway_proto_rawDescGZIP(), []int{171} } func (x *UncordonWorkerRequest) GetWorkerId() string { @@ -13084,21 +12790,18 @@ func (x *UncordonWorkerRequest) GetWorkerId() string { } type UncordonWorkerResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UncordonWorkerResponse) Reset() { *x = UncordonWorkerResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[168] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[172] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UncordonWorkerResponse) String() string { @@ -13108,8 +12811,8 @@ func (x *UncordonWorkerResponse) String() string { func (*UncordonWorkerResponse) ProtoMessage() {} func (x *UncordonWorkerResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[168] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[172] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13121,7 +12824,7 @@ func (x *UncordonWorkerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UncordonWorkerResponse.ProtoReflect.Descriptor instead. func (*UncordonWorkerResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{168} + return file_gateway_proto_rawDescGZIP(), []int{172} } func (x *UncordonWorkerResponse) GetOk() bool { @@ -13139,20 +12842,17 @@ func (x *UncordonWorkerResponse) GetErrMsg() string { } type DrainWorkerRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + WorkerId string `protobuf:"bytes,1,opt,name=worker_id,json=workerId,proto3" json:"worker_id,omitempty"` unknownFields protoimpl.UnknownFields - - WorkerId string `protobuf:"bytes,1,opt,name=worker_id,json=workerId,proto3" json:"worker_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DrainWorkerRequest) Reset() { *x = DrainWorkerRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[169] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[173] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DrainWorkerRequest) String() string { @@ -13162,8 +12862,8 @@ func (x *DrainWorkerRequest) String() string { func (*DrainWorkerRequest) ProtoMessage() {} func (x *DrainWorkerRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[169] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[173] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13175,7 +12875,7 @@ func (x *DrainWorkerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DrainWorkerRequest.ProtoReflect.Descriptor instead. func (*DrainWorkerRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{169} + return file_gateway_proto_rawDescGZIP(), []int{173} } func (x *DrainWorkerRequest) GetWorkerId() string { @@ -13186,21 +12886,18 @@ func (x *DrainWorkerRequest) GetWorkerId() string { } type DrainWorkerResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DrainWorkerResponse) Reset() { *x = DrainWorkerResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[170] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[174] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DrainWorkerResponse) String() string { @@ -13210,8 +12907,8 @@ func (x *DrainWorkerResponse) String() string { func (*DrainWorkerResponse) ProtoMessage() {} func (x *DrainWorkerResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[170] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[174] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13223,7 +12920,7 @@ func (x *DrainWorkerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DrainWorkerResponse.ProtoReflect.Descriptor instead. func (*DrainWorkerResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{170} + return file_gateway_proto_rawDescGZIP(), []int{174} } func (x *DrainWorkerResponse) GetOk() bool { @@ -13241,18 +12938,16 @@ func (x *DrainWorkerResponse) GetErrMsg() string { } type ExportWorkspaceConfigRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ExportWorkspaceConfigRequest) Reset() { *x = ExportWorkspaceConfigRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[171] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[175] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ExportWorkspaceConfigRequest) String() string { @@ -13262,8 +12957,8 @@ func (x *ExportWorkspaceConfigRequest) String() string { func (*ExportWorkspaceConfigRequest) ProtoMessage() {} func (x *ExportWorkspaceConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[171] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[175] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13275,30 +12970,27 @@ func (x *ExportWorkspaceConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportWorkspaceConfigRequest.ProtoReflect.Descriptor instead. func (*ExportWorkspaceConfigRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{171} + return file_gateway_proto_rawDescGZIP(), []int{175} } type ExportWorkspaceConfigResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - GatewayHttpHost string `protobuf:"bytes,1,opt,name=gateway_http_host,json=gatewayHttpHost,proto3" json:"gateway_http_host,omitempty"` - GatewayHttpPort int32 `protobuf:"varint,2,opt,name=gateway_http_port,json=gatewayHttpPort,proto3" json:"gateway_http_port,omitempty"` - GatewayHttpTls bool `protobuf:"varint,3,opt,name=gateway_http_tls,json=gatewayHttpTls,proto3" json:"gateway_http_tls,omitempty"` - GatewayGrpcHost string `protobuf:"bytes,4,opt,name=gateway_grpc_host,json=gatewayGrpcHost,proto3" json:"gateway_grpc_host,omitempty"` - GatewayGrpcPort int32 `protobuf:"varint,5,opt,name=gateway_grpc_port,json=gatewayGrpcPort,proto3" json:"gateway_grpc_port,omitempty"` - GatewayGrpcTls bool `protobuf:"varint,6,opt,name=gateway_grpc_tls,json=gatewayGrpcTls,proto3" json:"gateway_grpc_tls,omitempty"` - WorkspaceId string `protobuf:"bytes,7,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + GatewayHttpHost string `protobuf:"bytes,1,opt,name=gateway_http_host,json=gatewayHttpHost,proto3" json:"gateway_http_host,omitempty"` + GatewayHttpPort int32 `protobuf:"varint,2,opt,name=gateway_http_port,json=gatewayHttpPort,proto3" json:"gateway_http_port,omitempty"` + GatewayHttpTls bool `protobuf:"varint,3,opt,name=gateway_http_tls,json=gatewayHttpTls,proto3" json:"gateway_http_tls,omitempty"` + GatewayGrpcHost string `protobuf:"bytes,4,opt,name=gateway_grpc_host,json=gatewayGrpcHost,proto3" json:"gateway_grpc_host,omitempty"` + GatewayGrpcPort int32 `protobuf:"varint,5,opt,name=gateway_grpc_port,json=gatewayGrpcPort,proto3" json:"gateway_grpc_port,omitempty"` + GatewayGrpcTls bool `protobuf:"varint,6,opt,name=gateway_grpc_tls,json=gatewayGrpcTls,proto3" json:"gateway_grpc_tls,omitempty"` + WorkspaceId string `protobuf:"bytes,7,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ExportWorkspaceConfigResponse) Reset() { *x = ExportWorkspaceConfigResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[172] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[176] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ExportWorkspaceConfigResponse) String() string { @@ -13308,8 +13000,8 @@ func (x *ExportWorkspaceConfigResponse) String() string { func (*ExportWorkspaceConfigResponse) ProtoMessage() {} func (x *ExportWorkspaceConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[172] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[176] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13321,7 +13013,7 @@ func (x *ExportWorkspaceConfigResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportWorkspaceConfigResponse.ProtoReflect.Descriptor instead. func (*ExportWorkspaceConfigResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{172} + return file_gateway_proto_rawDescGZIP(), []int{176} } func (x *ExportWorkspaceConfigResponse) GetGatewayHttpHost() string { @@ -13374,25 +13066,22 @@ func (x *ExportWorkspaceConfigResponse) GetWorkspaceId() string { } type UpdateAgentAvailabilityRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - AgentToken string `protobuf:"bytes,1,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` - Schedulable bool `protobuf:"varint,2,opt,name=schedulable,proto3" json:"schedulable,omitempty"` - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + AgentToken string `protobuf:"bytes,1,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` + Schedulable bool `protobuf:"varint,2,opt,name=schedulable,proto3" json:"schedulable,omitempty"` + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Unix nanoseconds, matching the *_unix_nano convention used elsewhere in // this file (e.g. AgentLogRecord.timestamp_unix_nano). ObservedAtUnixNano int64 `protobuf:"varint,4,opt,name=observed_at_unix_nano,json=observedAtUnixNano,proto3" json:"observed_at_unix_nano,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateAgentAvailabilityRequest) Reset() { *x = UpdateAgentAvailabilityRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[173] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[177] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateAgentAvailabilityRequest) String() string { @@ -13402,8 +13091,8 @@ func (x *UpdateAgentAvailabilityRequest) String() string { func (*UpdateAgentAvailabilityRequest) ProtoMessage() {} func (x *UpdateAgentAvailabilityRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[173] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[177] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13415,7 +13104,7 @@ func (x *UpdateAgentAvailabilityRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateAgentAvailabilityRequest.ProtoReflect.Descriptor instead. func (*UpdateAgentAvailabilityRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{173} + return file_gateway_proto_rawDescGZIP(), []int{177} } func (x *UpdateAgentAvailabilityRequest) GetAgentToken() string { @@ -13447,21 +13136,18 @@ func (x *UpdateAgentAvailabilityRequest) GetObservedAtUnixNano() int64 { } type UpdateAgentAvailabilityResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UpdateAgentAvailabilityResponse) Reset() { *x = UpdateAgentAvailabilityResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[174] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[178] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateAgentAvailabilityResponse) String() string { @@ -13471,8 +13157,8 @@ func (x *UpdateAgentAvailabilityResponse) String() string { func (*UpdateAgentAvailabilityResponse) ProtoMessage() {} func (x *UpdateAgentAvailabilityResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[174] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[178] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13484,7 +13170,7 @@ func (x *UpdateAgentAvailabilityResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateAgentAvailabilityResponse.ProtoReflect.Descriptor instead. func (*UpdateAgentAvailabilityResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{174} + return file_gateway_proto_rawDescGZIP(), []int{178} } func (x *UpdateAgentAvailabilityResponse) GetOk() bool { @@ -13503,2529 +13189,1271 @@ func (x *UpdateAgentAvailabilityResponse) GetErrMsg() string { var File_gateway_proto protoreflect.FileDescriptor -var file_gateway_proto_rawDesc = []byte{ - 0x0a, 0x0d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x12, 0x0a, 0x10, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x80, 0x01, 0x0a, 0x11, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x21, - 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, - 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, - 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x2e, 0x0a, 0x12, 0x53, - 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x7e, 0x0a, 0x13, 0x53, - 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1b, - 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x38, 0x0a, 0x0e, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, - 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x30, - 0x0a, 0x14, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x70, 0x75, 0x74, 0x5f, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x75, - 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x50, 0x75, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x22, 0xec, 0x01, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x69, 0x73, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, - 0x1b, 0x0a, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x0f, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0e, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, - 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x32, 0x0a, 0x15, 0x75, - 0x73, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x75, 0x73, 0x65, 0x57, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x22, - 0xcf, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0e, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, - 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, - 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, - 0x30, 0x0a, 0x14, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x70, 0x75, 0x74, 0x5f, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, - 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x50, 0x75, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x73, 0x22, 0x94, 0x02, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x73, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x70, 0x72, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x4e, 0x0a, 0x0b, 0x70, 0x75, 0x74, - 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x75, - 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, - 0x75, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x75, 0x74, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 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, 0x22, 0xad, 0x01, 0x0a, 0x10, 0x50, 0x75, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, - 0x0e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x76, - 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, - 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x5d, 0x0a, 0x11, 0x50, 0x75, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x1b, 0x0a, - 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xd6, 0x01, 0x0a, 0x1d, 0x53, 0x79, 0x6e, 0x63, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, - 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x74, 0x68, 0x12, 0x15, 0x0a, 0x06, 0x69, - 0x73, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x44, - 0x69, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x79, 0x6e, - 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x02, 0x6f, 0x70, - 0x22, 0x30, 0x0a, 0x1e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x22, 0x17, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x77, 0x0a, 0x16, 0x4c, - 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x0a, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x4d, 0x73, 0x67, 0x22, 0x39, 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x22, - 0x44, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x3f, 0x0a, 0x1a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x22, 0x6f, 0x0a, 0x1b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xd3, 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x4a, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x5f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x54, 0x6f, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, - 0x0d, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x62, - 0x0a, 0x18, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x73, 0x79, 0x6e, 0x63, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x3d, 0x0a, - 0x18, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x54, 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x22, 0x64, 0x0a, 0x19, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x54, 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, - 0x64, 0x65, 0x22, 0x4e, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, - 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x49, 0x64, 0x22, 0x23, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x22, 0x85, 0x02, 0x0a, 0x0e, 0x45, 0x6e, 0x64, 0x54, - 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, - 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x64, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x74, 0x61, 0x73, 0x6b, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x73, 0x6b, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, - 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x12, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x6b, - 0x65, 0x65, 0x70, 0x5f, 0x77, 0x61, 0x72, 0x6d, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6b, 0x65, 0x65, 0x70, 0x57, 0x61, 0x72, 0x6d, - 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, - 0x21, 0x0a, 0x0f, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x22, 0x24, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xbb, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, - 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb9, 0x03, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 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, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x18, 0x06, 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, 0x07, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x74, 0x12, 0x17, 0x0a, 0x07, - 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x75, 0x62, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 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, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x22, 0x77, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, - 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, - 0x12, 0x23, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x2d, 0x0a, 0x10, 0x53, - 0x74, 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x19, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x3c, 0x0a, 0x11, 0x53, 0x74, - 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, - 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x78, 0x0a, 0x06, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x50, - 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x06, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x22, 0x1f, 0x0a, 0x09, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x56, 0x61, 0x72, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x0a, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, - 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, - 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x2e, 0x0a, - 0x13, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x74, 0x61, 0x73, 0x6b, - 0x73, 0x50, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x25, 0x0a, - 0x0e, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x09, 0x4c, 0x4c, 0x4d, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x6c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x69, 0x7a, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x6c, 0x6f, - 0x5f, 0x74, 0x69, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x6c, 0x6f, - 0x54, 0x69, 0x65, 0x72, 0x22, 0xcc, 0x03, 0x0a, 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, - 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x12, - 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, - 0x76, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x76, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x36, 0x0a, 0x17, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x15, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x75, 0x72, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x30, 0x0a, 0x14, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x73, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x12, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x12, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6b, 0x69, 0x6e, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4b, 0x69, 0x6e, 0x64, - 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x24, 0x0a, 0x03, 0x6c, - 0x6c, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4c, 0x4c, 0x4d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x6c, 0x6c, - 0x6d, 0x12, 0x3a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0xa9, 0x01, - 0x0a, 0x0b, 0x44, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x6b, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, - 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x59, 0x0a, 0x0a, 0x54, 0x61, 0x73, - 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x03, 0x74, 0x74, 0x6c, 0x22, 0x8e, 0x01, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, - 0x33, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x4f, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 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, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4a, 0x0a, 0x0b, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x73, 0x22, 0xed, 0x0c, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x75, 0x62, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, - 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, - 0x63, 0x70, 0x75, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, - 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x61, 0x6e, 0x64, 0x6c, - 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x77, - 0x61, 0x72, 0x6d, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x0f, 0x6b, 0x65, 0x65, 0x70, 0x57, 0x61, 0x72, 0x6d, 0x53, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x2a, 0x0a, 0x11, - 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x73, 0x6b, - 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x07, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, - 0x6b, 0x55, 0x72, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x65, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x65, 0x64, 0x12, 0x2c, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, - 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x56, 0x61, 0x72, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, - 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x52, 0x0a, 0x61, 0x75, 0x74, - 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x0b, 0x74, 0x61, 0x73, 0x6b, 0x5f, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2f, 0x0a, - 0x13, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x78, 0x74, 0x72, 0x61, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x11, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x18, 0x1c, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x6e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x29, 0x0a, - 0x11, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x73, 0x74, 0x75, 0x62, 0x5f, - 0x69, 0x64, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x6e, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x1e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, - 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x10, - 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x20, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, - 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x21, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x70, - 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x52, 0x07, 0x70, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x27, 0x0a, 0x06, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, - 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, - 0x10, 0x0a, 0x03, 0x74, 0x63, 0x70, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x63, - 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, - 0x6c, 0x69, 0x73, 0x74, 0x18, 0x27, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x64, - 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x04, - 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, - 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x2a, 0x0a, 0x05, 0x64, 0x69, 0x73, 0x6b, 0x73, 0x18, - 0x2c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x05, 0x64, 0x69, 0x73, - 0x6b, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x12, - 0x47, 0x0a, 0x12, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x74, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x54, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x67, 0x70, 0x75, 0x5f, - 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x2f, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x67, 0x70, 0x75, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x22, 0xfc, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, - 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, - 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, - 0x19, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x4d, 0x73, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x75, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x64, 0x5f, 0x67, 0x70, 0x75, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x75, - 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x47, 0x70, 0x75, 0x73, 0x12, 0x30, - 0x0a, 0x14, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, - 0x22, 0x5a, 0x0a, 0x11, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x22, 0xdd, 0x01, 0x0a, - 0x12, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x55, 0x72, - 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x77, 0x61, - 0x72, 0x6e, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x61, - 0x72, 0x6e, 0x4d, 0x73, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, - 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, - 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9b, 0x04, 0x0a, - 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, - 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, - 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x73, 0x74, 0x75, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, - 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 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, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4b, 0x69, 0x6e, 0x64, - 0x12, 0x38, 0x0a, 0x18, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x16, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x76, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x76, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x16, 0x4c, - 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x79, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, - 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x35, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0x27, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x41, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x28, 0x0a, 0x16, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x42, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, - 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x48, 0x0a, 0x16, 0x53, 0x63, 0x61, - 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x73, 0x22, 0x42, 0x0a, 0x17, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, - 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x29, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x22, 0x43, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, - 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xec, 0x02, 0x0a, 0x04, 0x50, 0x6f, 0x6f, 0x6c, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1e, - 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x12, 0x1e, - 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x43, 0x70, 0x75, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x43, 0x70, 0x75, 0x12, 0x24, - 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x43, 0x70, 0x75, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x43, 0x70, 0x75, - 0x12, 0x30, 0x0a, 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x12, 0x34, 0x0a, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, - 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xbb, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x61, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, - 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, - 0x73, 0x67, 0x12, 0x23, 0x0a, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, - 0x52, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x22, 0xf9, 0x02, 0x0a, 0x0a, 0x50, 0x6f, 0x6f, 0x6c, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, - 0x75, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x14, 0x0a, 0x05, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x6f, 0x64, - 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x70, 0x65, 0x6e, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x70, 0x65, 0x6e, - 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, - 0x5f, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x0e, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x12, - 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, - 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, - 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, - 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x66, 0x66, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, - 0x72, 0x49, 0x64, 0x22, 0xd2, 0x04, 0x0a, 0x09, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, - 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x23, 0x0a, - 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, - 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, - 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, - 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, - 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, 0x12, 0x2c, 0x0a, - 0x12, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, - 0x72, 0x6f, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x68, 0x6f, 0x75, 0x72, 0x6c, - 0x79, 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x72, - 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, - 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4d, 0x62, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x2e, - 0x0a, 0x13, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, - 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, - 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x22, 0xfb, 0x05, 0x0a, 0x10, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, - 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, - 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, - 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x10, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, - 0x63, 0x72, 0x6f, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 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, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, - 0x41, 0x74, 0x12, 0x48, 0x0a, 0x12, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, - 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x5f, 0x61, 0x74, 0x18, 0x0b, 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, 0x10, 0x62, 0x69, 0x6c, 0x6c, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x41, 0x74, 0x12, 0x25, 0x0a, 0x0e, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x11, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, - 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, - 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, - 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, - 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x70, 0x75, - 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x15, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x4d, 0x62, 0x22, 0xad, 0x04, 0x0a, 0x0b, 0x50, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x3d, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x5f, - 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x70, 0x65, - 0x6e, 0x64, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, - 0x74, 0x18, 0x0a, 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x23, - 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x72, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x04, 0x62, 0x79, - 0x6f, 0x63, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x22, 0x40, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, - 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x27, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x6d, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, - 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2a, 0x0a, 0x06, 0x6f, - 0x66, 0x66, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, - 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x22, 0x5a, 0x0a, 0x19, 0x4c, 0x61, 0x75, 0x6e, 0x63, - 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, - 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, - 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x22, 0xde, 0x01, 0x0a, 0x1a, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, - 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, - 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, - 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, - 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x43, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, - 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x72, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x61, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, - 0x65, 0x6e, 0x74, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x47, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, - 0x4f, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x6f, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, - 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, - 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2a, 0x0a, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x05, 0x70, 0x6f, 0x6f, 0x6c, - 0x73, 0x22, 0x9d, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, - 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, - 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, - 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x4e, 0x6f, - 0x64, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0xfc, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, - 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, - 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, - 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x74, 0x75, 0x70, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x55, 0x72, 0x6c, 0x12, 0x2a, 0x0a, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, - 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, - 0x22, 0xd8, 0x05, 0x0a, 0x0d, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1d, - 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, - 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x1f, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x14, - 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, - 0x68, 0x61, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x64, 0x65, 0x73, - 0x69, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, - 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5f, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, - 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x5f, 0x70, - 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x73, - 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x50, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, - 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, - 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, - 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x10, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, 0x63, 0x72, 0x6f, - 0x73, 0x12, 0x37, 0x0a, 0x18, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x6c, - 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x48, 0x6f, 0x75, 0x72, 0x6c, 0x79, - 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x53, 0x63, 0x61, 0x6c, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x10, 0x0a, 0x03, - 0x67, 0x70, 0x75, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, - 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x31, 0x0a, 0x12, 0x47, - 0x65, 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xff, - 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, - 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, - 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, - 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, - 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, - 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, - 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, - 0x22, 0x75, 0x0a, 0x14, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x64, 0x65, - 0x73, 0x69, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, - 0x78, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, - 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x15, 0x53, 0x63, 0x61, 0x6c, - 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, - 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, - 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, - 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x2a, 0x0a, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, - 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, - 0x22, 0xe2, 0x04, 0x0a, 0x12, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x6c, 0x6c, 0x65, - 0x72, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, - 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, - 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, - 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, - 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, - 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, 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, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, - 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, - 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x36, 0x0a, - 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, - 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, - 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9a, 0x05, 0x0a, 0x10, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x6c, - 0x6c, 0x65, 0x72, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, - 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, - 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, - 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, - 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, - 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x08, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x67, - 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x64, 0x69, 0x73, 0x6b, 0x47, 0x62, 0x12, - 0x24, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x69, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x11, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x36, 0x0a, 0x18, 0x70, 0x72, - 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, - 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x70, 0x72, - 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0xb2, 0x02, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, - 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, - 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, - 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, - 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x36, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, - 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, - 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, - 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x35, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x52, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x93, 0x03, 0x0a, - 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, - 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x72, 0x65, - 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, - 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, - 0x48, 0x01, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, - 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, - 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x48, - 0x02, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, - 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, - 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, - 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, - 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, - 0x12, 0x35, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x07, - 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x40, 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x22, 0x4b, 0x0a, 0x20, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, - 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x36, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x83, - 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x37, 0x0a, 0x08, 0x6c, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x6c, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x22, 0x53, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0xb7, 0x01, 0x0a, 0x21, 0x47, 0x65, - 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, 0x6e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, - 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, - 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x05, 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, - 0x73, 0x41, 0x74, 0x22, 0x46, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x7b, 0x0a, 0x1d, 0x4c, - 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, - 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, - 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x31, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, - 0x52, 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x22, 0x3b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x49, 0x64, 0x22, 0x77, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2f, 0x0a, - 0x05, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x22, 0x88, - 0x03, 0x0a, 0x11, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x36, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, - 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, - 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x7b, 0x0a, 0x1e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, - 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x7e, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, - 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, - 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, - 0x73, 0x67, 0x12, 0x32, 0x0a, 0x06, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x06, - 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x22, 0x1f, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7f, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, - 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, - 0x73, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, - 0x07, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x22, 0x3d, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, - 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x49, 0x64, 0x22, 0x4a, 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, - 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, - 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, - 0x4d, 0x73, 0x67, 0x22, 0xc8, 0x01, 0x0a, 0x1b, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x49, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x72, - 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, - 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x65, 0x6e, 0x76, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x22, 0xf2, - 0x01, 0x0a, 0x1c, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, - 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, - 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, - 0x75, 0x62, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x5f, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, - 0x68, 0x65, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x22, 0x55, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x78, 0x0a, 0x1f, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, - 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x73, 0x22, 0x5a, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, - 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, - 0x67, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, - 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x63, - 0x70, 0x75, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, - 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, - 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, - 0x73, 0x67, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x3c, 0x0a, - 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x67, 0x0a, 0x12, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, - 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, - 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, - 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, - 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3d, 0x0a, - 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x5e, 0x0a, 0x19, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, - 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, - 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x22, 0x6f, 0x0a, 0x1a, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, - 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, - 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x4b, 0x0a, - 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, - 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0x97, 0x01, 0x0a, 0x1b, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, - 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, - 0x4d, 0x73, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, - 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x04, 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, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x65, 0x73, 0x41, 0x74, 0x22, 0x32, 0x0a, 0x1a, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, - 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x46, 0x0a, 0x1b, 0x52, 0x65, 0x76, 0x6f, - 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, - 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, - 0x22, 0x4a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, - 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, - 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0xb0, 0x01, 0x0a, - 0x1a, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, - 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, - 0x72, 0x4d, 0x73, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, - 0x61, 0x74, 0x18, 0x05, 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, - 0x4c, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, - 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x71, 0x0a, - 0x18, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, - 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, - 0x73, 0x67, 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, - 0x22, 0x94, 0x05, 0x0a, 0x14, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, - 0x72, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, - 0x55, 0x72, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, - 0x72, 0x70, 0x63, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x12, - 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, - 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x74, 0x6c, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, - 0x70, 0x63, 0x54, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, - 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, - 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, - 0x1a, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x11, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6d, - 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x69, - 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x19, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x61, 0x63, 0x68, 0x65, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, - 0x12, 0x35, 0x0a, 0x07, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, - 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0xe2, 0x01, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, - 0x0a, 0x0e, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x75, 0x73, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x73, 0x61, 0x67, - 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x68, - 0x6f, 0x6f, 0x6b, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x45, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x6f, - 0x6b, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, - 0x6f, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2e, 0x0a, 0x13, - 0x62, 0x69, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, - 0x70, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x62, 0x69, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x50, 0x63, 0x74, 0x22, 0xc7, 0x01, 0x0a, - 0x14, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x12, 0x35, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x53, 0x69, 0x6e, 0x6b, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, - 0x65, 0x74, 0x72, 0x79, 0x53, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x18, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x53, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0xdd, 0x04, 0x0a, 0x10, 0x4a, - 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2f, - 0x0a, 0x13, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x6f, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, - 0x72, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x63, 0x68, 0x12, - 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x08, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x08, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, - 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x66, - 0x6c, 0x69, 0x67, 0x68, 0x74, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x66, 0x6c, - 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x09, 0x70, 0x72, 0x65, 0x66, 0x6c, - 0x69, 0x67, 0x68, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, - 0x6f, 0x72, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x4d, - 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x70, 0x75, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x67, 0x70, 0x75, 0x49, - 0x64, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x6c, - 0x6f, 0x74, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6c, 0x6f, 0x74, 0x50, - 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3e, 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x19, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, - 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x22, 0xf9, 0x01, 0x0a, 0x11, 0x4a, - 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, - 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, - 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x3b, 0x0a, 0x09, 0x62, 0x6f, 0x6f, - 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x6f, 0x74, - 0x73, 0x74, 0x72, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, 0x62, 0x6f, 0x6f, - 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x22, 0x6f, 0x0a, 0x13, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, - 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, - 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, - 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x22, 0xb9, 0x03, 0x0a, 0x0a, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x49, - 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, - 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, - 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, - 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, - 0x72, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, - 0x78, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x22, 0x67, 0x0a, 0x26, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, - 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, - 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xc8, 0x01, 0x0a, - 0x27, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, - 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, - 0x67, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x1a, 0x0a, - 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x70, 0x68, - 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x65, 0x70, - 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x39, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, - 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, - 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2b, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x06, 0x72, 0x6f, 0x75, - 0x74, 0x65, 0x73, 0x22, 0xad, 0x02, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x49, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x78, 0x79, - 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, - 0x72, 0x6f, 0x78, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x12, 0x47, 0x0a, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x31, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x1a, 0x38, 0x0a, 0x0a, 0x41, 0x74, 0x74, - 0x72, 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, 0x22, 0x49, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xd4, - 0x07, 0x0a, 0x0f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6c, - 0x6f, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x10, - 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, - 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, - 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, - 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x61, - 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x67, 0x70, 0x75, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x25, - 0x0a, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x53, 0x6c, 0x6f, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3e, 0x0a, - 0x1b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, - 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x34, - 0x0a, 0x16, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x6c, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, - 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x12, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x50, 0x6f, - 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, - 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, - 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, - 0x65, 0x6d, 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x69, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x53, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x67, - 0x76, 0x69, 0x73, 0x6f, 0x72, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x16, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x67, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x50, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x1f, 0x0a, 0x0b, 0x67, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x5f, 0x72, - 0x6f, 0x6f, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x67, 0x76, 0x69, 0x73, 0x6f, - 0x72, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x5f, - 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x18, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0f, 0x67, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x72, 0x61, 0x41, 0x72, 0x67, - 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, - 0x79, 0x5f, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x13, 0x63, 0x70, 0x75, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x66, - 0x6f, 0x72, 0x63, 0x65, 0x64, 0x22, 0x35, 0x0a, 0x12, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x9b, 0x01, 0x0a, - 0x13, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2b, 0x0a, - 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x05, 0x73, 0x6c, - 0x6f, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, - 0x6c, 0x6f, 0x74, 0x52, 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x22, 0xb7, 0x01, 0x0a, 0x0e, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x55, 0x6e, 0x69, 0x78, - 0x4e, 0x61, 0x6e, 0x6f, 0x22, 0xb4, 0x04, 0x0a, 0x13, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x2e, 0x0a, 0x13, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, - 0x61, 0x6e, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x2e, 0x0a, 0x13, - 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x70, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x70, 0x75, 0x55, 0x74, - 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, 0x24, 0x0a, 0x0e, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x65, 0x64, - 0x4d, 0x62, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x70, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, - 0x12, 0x20, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x65, 0x64, - 0x4d, 0x62, 0x12, 0x22, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x5f, 0x6d, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x6b, 0x54, - 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x24, 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, - 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, - 0x64, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x69, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, 0x70, - 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x66, - 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x0c, 0x70, - 0x61, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0b, - 0x70, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xa1, 0x02, 0x0a, 0x10, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x05, 0x61, 0x74, - 0x74, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x55, 0x6e, - 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x38, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x72, 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, 0x22, - 0xd0, 0x01, 0x0a, 0x15, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2b, 0x0a, 0x04, 0x6c, 0x6f, - 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x36, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, - 0x31, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0x41, 0x0a, 0x16, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, - 0x65, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, - 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x8c, 0x04, 0x0a, 0x07, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, - 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x67, - 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, - 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x11, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x63, 0x61, 0x6c, 0x65, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, 0x12, - 0x25, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, - 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x4b, 0x65, 0x65, - 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x44, 0x61, 0x74, 0x61, 0x22, 0xed, 0x05, 0x0a, 0x0e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x41, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2e, 0x0a, - 0x13, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x70, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x70, 0x75, 0x55, - 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, 0x34, 0x0a, - 0x16, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x63, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x24, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x75, - 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, - 0x63, 0x61, 0x63, 0x68, 0x65, 0x55, 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, 0x12, 0x25, 0x0a, - 0x0e, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x10, 0x63, 0x61, 0x63, 0x68, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, - 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x63, 0x61, 0x63, - 0x68, 0x65, 0x43, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x65, 0x64, 0x4d, 0x62, - 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x5f, 0x6d, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x20, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x6b, - 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, - 0x64, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x22, 0x0a, 0x0d, 0x64, 0x69, - 0x73, 0x6b, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x24, - 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x63, 0x74, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, - 0x65, 0x50, 0x63, 0x74, 0x12, 0x3e, 0x0a, 0x0c, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x61, 0x74, 0x68, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x22, 0xb2, 0x01, 0x0a, 0x12, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x50, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x19, - 0x0a, 0x08, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x07, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0b, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x62, 0x12, 0x1b, 0x0a, 0x09, - 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x08, 0x75, 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, 0x22, 0x48, 0x0a, 0x13, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x22, 0xfe, 0x02, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, - 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x04, 0x67, 0x70, 0x75, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x47, 0x70, 0x75, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x67, 0x70, 0x75, 0x73, - 0x12, 0x57, 0x0a, 0x0e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x67, 0x70, - 0x75, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x64, 0x47, 0x70, 0x75, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x73, 0x75, 0x70, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x64, 0x47, 0x70, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x47, 0x70, 0x75, - 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, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x40, 0x0a, 0x12, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x47, - 0x70, 0x75, 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, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x33, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xa9, 0x02, 0x0a, 0x15, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2a, 0x0a, 0x07, - 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, - 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x55, 0x72, 0x6c, 0x12, 0x32, 0x0a, 0x15, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, - 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x55, - 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x27, 0x0a, 0x0f, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x52, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, - 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x40, 0x0a, 0x15, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xb6, 0x02, 0x0a, 0x05, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, - 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, - 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0b, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, - 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, - 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 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, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x65, 0x0a, 0x12, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, - 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x22, 0x33, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x64, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, - 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x24, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x0a, 0x12, 0x54, - 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x22, 0x64, 0x0a, 0x13, - 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x24, 0x0a, 0x05, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x22, 0x2f, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, - 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, - 0x4d, 0x73, 0x67, 0x22, 0x83, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x23, - 0x0a, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x72, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x72, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, - 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x69, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x22, 0x4b, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, - 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, - 0x72, 0x4d, 0x73, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x14, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x67, 0x0a, 0x13, - 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x27, 0x0a, 0x07, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x07, 0x77, 0x6f, - 0x72, 0x6b, 0x65, 0x72, 0x73, 0x22, 0x32, 0x0a, 0x13, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, - 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3f, 0x0a, 0x14, 0x43, 0x6f, 0x72, - 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, - 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x34, 0x0a, 0x15, 0x55, 0x6e, - 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, - 0x22, 0x41, 0x0a, 0x16, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, - 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, - 0x4d, 0x73, 0x67, 0x22, 0x31, 0x0a, 0x12, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, - 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x13, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, - 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, - 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x1e, 0x0a, 0x1c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc6, 0x02, 0x0a, 0x1d, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, - 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, - 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, 0x74, 0x70, - 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, 0x54, 0x6c, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, - 0x70, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, - 0x70, 0x63, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x54, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, - 0xae, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x31, 0x0a, - 0x15, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x75, 0x6e, 0x69, - 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6f, 0x62, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x41, 0x74, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, - 0x22, 0x4a, 0x0a, 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x2a, 0x43, 0x0a, 0x1f, - 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x09, 0x0a, 0x05, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, - 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, - 0x02, 0x32, 0x95, 0x3d, 0x0a, 0x0e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x65, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, - 0x22, 0x0f, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x65, 0x12, 0x5f, 0x0a, 0x0b, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x50, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x73, 0x69, - 0x67, 0x6e, 0x12, 0x5e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x11, 0x12, 0x0f, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x68, 0x61, 0x73, - 0x68, 0x7d, 0x12, 0x60, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x12, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x12, 0x4c, 0x0a, 0x0f, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x75, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x28, 0x01, 0x12, 0x62, 0x0a, 0x13, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0d, 0x12, 0x0b, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x77, - 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, - 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x22, 0x1f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x54, 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x22, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x54, 0x6f, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2f, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x12, 0x53, 0x0a, 0x07, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x12, - 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2f, 0x65, 0x6e, 0x64, 0x12, 0x5a, 0x0a, 0x09, 0x53, 0x74, 0x6f, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, - 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x52, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x08, 0x12, 0x06, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x67, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x12, 0x1f, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, 0x2f, 0x73, 0x74, 0x75, - 0x62, 0x73, 0x12, 0x5f, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, - 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, - 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x73, 0x74, 0x75, 0x62, 0x73, 0x2f, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x12, 0x57, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x12, 0x16, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x73, 0x74, 0x75, 0x62, 0x73, 0x2f, 0x7b, - 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x72, 0x6c, 0x12, 0x6a, 0x0a, 0x0f, - 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x18, 0x22, 0x16, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x75, 0x0a, 0x0f, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1f, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x22, 0x17, 0x2f, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x12, 0x78, 0x0a, 0x0f, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, - 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x72, 0x0a, 0x10, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x2a, 0x11, 0x2f, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, - 0x12, 0x52, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x19, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x70, - 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x6b, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, - 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, - 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x3a, 0x6f, 0x66, 0x66, 0x65, 0x72, - 0x73, 0x12, 0x77, 0x0a, 0x12, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, - 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x70, 0x6f, - 0x6f, 0x6c, 0x73, 0x3a, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x12, 0x6f, 0x0a, 0x10, 0x4c, 0x69, - 0x73, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x20, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x70, 0x6f, - 0x6f, 0x6c, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x69, 0x0a, 0x0e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1e, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, - 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, - 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, - 0x73, 0x2f, 0x62, 0x79, 0x6f, 0x63, 0x12, 0x69, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x42, 0x59, 0x4f, - 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x47, 0x65, 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, - 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, - 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x62, 0x79, 0x6f, - 0x63, 0x12, 0x78, 0x0a, 0x0d, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, - 0x6f, 0x6c, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, 0x61, - 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, 0x61, 0x6c, - 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, 0x70, - 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, - 0x2f, 0x62, 0x79, 0x6f, 0x63, 0x2f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x18, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x9e, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, 0x2f, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, - 0x12, 0x9b, 0x01, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x2a, 0x22, 0x2f, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x8b, - 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0xae, 0x01, 0x0a, - 0x19, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, - 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x29, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, 0x6f, - 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x3a, 0x01, 0x2a, 0x22, 0x2f, 0x2f, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x83, 0x01, - 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, - 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6f, 0x66, 0x66, - 0x65, 0x72, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, - 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6f, 0x66, 0x66, - 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, - 0x12, 0x8d, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, - 0x12, 0x87, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x12, 0x26, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, - 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x17, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, - 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x22, 0x2a, 0x20, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, - 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x2f, 0x7b, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, - 0x69, 0x64, 0x7d, 0x12, 0x97, 0x01, 0x0a, 0x14, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x24, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6e, - 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x61, 0x75, - 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x2f, 0x7b, 0x72, 0x65, 0x6e, 0x74, - 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x12, 0xa1, 0x01, - 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x2d, 0x12, 0x2b, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x35, 0x12, 0x33, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x2f, - 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, - 0x73, 0x12, 0x5c, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, - 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, - 0x2a, 0x0d, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, - 0x7e, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, - 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x12, - 0x8b, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, - 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, - 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, 0x2f, - 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x7d, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x86, 0x01, - 0x0a, 0x13, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, - 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x70, 0x6f, - 0x6f, 0x6c, 0x73, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, - 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x12, 0x89, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x50, 0x6f, - 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x22, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, - 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x50, - 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, - 0x2a, 0x22, 0x1f, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x12, 0x7c, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, - 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, - 0x12, 0x5a, 0x0a, 0x09, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, - 0x0b, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x12, 0xac, 0x01, 0x0a, - 0x1f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x12, 0x2f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, - 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, - 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, - 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, - 0x2d, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x73, 0x0a, 0x0f, 0x4c, - 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1f, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x3a, 0x6c, 0x69, 0x73, 0x74, - 0x12, 0x8a, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x26, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, - 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x8c, 0x01, - 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, - 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x4a, 0x0a, 0x0b, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x59, 0x0a, 0x14, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, - 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x73, 0x12, 0x64, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x3a, 0x01, 0x2a, 0x22, 0x09, - 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x6e, 0x0a, 0x0d, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x18, 0x2a, 0x16, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x56, 0x0a, 0x0a, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x12, 0x59, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x09, 0x22, 0x07, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x6b, 0x0a, 0x0b, - 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x19, - 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, 0x7b, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x12, 0x64, 0x0a, 0x0b, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x73, 0x2f, 0x7b, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, - 0x5a, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x1b, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0a, 0x12, 0x08, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x70, 0x0a, 0x0c, 0x43, - 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, - 0x22, 0x1b, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x12, 0x78, 0x0a, - 0x0e, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, - 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, - 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, - 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x75, - 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x12, 0x6c, 0x0a, 0x0b, 0x44, 0x72, 0x61, 0x69, 0x6e, - 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x72, - 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x22, 0x1a, 0x2f, 0x77, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, - 0x64, 0x72, 0x61, 0x69, 0x6e, 0x12, 0x81, 0x01, 0x0a, 0x15, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x23, 0x5a, 0x21, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x65, 0x61, 0x6d, 0x2d, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x2f, 0x62, 0x65, 0x74, 0x61, 0x39, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_gateway_proto_rawDesc = "" + + "\n" + + "\rgateway.proto\x12\agateway\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/api/annotations.proto\x1a\vtypes.proto\"\x12\n" + + "\x10AuthorizeRequest\"\x80\x01\n" + + "\x11AuthorizeResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12!\n" + + "\fworkspace_id\x18\x02 \x01(\tR\vworkspaceId\x12\x1b\n" + + "\tnew_token\x18\x03 \x01(\tR\bnewToken\x12\x1b\n" + + "\terror_msg\x18\x04 \x01(\tR\berrorMsg\".\n" + + "\x12SignPayloadRequest\x12\x18\n" + + "\apayload\x18\x01 \x01(\fR\apayload\"~\n" + + "\x13SignPayloadResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x1c\n" + + "\tsignature\x18\x02 \x01(\tR\tsignature\x12\x1c\n" + + "\ttimestamp\x18\x03 \x01(\x03R\ttimestamp\x12\x1b\n" + + "\terror_msg\x18\x04 \x01(\tR\berrorMsg\"8\n" + + "\x0eObjectMetadata\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n" + + "\x04size\x18\x02 \x01(\x03R\x04size\"Y\n" + + "\x11HeadObjectRequest\x12\x12\n" + + "\x04hash\x18\x01 \x01(\tR\x04hash\x120\n" + + "\x14supports_put_headers\x18\x02 \x01(\bR\x12supportsPutHeaders\"\xec\x01\n" + + "\x12HeadObjectResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x16\n" + + "\x06exists\x18\x02 \x01(\bR\x06exists\x12\x1b\n" + + "\tobject_id\x18\x03 \x01(\tR\bobjectId\x12@\n" + + "\x0fobject_metadata\x18\x04 \x01(\v2\x17.gateway.ObjectMetadataR\x0eobjectMetadata\x12\x1b\n" + + "\terror_msg\x18\x05 \x01(\tR\berrorMsg\x122\n" + + "\x15use_workspace_storage\x18\x06 \x01(\bR\x13useWorkspaceStorage\"\xcf\x01\n" + + "\x13CreateObjectRequest\x12@\n" + + "\x0fobject_metadata\x18\x01 \x01(\v2\x17.gateway.ObjectMetadataR\x0eobjectMetadata\x12\x12\n" + + "\x04hash\x18\x02 \x01(\tR\x04hash\x12\x12\n" + + "\x04size\x18\x03 \x01(\x03R\x04size\x12\x1c\n" + + "\toverwrite\x18\x04 \x01(\bR\toverwrite\x120\n" + + "\x14supports_put_headers\x18\x05 \x01(\bR\x12supportsPutHeaders\"\x94\x02\n" + + "\x14CreateObjectResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x1b\n" + + "\tobject_id\x18\x02 \x01(\tR\bobjectId\x12#\n" + + "\rpresigned_url\x18\x03 \x01(\tR\fpresignedUrl\x12\x1b\n" + + "\terror_msg\x18\x04 \x01(\tR\berrorMsg\x12N\n" + + "\vput_headers\x18\x05 \x03(\v2-.gateway.CreateObjectResponse.PutHeadersEntryR\n" + + "putHeaders\x1a=\n" + + "\x0fPutHeadersEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xad\x01\n" + + "\x10PutObjectRequest\x12%\n" + + "\x0eobject_content\x18\x01 \x01(\fR\robjectContent\x12@\n" + + "\x0fobject_metadata\x18\x02 \x01(\v2\x17.gateway.ObjectMetadataR\x0eobjectMetadata\x12\x12\n" + + "\x04hash\x18\x03 \x01(\tR\x04hash\x12\x1c\n" + + "\toverwrite\x18\x04 \x01(\bR\toverwrite\"]\n" + + "\x11PutObjectResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x1b\n" + + "\tobject_id\x18\x02 \x01(\tR\bobjectId\x12\x1b\n" + + "\terror_msg\x18\x03 \x01(\tR\berrorMsg\"\xd6\x01\n" + + "\x1dSyncContainerWorkspaceRequest\x12!\n" + + "\fcontainer_id\x18\x01 \x01(\tR\vcontainerId\x12\x12\n" + + "\x04path\x18\x02 \x01(\tR\x04path\x12\x19\n" + + "\bnew_path\x18\x03 \x01(\tR\anewPath\x12\x15\n" + + "\x06is_dir\x18\x04 \x01(\bR\x05isDir\x12\x12\n" + + "\x04data\x18\x05 \x01(\fR\x04data\x128\n" + + "\x02op\x18\x06 \x01(\x0e2(.gateway.SyncContainerWorkspaceOperationR\x02op\"0\n" + + "\x1eSyncContainerWorkspaceResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\"\x17\n" + + "\x15ListContainersRequest\"w\n" + + "\x16ListContainersResponse\x120\n" + + "\n" + + "containers\x18\x01 \x03(\v2\x10.types.ContainerR\n" + + "containers\x12\x0e\n" + + "\x02ok\x18\x02 \x01(\bR\x02ok\x12\x1b\n" + + "\terror_msg\x18\x03 \x01(\tR\berrorMsg\"9\n" + + "\x14StopContainerRequest\x12!\n" + + "\fcontainer_id\x18\x01 \x01(\tR\vcontainerId\"D\n" + + "\x15StopContainerResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x1b\n" + + "\terror_msg\x18\x02 \x01(\tR\berrorMsg\"?\n" + + "\x1aCheckpointContainerRequest\x12!\n" + + "\fcontainer_id\x18\x01 \x01(\tR\vcontainerId\"o\n" + + "\x1bCheckpointContainerResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12#\n" + + "\rcheckpoint_id\x18\x02 \x01(\tR\fcheckpointId\x12\x1b\n" + + "\terror_msg\x18\x03 \x01(\tR\berrorMsg\"\xd3\x01\n" + + "\x16ContainerStreamMessage\x12J\n" + + "\x0eattach_request\x18\x01 \x01(\v2!.gateway.AttachToContainerRequestH\x00R\rattachRequest\x12b\n" + + "\x18sync_container_workspace\x18\x02 \x01(\v2&.gateway.SyncContainerWorkspaceRequestH\x00R\x16syncContainerWorkspaceB\t\n" + + "\apayload\"=\n" + + "\x18AttachToContainerRequest\x12!\n" + + "\fcontainer_id\x18\x01 \x01(\tR\vcontainerId\"d\n" + + "\x19AttachToContainerResponse\x12\x16\n" + + "\x06output\x18\x01 \x01(\tR\x06output\x12\x12\n" + + "\x04done\x18\x02 \x01(\bR\x04done\x12\x1b\n" + + "\texit_code\x18\x03 \x01(\x05R\bexitCode\"N\n" + + "\x10StartTaskRequest\x12\x17\n" + + "\atask_id\x18\x01 \x01(\tR\x06taskId\x12!\n" + + "\fcontainer_id\x18\x02 \x01(\tR\vcontainerId\"#\n" + + "\x11StartTaskResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\"\x85\x02\n" + + "\x0eEndTaskRequest\x12\x17\n" + + "\atask_id\x18\x01 \x01(\tR\x06taskId\x12#\n" + + "\rtask_duration\x18\x02 \x01(\x02R\ftaskDuration\x12\x1f\n" + + "\vtask_status\x18\x03 \x01(\tR\n" + + "taskStatus\x12!\n" + + "\fcontainer_id\x18\x04 \x01(\tR\vcontainerId\x12-\n" + + "\x12container_hostname\x18\x05 \x01(\tR\x11containerHostname\x12*\n" + + "\x11keep_warm_seconds\x18\x06 \x01(\x02R\x0fkeepWarmSeconds\x12\x16\n" + + "\x06result\x18\a \x01(\fR\x06result\"!\n" + + "\x0fEndTaskResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\"$\n" + + "\n" + + "StringList\x12\x16\n" + + "\x06values\x18\x01 \x03(\tR\x06values\"\xbb\x01\n" + + "\x10ListTasksRequest\x12@\n" + + "\afilters\x18\x01 \x03(\v2&.gateway.ListTasksRequest.FiltersEntryR\afilters\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\x1aO\n" + + "\fFiltersEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12)\n" + + "\x05value\x18\x02 \x01(\v2\x13.gateway.StringListR\x05value:\x028\x01\"\xb9\x03\n" + + "\x04Task\x12\x0e\n" + + "\x02id\x18\x02 \x01(\tR\x02id\x12\x16\n" + + "\x06status\x18\x03 \x01(\tR\x06status\x12!\n" + + "\fcontainer_id\x18\x04 \x01(\tR\vcontainerId\x129\n" + + "\n" + + "started_at\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\tstartedAt\x125\n" + + "\bended_at\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\aendedAt\x12\x17\n" + + "\astub_id\x18\a \x01(\tR\x06stubId\x12\x1b\n" + + "\tstub_name\x18\b \x01(\tR\bstubName\x12!\n" + + "\fworkspace_id\x18\t \x01(\tR\vworkspaceId\x12%\n" + + "\x0eworkspace_name\x18\n" + + " \x01(\tR\rworkspaceName\x129\n" + + "\n" + + "created_at\x18\v \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x129\n" + + "\n" + + "updated_at\x18\f \x01(\v2\x1a.google.protobuf.TimestampR\tupdatedAt\"w\n" + + "\x11ListTasksResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12#\n" + + "\x05tasks\x18\x03 \x03(\v2\r.gateway.TaskR\x05tasks\x12\x14\n" + + "\x05total\x18\x04 \x01(\x05R\x05total\"-\n" + + "\x10StopTasksRequest\x12\x19\n" + + "\btask_ids\x18\x01 \x03(\tR\ataskIds\"<\n" + + "\x11StopTasksResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"x\n" + + "\x06Volume\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1d\n" + + "\n" + + "mount_path\x18\x02 \x01(\tR\tmountPath\x124\n" + + "\x06config\x18\x03 \x01(\v2\x17.types.MountPointConfigH\x00R\x06config\x88\x01\x01B\t\n" + + "\a_config\"\x1f\n" + + "\tSecretVar\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"\x9e\x01\n" + + "\n" + + "Autoscaler\x12\x12\n" + + "\x04type\x18\x01 \x01(\tR\x04type\x12%\n" + + "\x0emax_containers\x18\x02 \x01(\rR\rmaxContainers\x12.\n" + + "\x13tasks_per_container\x18\x03 \x01(\rR\x11tasksPerContainer\x12%\n" + + "\x0emin_containers\x18\x04 \x01(\rR\rminContainers\"\xed\x01\n" + + "\tLLMConfig\x12\x19\n" + + "\bmodel_id\x18\x01 \x01(\tR\amodelId\x12\x16\n" + + "\x06engine\x18\x02 \x01(\tR\x06engine\x12*\n" + + "\x11served_model_name\x18\x03 \x01(\tR\x0fservedModelName\x12%\n" + + "\x0econtext_length\x18\x04 \x01(\x03R\rcontextLength\x12\x1c\n" + + "\ttokenizer\x18\x05 \x01(\tR\ttokenizer\x12!\n" + + "\fmetrics_path\x18\x06 \x01(\tR\vmetricsPath\x12\x19\n" + + "\bslo_tier\x18\a \x01(\tR\asloTier\"\xcc\x03\n" + + "\x15DatabaseServingConfig\x12\x12\n" + + "\x04kind\x18\x01 \x01(\tR\x04kind\x12\x12\n" + + "\x04port\x18\x02 \x01(\rR\x04port\x12'\n" + + "\x0freadiness_probe\x18\x03 \x01(\tR\x0ereadinessProbe\x12.\n" + + "\x13connection_env_name\x18\x04 \x01(\tR\x11connectionEnvName\x126\n" + + "\x17credential_secret_names\x18\x05 \x03(\tR\x15credentialSecretNames\x12'\n" + + "\x0fdurability_mode\x18\x06 \x01(\tR\x0edurabilityMode\x120\n" + + "\x14username_secret_name\x18\a \x01(\tR\x12usernameSecretName\x120\n" + + "\x14password_secret_name\x18\b \x01(\tR\x12passwordSecretName\x120\n" + + "\x14database_secret_name\x18\t \x01(\tR\x12databaseSecretName\x12;\n" + + "\x1aconnection_url_secret_name\x18\n" + + " \x01(\tR\x17connectionUrlSecretName\"\xb7\x01\n" + + "\rServingConfig\x12\x19\n" + + "\bapp_kind\x18\x01 \x01(\tR\aappKind\x12)\n" + + "\x10serving_protocol\x18\x02 \x01(\tR\x0fservingProtocol\x12$\n" + + "\x03llm\x18\x03 \x01(\v2\x12.gateway.LLMConfigR\x03llm\x12:\n" + + "\bdatabase\x18\x04 \x01(\v2\x1e.gateway.DatabaseServingConfigR\bdatabase\"\xa9\x01\n" + + "\vDurableDisk\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n" + + "\x04size\x18\x02 \x01(\tR\x04size\x12\x1d\n" + + "\n" + + "mount_path\x18\x03 \x01(\tR\tmountPath\x12\x1e\n" + + "\n" + + "filesystem\x18\x04 \x01(\tR\n" + + "filesystem\x12\x16\n" + + "\x06driver\x18\x05 \x01(\tR\x06driver\x12\x1b\n" + + "\tread_only\x18\x06 \x01(\bR\breadOnly\"Y\n" + + "\n" + + "TaskPolicy\x12\x18\n" + + "\atimeout\x18\x01 \x01(\x03R\atimeout\x12\x1f\n" + + "\vmax_retries\x18\x02 \x01(\rR\n" + + "maxRetries\x12\x10\n" + + "\x03ttl\x18\x03 \x01(\rR\x03ttl\"\x8e\x01\n" + + "\x06Schema\x123\n" + + "\x06fields\x18\x01 \x03(\v2\x1b.gateway.Schema.FieldsEntryR\x06fields\x1aO\n" + + "\vFieldsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12*\n" + + "\x05value\x18\x02 \x01(\v2\x14.gateway.SchemaFieldR\x05value:\x028\x01\"J\n" + + "\vSchemaField\x12\x12\n" + + "\x04type\x18\x01 \x01(\tR\x04type\x12'\n" + + "\x06fields\x18\x02 \x01(\v2\x0f.gateway.SchemaR\x06fields\"\xed\f\n" + + "\x16GetOrCreateStubRequest\x12\x1b\n" + + "\tobject_id\x18\x01 \x01(\tR\bobjectId\x12\x19\n" + + "\bimage_id\x18\x02 \x01(\tR\aimageId\x12\x1b\n" + + "\tstub_type\x18\x03 \x01(\tR\bstubType\x12\x12\n" + + "\x04name\x18\x04 \x01(\tR\x04name\x12%\n" + + "\x0epython_version\x18\x05 \x01(\tR\rpythonVersion\x12\x10\n" + + "\x03cpu\x18\x06 \x01(\x03R\x03cpu\x12\x16\n" + + "\x06memory\x18\a \x01(\x03R\x06memory\x12\x10\n" + + "\x03gpu\x18\b \x01(\tR\x03gpu\x12\x18\n" + + "\ahandler\x18\t \x01(\tR\ahandler\x12\x18\n" + + "\aretries\x18\n" + + " \x01(\rR\aretries\x12\x18\n" + + "\atimeout\x18\v \x01(\x03R\atimeout\x12*\n" + + "\x11keep_warm_seconds\x18\f \x01(\x02R\x0fkeepWarmSeconds\x12\x18\n" + + "\aworkers\x18\r \x01(\rR\aworkers\x12*\n" + + "\x11max_pending_tasks\x18\x0f \x01(\rR\x0fmaxPendingTasks\x12)\n" + + "\avolumes\x18\x10 \x03(\v2\x0f.gateway.VolumeR\avolumes\x12!\n" + + "\fforce_create\x18\x11 \x01(\bR\vforceCreate\x12\x19\n" + + "\bon_start\x18\x12 \x01(\tR\aonStart\x12!\n" + + "\fcallback_url\x18\x13 \x01(\tR\vcallbackUrl\x12\x1e\n" + + "\n" + + "authorized\x18\x14 \x01(\bR\n" + + "authorized\x12,\n" + + "\asecrets\x18\x15 \x03(\v2\x12.gateway.SecretVarR\asecrets\x123\n" + + "\n" + + "autoscaler\x18\x16 \x01(\v2\x13.gateway.AutoscalerR\n" + + "autoscaler\x124\n" + + "\vtask_policy\x18\x17 \x01(\v2\x13.gateway.TaskPolicyR\n" + + "taskPolicy\x12/\n" + + "\x13concurrent_requests\x18\x18 \x01(\rR\x12concurrentRequests\x12\x14\n" + + "\x05extra\x18\x19 \x01(\tR\x05extra\x12-\n" + + "\x12checkpoint_enabled\x18\x1a \x01(\bR\x11checkpointEnabled\x12\x1b\n" + + "\tgpu_count\x18\x1b \x01(\rR\bgpuCount\x12\x1b\n" + + "\ton_deploy\x18\x1c \x01(\tR\bonDeploy\x12)\n" + + "\x11on_deploy_stub_id\x18\x1d \x01(\tR\x0eonDeployStubId\x12\x1e\n" + + "\n" + + "entrypoint\x18\x1e \x03(\tR\n" + + "entrypoint\x12\x14\n" + + "\x05ports\x18\x1f \x03(\rR\x05ports\x12\x10\n" + + "\x03env\x18 \x03(\tR\x03env\x12\x19\n" + + "\bapp_name\x18! \x01(\tR\aappName\x12.\n" + + "\apricing\x18\" \x01(\v2\x14.types.PricingPolicyR\apricing\x12'\n" + + "\x06inputs\x18# \x01(\v2\x0f.gateway.SchemaR\x06inputs\x12)\n" + + "\aoutputs\x18$ \x01(\v2\x0f.gateway.SchemaR\aoutputs\x12\x10\n" + + "\x03tcp\x18% \x01(\bR\x03tcp\x12#\n" + + "\rblock_network\x18& \x01(\bR\fblockNetwork\x12\x1d\n" + + "\n" + + "allow_list\x18' \x03(\tR\tallowList\x12%\n" + + "\x0edocker_enabled\x18( \x01(\bR\rdockerEnabled\x12'\n" + + "\x04pool\x18) \x01(\v2\x13.gateway.PoolConfigR\x04pool\x12\x1d\n" + + "\n" + + "is_service\x18* \x01(\bR\tisService\x120\n" + + "\aserving\x18+ \x01(\v2\x16.gateway.ServingConfigR\aserving\x12*\n" + + "\x05disks\x18, \x03(\v2\x14.gateway.DurableDiskR\x05disks\x12+\n" + + "\x11allow_marketplace\x18- \x01(\bR\x10allowMarketplace\x12G\n" + + "\x12checkpoint_trigger\x18. \x01(\v2\x18.types.CheckpointTriggerR\x11checkpointTrigger\x12'\n" + + "\x0fgpu_virtualized\x18/ \x01(\bR\x0egpuVirtualized\"\xfc\x01\n" + + "\x17GetOrCreateStubResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\astub_id\x18\x02 \x01(\tR\x06stubId\x12\x17\n" + + "\aerr_msg\x18\x03 \x01(\tR\x06errMsg\x12\x19\n" + + "\bwarn_msg\x18\x04 \x01(\tR\awarnMsg\x12'\n" + + "\x0fcapacity_status\x18\x05 \x01(\tR\x0ecapacityStatus\x12)\n" + + "\x10unsupported_gpus\x18\x06 \x03(\tR\x0funsupportedGpus\x120\n" + + "\x14matched_private_pool\x18\a \x01(\tR\x12matchedPrivatePool\"Z\n" + + "\x11DeployStubRequest\x12\x17\n" + + "\astub_id\x18\x01 \x01(\tR\x06stubId\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x18\n" + + "\arollout\x18\x03 \x01(\tR\arollout\"\xdd\x01\n" + + "\x12DeployStubResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12#\n" + + "\rdeployment_id\x18\x02 \x01(\tR\fdeploymentId\x12\x18\n" + + "\aversion\x18\x03 \x01(\rR\aversion\x12\x1d\n" + + "\n" + + "invoke_url\x18\x04 \x01(\tR\tinvokeUrl\x12\x17\n" + + "\aerr_msg\x18\x05 \x01(\tR\x06errMsg\x12\x19\n" + + "\bwarn_msg\x18\x06 \x01(\tR\awarnMsg\x12%\n" + + "\x0erollout_action\x18\a \x01(\tR\rrolloutAction\"\x9b\x04\n" + + "\n" + + "Deployment\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x16\n" + + "\x06active\x18\x03 \x01(\bR\x06active\x12\x17\n" + + "\astub_id\x18\x04 \x01(\tR\x06stubId\x12\x1b\n" + + "\tstub_type\x18\x05 \x01(\tR\bstubType\x12\x1b\n" + + "\tstub_name\x18\x06 \x01(\tR\bstubName\x12\x18\n" + + "\aversion\x18\a \x01(\rR\aversion\x12!\n" + + "\fworkspace_id\x18\b \x01(\tR\vworkspaceId\x12%\n" + + "\x0eworkspace_name\x18\t \x01(\tR\rworkspaceName\x129\n" + + "\n" + + "created_at\x18\n" + + " \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x129\n" + + "\n" + + "updated_at\x18\v \x01(\v2\x1a.google.protobuf.TimestampR\tupdatedAt\x12\x15\n" + + "\x06app_id\x18\f \x01(\tR\x05appId\x12#\n" + + "\rdatabase_kind\x18\r \x01(\tR\fdatabaseKind\x128\n" + + "\x18connection_string_secret\x18\x0e \x01(\tR\x16connectionStringSecret\x12.\n" + + "\x13connection_env_name\x18\x0f \x01(\tR\x11connectionEnvName\"\xc7\x01\n" + + "\x16ListDeploymentsRequest\x12F\n" + + "\afilters\x18\x01 \x03(\v2,.gateway.ListDeploymentsRequest.FiltersEntryR\afilters\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\x1aO\n" + + "\fFiltersEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12)\n" + + "\x05value\x18\x02 \x01(\v2\x13.gateway.StringListR\x05value:\x028\x01\"y\n" + + "\x17ListDeploymentsResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x125\n" + + "\vdeployments\x18\x03 \x03(\v2\x13.gateway.DeploymentR\vdeployments\"'\n" + + "\x15StopDeploymentRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\"A\n" + + "\x16StopDeploymentResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"(\n" + + "\x16StartDeploymentRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\"B\n" + + "\x17StartDeploymentResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"H\n" + + "\x16ScaleDeploymentRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1e\n" + + "\n" + + "containers\x18\x02 \x01(\rR\n" + + "containers\"B\n" + + "\x17ScaleDeploymentResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\")\n" + + "\x17DeleteDeploymentRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\"C\n" + + "\x18DeleteDeploymentResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"\xec\x02\n" + + "\x04Pool\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x16\n" + + "\x06active\x18\x03 \x01(\bR\x06active\x12\x10\n" + + "\x03gpu\x18\x04 \x01(\tR\x03gpu\x12\x1e\n" + + "\n" + + "minFreeGpu\x18\x05 \x01(\tR\n" + + "minFreeGpu\x12\x1e\n" + + "\n" + + "minFreeCpu\x18\x06 \x01(\tR\n" + + "minFreeCpu\x12$\n" + + "\rminFreeMemory\x18\a \x01(\tR\rminFreeMemory\x12*\n" + + "\x10defaultWorkerCpu\x18\b \x01(\tR\x10defaultWorkerCpu\x120\n" + + "\x13defaultWorkerMemory\x18\t \x01(\tR\x13defaultWorkerMemory\x124\n" + + "\x15defaultWorkerGpuCount\x18\n" + + " \x01(\tR\x15defaultWorkerGpuCount\x12,\n" + + "\x05state\x18\v \x01(\v2\x16.types.WorkerPoolStateR\x05state\"\xbb\x01\n" + + "\x10ListPoolsRequest\x12@\n" + + "\afilters\x18\x01 \x03(\v2&.gateway.ListPoolsRequest.FiltersEntryR\afilters\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\x1aO\n" + + "\fFiltersEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12)\n" + + "\x05value\x18\x02 \x01(\v2\x13.gateway.StringListR\x05value:\x028\x01\"a\n" + + "\x11ListPoolsResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12#\n" + + "\x05pools\x18\x03 \x03(\v2\r.gateway.PoolR\x05pools\"\xf9\x02\n" + + "\n" + + "PoolConfig\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x10\n" + + "\x03gpu\x18\x02 \x03(\tR\x03gpu\x12\x14\n" + + "\x05nodes\x18\x03 \x01(\rR\x05nodes\x12\x10\n" + + "\x03ttl\x18\x04 \x01(\tR\x03ttl\x12\x1b\n" + + "\tmax_spend\x18\x05 \x01(\x01R\bmaxSpend\x12\x1c\n" + + "\tproviders\x18\x06 \x03(\tR\tproviders\x12\x18\n" + + "\aregions\x18\a \x03(\tR\aregions\x12'\n" + + "\x0fmin_reliability\x18\b \x01(\x01R\x0eminReliability\x12\x1a\n" + + "\bselector\x18\t \x01(\tR\bselector\x12\x12\n" + + "\x04mode\x18\n" + + " \x01(\tR\x04mode\x12\x1c\n" + + "\ttransport\x18\v \x01(\tR\ttransport\x12\x1a\n" + + "\bfallback\x18\f \x01(\tR\bfallback\x12\x1a\n" + + "\bpriority\x18\r \x01(\x05R\bpriority\x12\x19\n" + + "\boffer_id\x18\x0e \x01(\tR\aofferId\"\xd2\x04\n" + + "\tPoolOffer\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1a\n" + + "\bprovider\x18\x02 \x01(\tR\bprovider\x12#\n" + + "\rinstance_type\x18\x03 \x01(\tR\finstanceType\x12\x16\n" + + "\x06region\x18\x04 \x01(\tR\x06region\x12\x10\n" + + "\x03gpu\x18\x05 \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\x06 \x01(\rR\bgpuCount\x12%\n" + + "\x0ecpu_millicores\x18\a \x01(\x03R\rcpuMillicores\x12\x1b\n" + + "\tmemory_mb\x18\b \x01(\x03R\bmemoryMb\x12,\n" + + "\x12hourly_cost_micros\x18\t \x01(\x03R\x10hourlyCostMicros\x12 \n" + + "\vreliability\x18\n" + + " \x01(\x01R\vreliability\x12\x1c\n" + + "\tavailable\x18\v \x01(\rR\tavailable\x12\x1d\n" + + "\n" + + "storage_mb\x18\f \x01(\x03R\tstorageMb\x12\x14\n" + + "\x05cloud\x18\r \x01(\tR\x05cloud\x12\x1d\n" + + "\n" + + "node_count\x18\x0e \x01(\rR\tnodeCount\x12!\n" + + "\fdisplay_name\x18\x0f \x01(\tR\vdisplayName\x12\x1a\n" + + "\bcategory\x18\x10 \x01(\tR\bcategory\x12.\n" + + "\x13region_display_name\x18\x11 \x01(\tR\x11regionDisplayName\x12\x1a\n" + + "\blatitude\x18\x12 \x01(\x01R\blatitude\x12\x1c\n" + + "\tlongitude\x18\x13 \x01(\x01R\tlongitude\"\xfb\x05\n" + + "\x10ProviderInstance\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1b\n" + + "\tpool_name\x18\x02 \x01(\tR\bpoolName\x12\x1a\n" + + "\bprovider\x18\x03 \x01(\tR\bprovider\x12\x19\n" + + "\boffer_id\x18\x04 \x01(\tR\aofferId\x12\x16\n" + + "\x06status\x18\x05 \x01(\tR\x06status\x12\x1b\n" + + "\tgpu_count\x18\x06 \x01(\rR\bgpuCount\x12,\n" + + "\x12hourly_cost_micros\x18\a \x01(\x03R\x10hourlyCostMicros\x12\x16\n" + + "\x06source\x18\b \x01(\tR\x06source\x129\n" + + "\n" + + "created_at\x18\t \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x129\n" + + "\n" + + "expires_at\x18\n" + + " \x01(\v2\x1a.google.protobuf.TimestampR\texpiresAt\x12H\n" + + "\x12billing_renewal_at\x18\v \x01(\v2\x1a.google.protobuf.TimestampR\x10billingRenewalAt\x12%\n" + + "\x0estatus_message\x18\f \x01(\tR\rstatusMessage\x12-\n" + + "\x12terminating_reason\x18\r \x01(\tR\x11terminatingReason\x12\x1d\n" + + "\n" + + "machine_id\x18\x0e \x01(\tR\tmachineId\x12\x14\n" + + "\x05cloud\x18\x0f \x01(\tR\x05cloud\x12\x16\n" + + "\x06region\x18\x10 \x01(\tR\x06region\x12\x1d\n" + + "\n" + + "node_count\x18\x11 \x01(\rR\tnodeCount\x12#\n" + + "\rinstance_type\x18\x12 \x01(\tR\finstanceType\x12%\n" + + "\x0ecpu_millicores\x18\x13 \x01(\x03R\rcpuMillicores\x12\x1b\n" + + "\tmemory_mb\x18\x14 \x01(\x03R\bmemoryMb\x12\x1d\n" + + "\n" + + "storage_mb\x18\x15 \x01(\x03R\tstorageMb\"\xad\x04\n" + + "\vPrivatePool\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x1a\n" + + "\bselector\x18\x02 \x01(\tR\bselector\x12+\n" + + "\x06config\x18\x03 \x01(\v2\x13.gateway.PoolConfigR\x06config\x12=\n" + + "\freservations\x18\x04 \x03(\v2\x19.gateway.ProviderInstanceR\freservations\x124\n" + + "\x16committed_spend_micros\x18\x06 \x01(\x03R\x14committedSpendMicros\x12\x16\n" + + "\x06status\x18\a \x01(\tR\x06status\x12\x16\n" + + "\x06source\x18\b \x01(\tR\x06source\x129\n" + + "\n" + + "created_at\x18\t \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x129\n" + + "\n" + + "expires_at\x18\n" + + " \x01(\v2\x1a.google.protobuf.TimestampR\texpiresAt\x12#\n" + + "\rmachine_count\x18\v \x01(\rR\fmachineCount\x12.\n" + + "\x13ready_machine_count\x18\f \x01(\rR\x11readyMachineCount\x12%\n" + + "\x0ereserved_nodes\x18\r \x01(\rR\rreservedNodes\x12*\n" + + "\x04byoc\x18\x0e \x01(\v2\x16.gateway.BYOCPoolStateR\x04byoc\"@\n" + + "\x15ListPoolOffersRequest\x12'\n" + + "\x04pool\x18\x01 \x01(\v2\x13.gateway.PoolConfigR\x04pool\"m\n" + + "\x16ListPoolOffersResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12*\n" + + "\x06offers\x18\x03 \x03(\v2\x12.gateway.PoolOfferR\x06offers\"Z\n" + + "\x19LaunchPoolCapacityRequest\x12'\n" + + "\x04pool\x18\x01 \x01(\v2\x13.gateway.PoolConfigR\x04pool\x12\x14\n" + + "\x05nodes\x18\x02 \x01(\rR\x05nodes\"\xde\x01\n" + + "\x1aLaunchPoolCapacityResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12(\n" + + "\x04pool\x18\x03 \x01(\v2\x14.gateway.PrivatePoolR\x04pool\x12\x1d\n" + + "\n" + + "error_code\x18\x04 \x01(\tR\terrorCode\x12%\n" + + "\x0erequired_cents\x18\x05 \x01(\x03R\rrequiredCents\x12'\n" + + "\x0favailable_cents\x18\x06 \x01(\x03R\x0eavailableCents\"\xc9\x01\n" + + "\x17ListPrivatePoolsRequest\x12G\n" + + "\afilters\x18\x01 \x03(\v2-.gateway.ListPrivatePoolsRequest.FiltersEntryR\afilters\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\x1aO\n" + + "\fFiltersEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12)\n" + + "\x05value\x18\x02 \x01(\v2\x13.gateway.StringListR\x05value:\x028\x01\"o\n" + + "\x18ListPrivatePoolsResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12*\n" + + "\x05pools\x18\x03 \x03(\v2\x14.gateway.PrivatePoolR\x05pools\"\x9d\x02\n" + + "\x15CreateBYOCPoolRequest\x12\x1a\n" + + "\bprovider\x18\x01 \x01(\tR\bprovider\x12\x1b\n" + + "\tpool_name\x18\x02 \x01(\tR\bpoolName\x12\x16\n" + + "\x06region\x18\x03 \x01(\tR\x06region\x12#\n" + + "\rinstance_type\x18\x04 \x01(\tR\finstanceType\x12#\n" + + "\rdesired_nodes\x18\x05 \x01(\rR\fdesiredNodes\x12\x1b\n" + + "\tmax_nodes\x18\x06 \x01(\rR\bmaxNodes\x12\x1d\n" + + "\n" + + "account_id\x18\a \x01(\tR\taccountId\x12\x10\n" + + "\x03gpu\x18\b \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\t \x01(\rR\bgpuCount\"\xfc\x01\n" + + "\x16CreateBYOCPoolResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12(\n" + + "\x04pool\x18\x03 \x01(\v2\x14.gateway.PrivatePoolR\x04pool\x12\x1b\n" + + "\tsetup_url\x18\x04 \x01(\tR\bsetupUrl\x12#\n" + + "\rresource_name\x18\x05 \x01(\tR\fresourceName\x12!\n" + + "\fresource_url\x18\x06 \x01(\tR\vresourceUrl\x12*\n" + + "\x04byoc\x18\a \x01(\v2\x16.gateway.BYOCPoolStateR\x04byoc\"\xd8\x05\n" + + "\rBYOCPoolState\x12\x1a\n" + + "\bprovider\x18\x01 \x01(\tR\bprovider\x12\x1d\n" + + "\n" + + "account_id\x18\x02 \x01(\tR\taccountId\x12\x16\n" + + "\x06region\x18\x03 \x01(\tR\x06region\x12#\n" + + "\rresource_name\x18\x04 \x01(\tR\fresourceName\x12!\n" + + "\fresource_url\x18\x05 \x01(\tR\vresourceUrl\x12\x1f\n" + + "\vdestroy_url\x18\x06 \x01(\tR\n" + + "destroyUrl\x12\x14\n" + + "\x05phase\x18\a \x01(\tR\x05phase\x12#\n" + + "\rdesired_nodes\x18\b \x01(\rR\fdesiredNodes\x12\x1b\n" + + "\tmax_nodes\x18\t \x01(\rR\bmaxNodes\x12)\n" + + "\x10target_sandboxes\x18\n" + + " \x01(\rR\x0ftargetSandboxes\x12,\n" + + "\x12sandboxes_per_node\x18\v \x01(\rR\x10sandboxesPerNode\x12#\n" + + "\rinstance_type\x18\f \x01(\tR\finstanceType\x12#\n" + + "\rmachine_count\x18\r \x01(\rR\fmachineCount\x12.\n" + + "\x13ready_machine_count\x18\x0e \x01(\rR\x11readyMachineCount\x12\x18\n" + + "\amessage\x18\x0f \x01(\tR\amessage\x12,\n" + + "\x12hourly_cost_micros\x18\x10 \x01(\x03R\x10hourlyCostMicros\x127\n" + + "\x18total_hourly_cost_micros\x18\x11 \x01(\x03R\x15totalHourlyCostMicros\x120\n" + + "\x14direct_scale_enabled\x18\x12 \x01(\bR\x12directScaleEnabled\x12\x10\n" + + "\x03gpu\x18\x13 \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\x14 \x01(\rR\bgpuCount\"1\n" + + "\x12GetBYOCPoolRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\"\xff\x01\n" + + "\x13GetBYOCPoolResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12(\n" + + "\x04pool\x18\x03 \x01(\v2\x14.gateway.PrivatePoolR\x04pool\x12\x14\n" + + "\x05ready\x18\x04 \x01(\bR\x05ready\x12.\n" + + "\x13ready_machine_count\x18\x05 \x01(\rR\x11readyMachineCount\x12#\n" + + "\rmachine_count\x18\x06 \x01(\rR\fmachineCount\x12*\n" + + "\x04byoc\x18\a \x01(\v2\x16.gateway.BYOCPoolStateR\x04byoc\"u\n" + + "\x14ScaleBYOCPoolRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\x12#\n" + + "\rdesired_nodes\x18\x02 \x01(\rR\fdesiredNodes\x12\x1b\n" + + "\tmax_nodes\x18\x03 \x01(\rR\bmaxNodes\"\x96\x01\n" + + "\x15ScaleBYOCPoolResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12(\n" + + "\x04pool\x18\x03 \x01(\v2\x14.gateway.PrivatePoolR\x04pool\x12*\n" + + "\x04byoc\x18\x04 \x01(\v2\x16.gateway.BYOCPoolStateR\x04byoc\"\xe2\x04\n" + + "\x12MarketplaceListing\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12.\n" + + "\x13seller_workspace_id\x18\x02 \x01(\tR\x11sellerWorkspaceId\x12!\n" + + "\fdisplay_name\x18\x03 \x01(\tR\vdisplayName\x12\x10\n" + + "\x03gpu\x18\x04 \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\x05 \x01(\rR\bgpuCount\x12\x16\n" + + "\x06source\x18\x06 \x01(\tR\x06source\x12 \n" + + "\vpreemptible\x18\a \x01(\bR\vpreemptible\x12\x16\n" + + "\x06public\x18\b \x01(\bR\x06public\x12\x16\n" + + "\x06status\x18\t \x01(\tR\x06status\x12\x1b\n" + + "\tpool_name\x18\n" + + " \x01(\tR\bpoolName\x129\n" + + "\n" + + "created_at\x18\v \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x129\n" + + "\n" + + "updated_at\x18\f \x01(\v2\x1a.google.protobuf.TimestampR\tupdatedAt\x12#\n" + + "\rmachine_count\x18\r \x01(\rR\fmachineCount\x12.\n" + + "\x13ready_machine_count\x18\x0e \x01(\rR\x11readyMachineCount\x12\x16\n" + + "\x06region\x18\x0f \x01(\tR\x06region\x12\x18\n" + + "\aruntime\x18\x10 \x01(\tR\aruntime\x126\n" + + "\x18price_per_gpu_hour_cents\x18\x11 \x01(\rR\x14pricePerGpuHourCents\"\x9a\x05\n" + + "\x10MarketplaceOffer\x12\x1d\n" + + "\n" + + "listing_id\x18\x01 \x01(\tR\tlistingId\x12.\n" + + "\x13seller_workspace_id\x18\x02 \x01(\tR\x11sellerWorkspaceId\x12!\n" + + "\fdisplay_name\x18\x03 \x01(\tR\vdisplayName\x12\x10\n" + + "\x03gpu\x18\x04 \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\x05 \x01(\rR\bgpuCount\x12\x16\n" + + "\x06source\x18\x06 \x01(\tR\x06source\x12 \n" + + "\vpreemptible\x18\a \x01(\bR\vpreemptible\x12#\n" + + "\rmachine_count\x18\b \x01(\rR\fmachineCount\x12.\n" + + "\x13ready_machine_count\x18\t \x01(\rR\x11readyMachineCount\x12\x18\n" + + "\aruntime\x18\n" + + " \x01(\tR\aruntime\x12\x16\n" + + "\x06region\x18\v \x01(\tR\x06region\x12\x1b\n" + + "\tcpu_cores\x18\f \x01(\rR\bcpuCores\x12\x1b\n" + + "\tmemory_mb\x18\r \x01(\x04R\bmemoryMb\x12\x17\n" + + "\adisk_gb\x18\x0e \x01(\x04R\x06diskGb\x12$\n" + + "\x0efree_gpu_count\x18\x0f \x01(\rR\ffreeGpuCount\x12 \n" + + "\vreliability\x18\x10 \x01(\x02R\vreliability\x129\n" + + "\n" + + "created_at\x18\x11 \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x12\x16\n" + + "\x06public\x18\x12 \x01(\bR\x06public\x126\n" + + "\x18price_per_gpu_hour_cents\x18\x13 \x01(\rR\x14pricePerGpuHourCents\"\xb2\x02\n" + + "\x1fCreateMarketplaceListingRequest\x12!\n" + + "\fdisplay_name\x18\x01 \x01(\tR\vdisplayName\x12\x10\n" + + "\x03gpu\x18\x02 \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\x03 \x01(\rR\bgpuCount\x12\x16\n" + + "\x06source\x18\x04 \x01(\tR\x06source\x12 \n" + + "\vpreemptible\x18\x05 \x01(\bR\vpreemptible\x12\x16\n" + + "\x06public\x18\x06 \x01(\bR\x06public\x12\x16\n" + + "\x06region\x18\a \x01(\tR\x06region\x12\x1b\n" + + "\tpool_name\x18\b \x01(\tR\bpoolName\x126\n" + + "\x18price_per_gpu_hour_cents\x18\t \x01(\rR\x14pricePerGpuHourCents\"\x82\x01\n" + + " CreateMarketplaceListingResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x125\n" + + "\alisting\x18\x03 \x01(\v2\x1b.gateway.MarketplaceListingR\alisting\"\x93\x03\n" + + "\x1fUpdateMarketplaceListingRequest\x12\x1d\n" + + "\n" + + "listing_id\x18\x01 \x01(\tR\tlistingId\x12!\n" + + "\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\x12\x10\n" + + "\x03gpu\x18\x03 \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\x04 \x01(\rR\bgpuCount\x12\x16\n" + + "\x06source\x18\x05 \x01(\tR\x06source\x12%\n" + + "\vpreemptible\x18\x06 \x01(\bH\x00R\vpreemptible\x88\x01\x01\x12\x1b\n" + + "\x06public\x18\a \x01(\bH\x01R\x06public\x88\x01\x01\x12\x16\n" + + "\x06status\x18\b \x01(\tR\x06status\x12\x16\n" + + "\x06region\x18\t \x01(\tR\x06region\x12;\n" + + "\x18price_per_gpu_hour_cents\x18\n" + + " \x01(\rH\x02R\x14pricePerGpuHourCents\x88\x01\x01B\x0e\n" + + "\f_preemptibleB\t\n" + + "\a_publicB\x1b\n" + + "\x19_price_per_gpu_hour_cents\"\x82\x01\n" + + " UpdateMarketplaceListingResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x125\n" + + "\alisting\x18\x03 \x01(\v2\x1b.gateway.MarketplaceListingR\alisting\"@\n" + + "\x1fDeleteMarketplaceListingRequest\x12\x1d\n" + + "\n" + + "listing_id\x18\x01 \x01(\tR\tlistingId\"K\n" + + " DeleteMarketplaceListingResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"6\n" + + "\x1eListMarketplaceListingsRequest\x12\x14\n" + + "\x05limit\x18\x01 \x01(\rR\x05limit\"\x83\x01\n" + + "\x1fListMarketplaceListingsResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x127\n" + + "\blistings\x18\x03 \x03(\v2\x1b.gateway.MarketplaceListingR\blistings\"S\n" + + " GetMarketplaceJoinCommandRequest\x12\x1d\n" + + "\n" + + "listing_id\x18\x01 \x01(\tR\tlistingId\x12\x10\n" + + "\x03ttl\x18\x02 \x01(\tR\x03ttl\"\xb7\x01\n" + + "!GetMarketplaceJoinCommandResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12\x18\n" + + "\acommand\x18\x03 \x01(\tR\acommand\x12\x14\n" + + "\x05token\x18\x04 \x01(\tR\x05token\x129\n" + + "\n" + + "expires_at\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\texpiresAt\"F\n" + + "\x1cListMarketplaceOffersRequest\x12\x10\n" + + "\x03gpu\x18\x01 \x01(\tR\x03gpu\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\"{\n" + + "\x1dListMarketplaceOffersResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x121\n" + + "\x06offers\x18\x03 \x03(\v2\x19.gateway.MarketplaceOfferR\x06offers\";\n" + + "\x1aGetMarketplaceOfferRequest\x12\x1d\n" + + "\n" + + "listing_id\x18\x01 \x01(\tR\tlistingId\"w\n" + + "\x1bGetMarketplaceOfferResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12/\n" + + "\x05offer\x18\x03 \x01(\v2\x19.gateway.MarketplaceOfferR\x05offer\"\x88\x03\n" + + "\x11MarketplaceRental\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1d\n" + + "\n" + + "listing_id\x18\x02 \x01(\tR\tlistingId\x12!\n" + + "\flisting_name\x18\x03 \x01(\tR\vlistingName\x12\x1b\n" + + "\tpool_name\x18\x04 \x01(\tR\bpoolName\x12\x1d\n" + + "\n" + + "machine_id\x18\x05 \x01(\tR\tmachineId\x12\x10\n" + + "\x03gpu\x18\x06 \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\a \x01(\rR\bgpuCount\x12\x16\n" + + "\x06region\x18\b \x01(\tR\x06region\x12+\n" + + "\x11machine_connected\x18\t \x01(\bR\x10machineConnected\x129\n" + + "\n" + + "created_at\x18\n" + + " \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x126\n" + + "\x18price_per_gpu_hour_cents\x18\v \x01(\rR\x14pricePerGpuHourCents\"{\n" + + "\x1eCreateMarketplaceRentalRequest\x12\x1d\n" + + "\n" + + "listing_id\x18\x01 \x01(\tR\tlistingId\x12\x1d\n" + + "\n" + + "machine_id\x18\x02 \x01(\tR\tmachineId\x12\x1b\n" + + "\tgpu_count\x18\x03 \x01(\rR\bgpuCount\"~\n" + + "\x1fCreateMarketplaceRentalResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x122\n" + + "\x06rental\x18\x03 \x01(\v2\x1a.gateway.MarketplaceRentalR\x06rental\"\x1f\n" + + "\x1dListMarketplaceRentalsRequest\"\x7f\n" + + "\x1eListMarketplaceRentalsResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x124\n" + + "\arentals\x18\x03 \x03(\v2\x1a.gateway.MarketplaceRentalR\arentals\"=\n" + + "\x1eDeleteMarketplaceRentalRequest\x12\x1b\n" + + "\trental_id\x18\x01 \x01(\tR\brentalId\"J\n" + + "\x1fDeleteMarketplaceRentalResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"\xc8\x01\n" + + "\x1bLaunchRentalWorkloadRequest\x12\x1b\n" + + "\trental_id\x18\x01 \x01(\tR\brentalId\x12\x12\n" + + "\x04kind\x18\x02 \x01(\tR\x04kind\x12\x19\n" + + "\bimage_id\x18\x03 \x01(\tR\aimageId\x12\x18\n" + + "\acommand\x18\x04 \x03(\tR\acommand\x12\x14\n" + + "\x05ports\x18\x05 \x03(\rR\x05ports\x12\x1b\n" + + "\tgpu_count\x18\x06 \x01(\rR\bgpuCount\x12\x10\n" + + "\x03env\x18\a \x03(\tR\x03env\"\xf2\x01\n" + + "\x1cLaunchRentalWorkloadResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12!\n" + + "\fcontainer_id\x18\x03 \x01(\tR\vcontainerId\x12\x17\n" + + "\astub_id\x18\x04 \x01(\tR\x06stubId\x12\x10\n" + + "\x03url\x18\x05 \x01(\tR\x03url\x12#\n" + + "\rshell_command\x18\x06 \x01(\tR\fshellCommand\x12\x1a\n" + + "\busername\x18\a \x01(\tR\busername\x12\x1a\n" + + "\bpassword\x18\b \x01(\tR\bpassword\"U\n" + + "\x1eListMarketplaceMachinesRequest\x12\x1d\n" + + "\n" + + "listing_id\x18\x01 \x01(\tR\tlistingId\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\"x\n" + + "\x1fListMarketplaceMachinesResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12,\n" + + "\bmachines\x18\x03 \x03(\v2\x10.gateway.MachineR\bmachines\"Z\n" + + "\x1cListMachineContainersRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\x12\x1d\n" + + "\n" + + "machine_id\x18\x02 \x01(\tR\tmachineId\"\xa4\x02\n" + + "\x10MachineContainer\x12!\n" + + "\fcontainer_id\x18\x01 \x01(\tR\vcontainerId\x12\x17\n" + + "\astub_id\x18\x02 \x01(\tR\x06stubId\x12\x16\n" + + "\x06status\x18\x03 \x01(\tR\x06status\x12!\n" + + "\fworkspace_id\x18\x04 \x01(\tR\vworkspaceId\x12\x10\n" + + "\x03gpu\x18\x05 \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\x06 \x01(\rR\bgpuCount\x12\x10\n" + + "\x03cpu\x18\a \x01(\x03R\x03cpu\x12\x16\n" + + "\x06memory\x18\b \x01(\x03R\x06memory\x12!\n" + + "\fscheduled_at\x18\t \x01(\x03R\vscheduledAt\x12\x1d\n" + + "\n" + + "started_at\x18\n" + + " \x01(\x03R\tstartedAt\"\x83\x01\n" + + "\x1dListMachineContainersResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x129\n" + + "\n" + + "containers\x18\x03 \x03(\v2\x19.gateway.MachineContainerR\n" + + "containers\"<\n" + + "\x11CreatePoolRequest\x12'\n" + + "\x04pool\x18\x01 \x01(\v2\x13.gateway.PoolConfigR\x04pool\"g\n" + + "\x12CreatePoolResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12(\n" + + "\x04pool\x18\x03 \x01(\v2\x14.gateway.PrivatePoolR\x04pool\"'\n" + + "\x11DeletePoolRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"=\n" + + "\x12DeletePoolResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"^\n" + + "\x19ExtendPoolCapacityRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x10\n" + + "\x03ttl\x18\x02 \x01(\tR\x03ttl\x12\x1b\n" + + "\tmax_spend\x18\x03 \x01(\x01R\bmaxSpend\"o\n" + + "\x1aExtendPoolCapacityResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12(\n" + + "\x04pool\x18\x03 \x01(\v2\x14.gateway.PrivatePoolR\x04pool\"K\n" + + "\x1aCreatePoolJoinTokenRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\x12\x10\n" + + "\x03ttl\x18\x02 \x01(\tR\x03ttl\"\x97\x01\n" + + "\x1bCreatePoolJoinTokenResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12\x14\n" + + "\x05token\x18\x03 \x01(\tR\x05token\x129\n" + + "\n" + + "expires_at\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\texpiresAt\"2\n" + + "\x1aRevokePoolJoinTokenRequest\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\"F\n" + + "\x1bRevokePoolJoinTokenResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"J\n" + + "\x19GetPoolJoinCommandRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\x12\x10\n" + + "\x03ttl\x18\x02 \x01(\tR\x03ttl\"\xb0\x01\n" + + "\x1aGetPoolJoinCommandResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12\x18\n" + + "\acommand\x18\x03 \x01(\tR\acommand\x12\x14\n" + + "\x05token\x18\x04 \x01(\tR\x05token\x129\n" + + "\n" + + "expires_at\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\texpiresAt\"L\n" + + "\x17ListPoolMachinesRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\"q\n" + + "\x18ListPoolMachinesResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12,\n" + + "\bmachines\x18\x03 \x03(\v2\x10.gateway.MachineR\bmachines\"\x94\x05\n" + + "\x14AgentBootstrapConfig\x12(\n" + + "\x10gateway_http_url\x18\x01 \x01(\tR\x0egatewayHttpUrl\x12*\n" + + "\x11gateway_grpc_host\x18\x02 \x01(\tR\x0fgatewayGrpcHost\x12*\n" + + "\x11gateway_grpc_port\x18\x03 \x01(\x05R\x0fgatewayGrpcPort\x12(\n" + + "\x10gateway_grpc_tls\x18\x04 \x01(\bR\x0egatewayGrpcTls\x12!\n" + + "\fworkspace_id\x18\x05 \x01(\tR\vworkspaceId\x12\x1b\n" + + "\tpool_name\x18\x06 \x01(\tR\bpoolName\x12\x1c\n" + + "\ttransport\x18\a \x01(\tR\ttransport\x12\x1a\n" + + "\bexecutor\x18\b \x01(\tR\bexecutor\x12\x1a\n" + + "\bfallback\x18\t \x01(\tR\bfallback\x12+\n" + + "\x11disabled_services\x18\n" + + " \x03(\tR\x10disabledServices\x120\n" + + "\x14image_registry_store\x18\v \x01(\tR\x12imageRegistryStore\x12,\n" + + "\x12image_clip_version\x18\f \x01(\rR\x10imageClipVersion\x129\n" + + "\x19image_local_cache_enabled\x18\r \x01(\bR\x16imageLocalCacheEnabled\x12;\n" + + "\ttelemetry\x18\x0e \x01(\v2\x1d.gateway.AgentTelemetryConfigR\ttelemetry\x125\n" + + "\abilling\x18\x0f \x01(\v2\x1b.gateway.AgentBillingConfigR\abilling\"\xe2\x01\n" + + "\x12AgentBillingConfig\x12%\n" + + "\x0eusage_endpoint\x18\x01 \x01(\tR\rusageEndpoint\x12\x1f\n" + + "\vusage_token\x18\x02 \x01(\tR\n" + + "usageToken\x12,\n" + + "\x12cost_hook_endpoint\x18\x03 \x01(\tR\x10costHookEndpoint\x12&\n" + + "\x0fcost_hook_token\x18\x04 \x01(\tR\rcostHookToken\x12.\n" + + "\x13billable_margin_pct\x18\x05 \x01(\x01R\x11billableMarginPct\"\xc7\x01\n" + + "\x14AgentTelemetryConfig\x12\x18\n" + + "\aenabled\x18\x01 \x01(\bR\aenabled\x12#\n" + + "\rstream_prefix\x18\x02 \x01(\tR\fstreamPrefix\x125\n" + + "\x04logs\x18\x03 \x01(\v2!.gateway.AgentTelemetrySinkConfigR\x04logs\x129\n" + + "\x06events\x18\x04 \x01(\v2!.gateway.AgentTelemetrySinkConfigR\x06events\"\x81\x01\n" + + "\x18AgentTelemetrySinkConfig\x12 \n" + + "\vdestination\x18\x01 \x01(\tR\vdestination\x12\x1e\n" + + "\n" + + "credential\x18\x02 \x01(\tR\n" + + "credential\x12#\n" + + "\rstream_prefix\x18\x03 \x01(\tR\fstreamPrefix\"\xdd\x04\n" + + "\x10JoinAgentRequest\x12\x1d\n" + + "\n" + + "join_token\x18\x01 \x01(\tR\tjoinToken\x12/\n" + + "\x13machine_fingerprint\x18\x02 \x01(\tR\x12machineFingerprint\x12\x1a\n" + + "\bhostname\x18\x03 \x01(\tR\bhostname\x12\x0e\n" + + "\x02os\x18\x04 \x01(\tR\x02os\x12\x12\n" + + "\x04arch\x18\x05 \x01(\tR\x04arch\x12\x1b\n" + + "\tcpu_count\x18\x06 \x01(\rR\bcpuCount\x12\x1b\n" + + "\tmemory_mb\x18\a \x01(\x04R\bmemoryMb\x12\x10\n" + + "\x03gpu\x18\b \x03(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\t \x01(\rR\bgpuCount\x12:\n" + + "\tpreflight\x18\n" + + " \x03(\v2\x1c.gateway.AgentPreflightCheckR\tpreflight\x12 \n" + + "\vschedulable\x18\v \x01(\bR\vschedulable\x12\x1a\n" + + "\bexecutor\x18\f \x01(\tR\bexecutor\x12%\n" + + "\x0ecpu_millicores\x18\r \x01(\x03R\rcpuMillicores\x12\x17\n" + + "\agpu_ids\x18\x0e \x03(\tR\x06gpuIds\x123\n" + + "\x16network_slot_pool_size\x18\x0f \x01(\rR\x13networkSlotPoolSize\x12>\n" + + "\x1bcontainer_start_concurrency\x18\x10 \x01(\rR\x19containerStartConcurrency\x12!\n" + + "\fworker_image\x18\x11 \x01(\tR\vworkerImage\"\xf9\x01\n" + + "\x11JoinAgentResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12!\n" + + "\fworkspace_id\x18\x03 \x01(\tR\vworkspaceId\x12\x1b\n" + + "\tpool_name\x18\x04 \x01(\tR\bpoolName\x12\x1d\n" + + "\n" + + "machine_id\x18\x05 \x01(\tR\tmachineId\x12\x1f\n" + + "\vagent_token\x18\x06 \x01(\tR\n" + + "agentToken\x12;\n" + + "\tbootstrap\x18\a \x01(\v2\x1d.gateway.AgentBootstrapConfigR\tbootstrap\"o\n" + + "\x13AgentPreflightCheck\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x0e\n" + + "\x02ok\x18\x02 \x01(\bR\x02ok\x12\x18\n" + + "\amessage\x18\x03 \x01(\tR\amessage\x12\x1a\n" + + "\bseverity\x18\x04 \x01(\tR\bseverity\"\xb9\x03\n" + + "\n" + + "AgentRoute\x12\x19\n" + + "\broute_id\x18\x01 \x01(\tR\arouteId\x12!\n" + + "\fworkspace_id\x18\x02 \x01(\tR\vworkspaceId\x12\x1b\n" + + "\tpool_name\x18\x03 \x01(\tR\bpoolName\x12\x1d\n" + + "\n" + + "machine_id\x18\x04 \x01(\tR\tmachineId\x12\x1b\n" + + "\tworker_id\x18\x05 \x01(\tR\bworkerId\x12!\n" + + "\fcontainer_id\x18\x06 \x01(\tR\vcontainerId\x12\x12\n" + + "\x04kind\x18\a \x01(\tR\x04kind\x12\x12\n" + + "\x04port\x18\b \x01(\x05R\x04port\x12\x1a\n" + + "\bprotocol\x18\t \x01(\tR\bprotocol\x12\x1c\n" + + "\ttransport\x18\n" + + " \x01(\tR\ttransport\x12!\n" + + "\flocal_target\x18\v \x01(\tR\vlocalTarget\x12!\n" + + "\fproxy_target\x18\f \x01(\tR\vproxyTarget\x12\x14\n" + + "\x05state\x18\r \x01(\tR\x05state\x12\x14\n" + + "\x05error\x18\x0e \x01(\tR\x05error\x12\x1d\n" + + "\n" + + "updated_at\x18\x0f \x01(\x03R\tupdatedAt\"g\n" + + "&RequestAgentTransportCredentialRequest\x12\x1f\n" + + "\vagent_token\x18\x01 \x01(\tR\n" + + "agentToken\x12\x1c\n" + + "\ttransport\x18\x02 \x01(\tR\ttransport\"\xc8\x01\n" + + "'RequestAgentTransportCredentialResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12\x19\n" + + "\bauth_key\x18\x03 \x01(\tR\aauthKey\x12\x1f\n" + + "\vcontrol_url\x18\x04 \x01(\tR\n" + + "controlUrl\x12\x1a\n" + + "\bhostname\x18\x05 \x01(\tR\bhostname\x12\x1c\n" + + "\tephemeral\x18\x06 \x01(\bR\tephemeral\">\n" + + "\x1bCreateNodeEnrollmentRequest\x12\x1f\n" + + "\vagent_token\x18\x01 \x01(\tR\n" + + "agentToken\"v\n" + + "\x1cCreateNodeEnrollmentResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x1b\n" + + "\terror_msg\x18\x02 \x01(\tR\berrorMsg\x12)\n" + + "\x10enrollment_token\x18\x03 \x01(\tR\x0fenrollmentToken\">\n" + + "\x1bDeleteNodeEnrollmentRequest\x12\x1f\n" + + "\vagent_token\x18\x01 \x01(\tR\n" + + "agentToken\"K\n" + + "\x1cDeleteNodeEnrollmentResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x1b\n" + + "\terror_msg\x18\x02 \x01(\tR\berrorMsg\"9\n" + + "\x16ListAgentRoutesRequest\x12\x1f\n" + + "\vagent_token\x18\x01 \x01(\tR\n" + + "agentToken\"o\n" + + "\x17ListAgentRoutesResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12+\n" + + "\x06routes\x18\x03 \x03(\v2\x13.gateway.AgentRouteR\x06routes\"\xad\x02\n" + + "\x1dUpdateAgentRouteStatusRequest\x12\x1f\n" + + "\vagent_token\x18\x01 \x01(\tR\n" + + "agentToken\x12\x19\n" + + "\broute_id\x18\x02 \x01(\tR\arouteId\x12\x14\n" + + "\x05state\x18\x03 \x01(\tR\x05state\x12!\n" + + "\fproxy_target\x18\x04 \x01(\tR\vproxyTarget\x12\x14\n" + + "\x05error\x18\x05 \x01(\tR\x05error\x12G\n" + + "\x05attrs\x18\x06 \x03(\v21.gateway.UpdateAgentRouteStatusRequest.AttrsEntryR\x05attrs\x1a8\n" + + "\n" + + "AttrsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"I\n" + + "\x1eUpdateAgentRouteStatusResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"\xd4\a\n" + + "\x0fAgentWorkerSlot\x12\x1b\n" + + "\tworker_id\x18\x01 \x01(\tR\bworkerId\x12!\n" + + "\fworker_token\x18\x02 \x01(\tR\vworkerToken\x12\x1b\n" + + "\tpool_name\x18\x03 \x01(\tR\bpoolName\x12\x1d\n" + + "\n" + + "machine_id\x18\x04 \x01(\tR\tmachineId\x12\x10\n" + + "\x03cpu\x18\x05 \x01(\x03R\x03cpu\x12\x16\n" + + "\x06memory\x18\x06 \x01(\x03R\x06memory\x12\x10\n" + + "\x03gpu\x18\a \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\b \x01(\rR\bgpuCount\x12%\n" + + "\x0egpu_assignment\x18\t \x01(\tR\rgpuAssignment\x12%\n" + + "\x0enetwork_prefix\x18\n" + + " \x01(\tR\rnetworkPrefix\x12!\n" + + "\fworker_image\x18\v \x01(\tR\vworkerImage\x123\n" + + "\x16network_slot_pool_size\x18\f \x01(\rR\x13networkSlotPoolSize\x12>\n" + + "\x1bcontainer_start_concurrency\x18\r \x01(\rR\x19containerStartConcurrency\x12\x12\n" + + "\x04mode\x18\x0e \x01(\tR\x04mode\x12+\n" + + "\x11container_runtime\x18\x0f \x01(\tR\x10containerRuntime\x124\n" + + "\x16marketplace_listing_id\x18\x10 \x01(\tR\x14marketplaceListingId\x12.\n" + + "\x13seller_workspace_id\x18\x11 \x01(\tR\x11sellerWorkspaceId\x124\n" + + "\x16requires_pool_selector\x18\x12 \x01(\bR\x14requiresPoolSelector\x12\x1a\n" + + "\bpriority\x18\x13 \x01(\x05R\bpriority\x12 \n" + + "\vpreemptable\x18\x14 \x01(\bR\vpreemptable\x12!\n" + + "\fpriority_set\x18\x15 \x01(\bR\vprioritySet\x12'\n" + + "\x0fgvisor_platform\x18\x16 \x01(\tR\x0egvisorPlatform\x12\x1f\n" + + "\vgvisor_root\x18\x17 \x01(\tR\n" + + "gvisorRoot\x12*\n" + + "\x11gvisor_extra_args\x18\x18 \x03(\tR\x0fgvisorExtraArgs\x12\x1e\n" + + "\n" + + "generation\x18\x19 \x01(\tR\n" + + "generation\x122\n" + + "\x15cpu_affinity_enforced\x18\x1a \x01(\bR\x13cpuAffinityEnforced\"5\n" + + "\x12StreamAgentRequest\x12\x1f\n" + + "\vagent_token\x18\x01 \x01(\tR\n" + + "agentToken\"\x9b\x01\n" + + "\x13StreamAgentResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12+\n" + + "\x06routes\x18\x03 \x03(\v2\x13.gateway.AgentRouteR\x06routes\x12.\n" + + "\x05slots\x18\x04 \x03(\v2\x18.gateway.AgentWorkerSlotR\x05slots\"\xb7\x01\n" + + "\x0eAgentLogRecord\x12\x16\n" + + "\x06source\x18\x01 \x01(\tR\x06source\x12\x1b\n" + + "\tworker_id\x18\x02 \x01(\tR\bworkerId\x12\x14\n" + + "\x05level\x18\x03 \x01(\tR\x05level\x12\x16\n" + + "\x06stream\x18\x04 \x01(\tR\x06stream\x12\x12\n" + + "\x04line\x18\x05 \x01(\tR\x04line\x12.\n" + + "\x13timestamp_unix_nano\x18\x06 \x01(\x03R\x11timestampUnixNano\"\xb4\x04\n" + + "\x13AgentMetricSnapshot\x12.\n" + + "\x13timestamp_unix_nano\x18\x01 \x01(\x03R\x11timestampUnixNano\x12.\n" + + "\x13cpu_utilization_pct\x18\x02 \x01(\x02R\x11cpuUtilizationPct\x12$\n" + + "\x0ememory_used_mb\x18\x03 \x01(\x04R\fmemoryUsedMb\x12&\n" + + "\x0fmemory_total_mb\x18\x04 \x01(\x04R\rmemoryTotalMb\x124\n" + + "\x16memory_utilization_pct\x18\x05 \x01(\x02R\x14memoryUtilizationPct\x12 \n" + + "\fdisk_used_mb\x18\x06 \x01(\x04R\n" + + "diskUsedMb\x12\"\n" + + "\rdisk_total_mb\x18\a \x01(\x04R\vdiskTotalMb\x12$\n" + + "\x0edisk_usage_pct\x18\b \x01(\x02R\fdiskUsagePct\x12\x1b\n" + + "\tdisk_path\x18\t \x01(\tR\bdiskPath\x12!\n" + + "\fworker_count\x18\n" + + " \x01(\rR\vworkerCount\x12'\n" + + "\x0fcontainer_count\x18\v \x01(\rR\x0econtainerCount\x12$\n" + + "\x0efree_gpu_count\x18\f \x01(\rR\ffreeGpuCount\x12>\n" + + "\fpath_metrics\x18\r \x03(\v2\x1b.gateway.MachinePathMetricsR\vpathMetrics\"\xa1\x02\n" + + "\x10AgentEventRecord\x12\x16\n" + + "\x06action\x18\x01 \x01(\tR\x06action\x12\x16\n" + + "\x06status\x18\x02 \x01(\tR\x06status\x12\x18\n" + + "\amessage\x18\x03 \x01(\tR\amessage\x12:\n" + + "\x05attrs\x18\x04 \x03(\v2$.gateway.AgentEventRecord.AttrsEntryR\x05attrs\x12.\n" + + "\x13timestamp_unix_nano\x18\x05 \x01(\x03R\x11timestampUnixNano\x12\x1d\n" + + "\n" + + "event_type\x18\x06 \x01(\tR\teventType\x1a8\n" + + "\n" + + "AttrsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xd0\x01\n" + + "\x15AgentTelemetryRequest\x12\x1f\n" + + "\vagent_token\x18\x01 \x01(\tR\n" + + "agentToken\x12+\n" + + "\x04logs\x18\x02 \x03(\v2\x17.gateway.AgentLogRecordR\x04logs\x126\n" + + "\ametrics\x18\x03 \x01(\v2\x1c.gateway.AgentMetricSnapshotR\ametrics\x121\n" + + "\x06events\x18\x04 \x03(\v2\x19.gateway.AgentEventRecordR\x06events\"A\n" + + "\x16AgentTelemetryResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"\x8c\x04\n" + + "\aMachine\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x10\n" + + "\x03cpu\x18\x02 \x01(\x03R\x03cpu\x12\x16\n" + + "\x06memory\x18\x03 \x01(\x03R\x06memory\x12\x10\n" + + "\x03gpu\x18\x04 \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\x05 \x01(\rR\bgpuCount\x12\x16\n" + + "\x06status\x18\x06 \x01(\tR\x06status\x12\x1b\n" + + "\tpool_name\x18\a \x01(\tR\bpoolName\x12#\n" + + "\rprovider_name\x18\b \x01(\tR\fproviderName\x12-\n" + + "\x12registration_token\x18\t \x01(\tR\x11registrationToken\x12#\n" + + "\rtailscale_url\x18\n" + + " \x01(\tR\ftailscaleUrl\x12%\n" + + "\x0etailscale_auth\x18\v \x01(\tR\rtailscaleAuth\x12%\n" + + "\x0elast_keepalive\x18\f \x01(\tR\rlastKeepalive\x12\x18\n" + + "\acreated\x18\r \x01(\tR\acreated\x12#\n" + + "\ragent_version\x18\x0e \x01(\tR\fagentVersion\x12@\n" + + "\x0fmachine_metrics\x18\x0f \x01(\v2\x17.gateway.MachineMetricsR\x0emachineMetrics\x12\x1b\n" + + "\tuser_data\x18\x10 \x01(\tR\buserData\"\xed\x05\n" + + "\x0eMachineMetrics\x12.\n" + + "\x13total_cpu_available\x18\x01 \x01(\x05R\x11totalCpuAvailable\x124\n" + + "\x16total_memory_available\x18\x02 \x01(\x05R\x14totalMemoryAvailable\x12.\n" + + "\x13cpu_utilization_pct\x18\x03 \x01(\x02R\x11cpuUtilizationPct\x124\n" + + "\x16memory_utilization_pct\x18\x04 \x01(\x02R\x14memoryUtilizationPct\x12!\n" + + "\fworker_count\x18\x05 \x01(\x05R\vworkerCount\x12'\n" + + "\x0fcontainer_count\x18\x06 \x01(\x05R\x0econtainerCount\x12$\n" + + "\x0efree_gpu_count\x18\a \x01(\x05R\ffreeGpuCount\x12&\n" + + "\x0fcache_usage_pct\x18\b \x01(\x02R\rcacheUsagePct\x12%\n" + + "\x0ecache_capacity\x18\t \x01(\x05R\rcacheCapacity\x12,\n" + + "\x12cache_memory_usage\x18\n" + + " \x01(\x05R\x10cacheMemoryUsage\x12&\n" + + "\x0fcache_cpu_usage\x18\v \x01(\x02R\rcacheCpuUsage\x12$\n" + + "\x0ememory_used_mb\x18\f \x01(\x03R\fmemoryUsedMb\x12&\n" + + "\x0fmemory_total_mb\x18\r \x01(\x03R\rmemoryTotalMb\x12 \n" + + "\fdisk_used_mb\x18\x0e \x01(\x03R\n" + + "diskUsedMb\x12\"\n" + + "\rdisk_total_mb\x18\x0f \x01(\x03R\vdiskTotalMb\x12$\n" + + "\x0edisk_usage_pct\x18\x10 \x01(\x02R\fdiskUsagePct\x12>\n" + + "\fpath_metrics\x18\x11 \x03(\v2\x1b.gateway.MachinePathMetricsR\vpathMetrics\"\xb2\x01\n" + + "\x12MachinePathMetrics\x12\x14\n" + + "\x05label\x18\x01 \x01(\tR\x05label\x12\x12\n" + + "\x04path\x18\x02 \x01(\tR\x04path\x12\x17\n" + + "\aused_mb\x18\x03 \x01(\x04R\x06usedMb\x12\x19\n" + + "\btotal_mb\x18\x04 \x01(\x04R\atotalMb\x12!\n" + + "\favailable_mb\x18\x05 \x01(\x04R\vavailableMb\x12\x1b\n" + + "\tusage_pct\x18\x06 \x01(\x02R\busagePct\"H\n" + + "\x13ListMachinesRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\"\xfe\x02\n" + + "\x14ListMachinesResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12,\n" + + "\bmachines\x18\x03 \x03(\v2\x10.gateway.MachineR\bmachines\x12;\n" + + "\x04gpus\x18\x04 \x03(\v2'.gateway.ListMachinesResponse.GpusEntryR\x04gpus\x12W\n" + + "\x0esupported_gpus\x18\x05 \x03(\v20.gateway.ListMachinesResponse.SupportedGpusEntryR\rsupportedGpus\x1a7\n" + + "\tGpusEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\bR\x05value:\x028\x01\x1a@\n" + + "\x12SupportedGpusEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\bR\x05value:\x028\x01\"3\n" + + "\x14CreateMachineRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\"\xa9\x02\n" + + "\x15CreateMachineResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12*\n" + + "\amachine\x18\x03 \x01(\v2\x10.gateway.MachineR\amachine\x12,\n" + + "\x12agent_upstream_url\x18\x04 \x01(\tR\x10agentUpstreamUrl\x122\n" + + "\x15agent_upstream_branch\x18\x05 \x01(\tR\x13agentUpstreamBranch\x120\n" + + "\x14agent_upstream_token\x18\x06 \x01(\tR\x12agentUpstreamToken\x12'\n" + + "\x0finstall_command\x18\a \x01(\tR\x0einstallCommand\"R\n" + + "\x14DeleteMachineRequest\x12\x1d\n" + + "\n" + + "machine_id\x18\x01 \x01(\tR\tmachineId\x12\x1b\n" + + "\tpool_name\x18\x02 \x01(\tR\bpoolName\"@\n" + + "\x15DeleteMachineResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"\xb6\x02\n" + + "\x05Token\x12\x19\n" + + "\btoken_id\x18\x01 \x01(\tR\atokenId\x12\x10\n" + + "\x03key\x18\x02 \x01(\tR\x03key\x12\x16\n" + + "\x06active\x18\x03 \x01(\bR\x06active\x12\x1a\n" + + "\breusable\x18\x04 \x01(\bR\breusable\x12&\n" + + "\fworkspace_id\x18\x05 \x01(\rH\x00R\vworkspaceId\x88\x01\x01\x12\x1d\n" + + "\n" + + "token_type\x18\x06 \x01(\tR\ttokenType\x129\n" + + "\n" + + "created_at\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x129\n" + + "\n" + + "updated_at\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\tupdatedAtB\x0f\n" + + "\r_workspace_id\"\x13\n" + + "\x11ListTokensRequest\"e\n" + + "\x12ListTokensResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12&\n" + + "\x06tokens\x18\x03 \x03(\v2\x0e.gateway.TokenR\x06tokens\"3\n" + + "\x12CreateTokenRequest\x12\x1d\n" + + "\n" + + "token_type\x18\x01 \x01(\tR\ttokenType\"d\n" + + "\x13CreateTokenResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12$\n" + + "\x05token\x18\x03 \x01(\v2\x0e.gateway.TokenR\x05token\"/\n" + + "\x12ToggleTokenRequest\x12\x19\n" + + "\btoken_id\x18\x01 \x01(\tR\atokenId\"d\n" + + "\x13ToggleTokenResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12$\n" + + "\x05token\x18\x03 \x01(\v2\x0e.gateway.TokenR\x05token\"/\n" + + "\x12DeleteTokenRequest\x12\x19\n" + + "\btoken_id\x18\x01 \x01(\tR\atokenId\">\n" + + "\x13DeleteTokenResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"\x83\x01\n" + + "\rGetURLRequest\x12\x17\n" + + "\astub_id\x18\x01 \x01(\tR\x06stubId\x12#\n" + + "\rdeployment_id\x18\x02 \x01(\tR\fdeploymentId\x12\x19\n" + + "\burl_type\x18\x03 \x01(\tR\aurlType\x12\x19\n" + + "\bis_shell\x18\x04 \x01(\bR\aisShell\"K\n" + + "\x0eGetURLResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12\x10\n" + + "\x03url\x18\x03 \x01(\tR\x03url\"\x14\n" + + "\x12ListWorkersRequest\"g\n" + + "\x13ListWorkersResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12'\n" + + "\aworkers\x18\x03 \x03(\v2\r.types.WorkerR\aworkers\"2\n" + + "\x13CordonWorkerRequest\x12\x1b\n" + + "\tworker_id\x18\x01 \x01(\tR\bworkerId\"?\n" + + "\x14CordonWorkerResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"4\n" + + "\x15UncordonWorkerRequest\x12\x1b\n" + + "\tworker_id\x18\x01 \x01(\tR\bworkerId\"A\n" + + "\x16UncordonWorkerResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"1\n" + + "\x12DrainWorkerRequest\x12\x1b\n" + + "\tworker_id\x18\x01 \x01(\tR\bworkerId\">\n" + + "\x13DrainWorkerResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"\x1e\n" + + "\x1cExportWorkspaceConfigRequest\"\xc6\x02\n" + + "\x1dExportWorkspaceConfigResponse\x12*\n" + + "\x11gateway_http_host\x18\x01 \x01(\tR\x0fgatewayHttpHost\x12*\n" + + "\x11gateway_http_port\x18\x02 \x01(\x05R\x0fgatewayHttpPort\x12(\n" + + "\x10gateway_http_tls\x18\x03 \x01(\bR\x0egatewayHttpTls\x12*\n" + + "\x11gateway_grpc_host\x18\x04 \x01(\tR\x0fgatewayGrpcHost\x12*\n" + + "\x11gateway_grpc_port\x18\x05 \x01(\x05R\x0fgatewayGrpcPort\x12(\n" + + "\x10gateway_grpc_tls\x18\x06 \x01(\bR\x0egatewayGrpcTls\x12!\n" + + "\fworkspace_id\x18\a \x01(\tR\vworkspaceId\"\xae\x01\n" + + "\x1eUpdateAgentAvailabilityRequest\x12\x1f\n" + + "\vagent_token\x18\x01 \x01(\tR\n" + + "agentToken\x12 \n" + + "\vschedulable\x18\x02 \x01(\bR\vschedulable\x12\x16\n" + + "\x06reason\x18\x03 \x01(\tR\x06reason\x121\n" + + "\x15observed_at_unix_nano\x18\x04 \x01(\x03R\x12observedAtUnixNano\"J\n" + + "\x1fUpdateAgentAvailabilityResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg*C\n" + + "\x1fSyncContainerWorkspaceOperation\x12\t\n" + + "\x05WRITE\x10\x00\x12\n" + + "\n" + + "\x06DELETE\x10\x01\x12\t\n" + + "\x05MOVED\x10\x022\xdf>\n" + + "\x0eGatewayService\x12[\n" + + "\tAuthorize\x12\x19.gateway.AuthorizeRequest\x1a\x1a.gateway.AuthorizeResponse\"\x17\x82\xd3\xe4\x93\x02\x11\"\x0f/auth/authorize\x12_\n" + + "\vSignPayload\x12\x1b.gateway.SignPayloadRequest\x1a\x1c.gateway.SignPayloadResponse\"\x15\x82\xd3\xe4\x93\x02\x0f:\x01*\"\n" + + "/auth/sign\x12^\n" + + "\n" + + "HeadObject\x12\x1a.gateway.HeadObjectRequest\x1a\x1b.gateway.HeadObjectResponse\"\x17\x82\xd3\xe4\x93\x02\x11\x12\x0f/objects/{hash}\x12`\n" + + "\fCreateObject\x12\x1c.gateway.CreateObjectRequest\x1a\x1d.gateway.CreateObjectResponse\"\x13\x82\xd3\xe4\x93\x02\r:\x01*\"\b/objects\x12L\n" + + "\x0fPutObjectStream\x12\x19.gateway.PutObjectRequest\x1a\x1a.gateway.PutObjectResponse\"\x00(\x01\x12b\n" + + "\x13CheckpointContainer\x12#.gateway.CheckpointContainerRequest\x1a$.gateway.CheckpointContainerResponse\"\x00\x12f\n" + + "\x0eListContainers\x12\x1e.gateway.ListContainersRequest\x1a\x1f.gateway.ListContainersResponse\"\x13\x82\xd3\xe4\x93\x02\r\x12\v/containers\x12w\n" + + "\rStopContainer\x12\x1d.gateway.StopContainerRequest\x1a\x1e.gateway.StopContainerResponse\"'\x82\xd3\xe4\x93\x02!\"\x1f/containers/{container_id}/stop\x12^\n" + + "\x11AttachToContainer\x12\x1f.gateway.ContainerStreamMessage\x1a\".gateway.AttachToContainerResponse\"\x00(\x010\x01\x12[\n" + + "\tStartTask\x12\x19.gateway.StartTaskRequest\x1a\x1a.gateway.StartTaskResponse\"\x17\x82\xd3\xe4\x93\x02\x11:\x01*\"\f/tasks/start\x12S\n" + + "\aEndTask\x12\x17.gateway.EndTaskRequest\x1a\x18.gateway.EndTaskResponse\"\x15\x82\xd3\xe4\x93\x02\x0f:\x01*\"\n" + + "/tasks/end\x12Z\n" + + "\tStopTasks\x12\x19.gateway.StopTasksRequest\x1a\x1a.gateway.StopTasksResponse\"\x16\x82\xd3\xe4\x93\x02\x10:\x01*\"\v/tasks/stop\x12R\n" + + "\tListTasks\x12\x19.gateway.ListTasksRequest\x1a\x1a.gateway.ListTasksResponse\"\x0e\x82\xd3\xe4\x93\x02\b\x12\x06/tasks\x12g\n" + + "\x0fGetOrCreateStub\x12\x1f.gateway.GetOrCreateStubRequest\x1a .gateway.GetOrCreateStubResponse\"\x11\x82\xd3\xe4\x93\x02\v:\x01*\"\x06/stubs\x12_\n" + + "\n" + + "DeployStub\x12\x1a.gateway.DeployStubRequest\x1a\x1b.gateway.DeployStubResponse\"\x18\x82\xd3\xe4\x93\x02\x12:\x01*\"\r/stubs/deploy\x12W\n" + + "\x06GetURL\x12\x16.gateway.GetURLRequest\x1a\x17.gateway.GetURLResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\x12\x14/stubs/{stub_id}/url\x12j\n" + + "\x0fListDeployments\x12\x1f.gateway.ListDeploymentsRequest\x1a .gateway.ListDeploymentsResponse\"\x14\x82\xd3\xe4\x93\x02\x0e\x12\f/deployments\x12q\n" + + "\x0eStopDeployment\x12\x1e.gateway.StopDeploymentRequest\x1a\x1f.gateway.StopDeploymentResponse\"\x1e\x82\xd3\xe4\x93\x02\x18\"\x16/deployments/{id}/stop\x12u\n" + + "\x0fStartDeployment\x12\x1f.gateway.StartDeploymentRequest\x1a .gateway.StartDeploymentResponse\"\x1f\x82\xd3\xe4\x93\x02\x19\"\x17/deployments/{id}/start\x12x\n" + + "\x0fScaleDeployment\x12\x1f.gateway.ScaleDeploymentRequest\x1a .gateway.ScaleDeploymentResponse\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/deployments/{id}/scale\x12r\n" + + "\x10DeleteDeployment\x12 .gateway.DeleteDeploymentRequest\x1a!.gateway.DeleteDeploymentResponse\"\x19\x82\xd3\xe4\x93\x02\x13*\x11/deployments/{id}\x12R\n" + + "\tListPools\x12\x19.gateway.ListPoolsRequest\x1a\x1a.gateway.ListPoolsResponse\"\x0e\x82\xd3\xe4\x93\x02\b\x12\x06/pools\x12k\n" + + "\x0eListPoolOffers\x12\x1e.gateway.ListPoolOffersRequest\x1a\x1f.gateway.ListPoolOffersResponse\"\x18\x82\xd3\xe4\x93\x02\x12:\x01*\"\r/pools:offers\x12w\n" + + "\x12LaunchPoolCapacity\x12\".gateway.LaunchPoolCapacityRequest\x1a#.gateway.LaunchPoolCapacityResponse\"\x18\x82\xd3\xe4\x93\x02\x12:\x01*\"\r/pools:launch\x12o\n" + + "\x10ListPrivatePools\x12 .gateway.ListPrivatePoolsRequest\x1a!.gateway.ListPrivatePoolsResponse\"\x16\x82\xd3\xe4\x93\x02\x10\x12\x0e/pools/private\x12i\n" + + "\x0eCreateBYOCPool\x12\x1e.gateway.CreateBYOCPoolRequest\x1a\x1f.gateway.CreateBYOCPoolResponse\"\x16\x82\xd3\xe4\x93\x02\x10:\x01*\"\v/pools/byoc\x12i\n" + + "\vGetBYOCPool\x12\x1b.gateway.GetBYOCPoolRequest\x1a\x1c.gateway.GetBYOCPoolResponse\"\x1f\x82\xd3\xe4\x93\x02\x19\x12\x17/pools/{pool_name}/byoc\x12x\n" + + "\rScaleBYOCPool\x12\x1d.gateway.ScaleBYOCPoolRequest\x1a\x1e.gateway.ScaleBYOCPoolResponse\"(\x82\xd3\xe4\x93\x02\":\x01*\"\x1d/pools/{pool_name}/byoc/scale\x12\x91\x01\n" + + "\x18CreateMarketplaceListing\x12(.gateway.CreateMarketplaceListingRequest\x1a).gateway.CreateMarketplaceListingResponse\" \x82\xd3\xe4\x93\x02\x1a:\x01*\"\x15/marketplace/listings\x12\x9e\x01\n" + + "\x18UpdateMarketplaceListing\x12(.gateway.UpdateMarketplaceListingRequest\x1a).gateway.UpdateMarketplaceListingResponse\"-\x82\xd3\xe4\x93\x02':\x01*\"\"/marketplace/listings/{listing_id}\x12\x9b\x01\n" + + "\x18DeleteMarketplaceListing\x12(.gateway.DeleteMarketplaceListingRequest\x1a).gateway.DeleteMarketplaceListingResponse\"*\x82\xd3\xe4\x93\x02$*\"/marketplace/listings/{listing_id}\x12\x8b\x01\n" + + "\x17ListMarketplaceListings\x12'.gateway.ListMarketplaceListingsRequest\x1a(.gateway.ListMarketplaceListingsResponse\"\x1d\x82\xd3\xe4\x93\x02\x17\x12\x15/marketplace/listings\x12\xae\x01\n" + + "\x19GetMarketplaceJoinCommand\x12).gateway.GetMarketplaceJoinCommandRequest\x1a*.gateway.GetMarketplaceJoinCommandResponse\":\x82\xd3\xe4\x93\x024:\x01*\"//marketplace/listings/{listing_id}/join-command\x12\x83\x01\n" + + "\x15ListMarketplaceOffers\x12%.gateway.ListMarketplaceOffersRequest\x1a&.gateway.ListMarketplaceOffersResponse\"\x1b\x82\xd3\xe4\x93\x02\x15\x12\x13/marketplace/offers\x12\x8a\x01\n" + + "\x13GetMarketplaceOffer\x12#.gateway.GetMarketplaceOfferRequest\x1a$.gateway.GetMarketplaceOfferResponse\"(\x82\xd3\xe4\x93\x02\"\x12 /marketplace/offers/{listing_id}\x12\x8d\x01\n" + + "\x17CreateMarketplaceRental\x12'.gateway.CreateMarketplaceRentalRequest\x1a(.gateway.CreateMarketplaceRentalResponse\"\x1f\x82\xd3\xe4\x93\x02\x19:\x01*\"\x14/marketplace/rentals\x12\x87\x01\n" + + "\x16ListMarketplaceRentals\x12&.gateway.ListMarketplaceRentalsRequest\x1a'.gateway.ListMarketplaceRentalsResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\x12\x14/marketplace/rentals\x12\x96\x01\n" + + "\x17DeleteMarketplaceRental\x12'.gateway.DeleteMarketplaceRentalRequest\x1a(.gateway.DeleteMarketplaceRentalResponse\"(\x82\xd3\xe4\x93\x02\"* /marketplace/rentals/{rental_id}\x12\x97\x01\n" + + "\x14LaunchRentalWorkload\x12$.gateway.LaunchRentalWorkloadRequest\x1a%.gateway.LaunchRentalWorkloadResponse\"2\x82\xd3\xe4\x93\x02,:\x01*\"'/marketplace/rentals/{rental_id}/launch\x12\xa1\x01\n" + + "\x17ListMarketplaceMachines\x12'.gateway.ListMarketplaceMachinesRequest\x1a(.gateway.ListMarketplaceMachinesResponse\"3\x82\xd3\xe4\x93\x02-\x12+/marketplace/listings/{listing_id}/machines\x12\xa3\x01\n" + + "\x15ListMachineContainers\x12%.gateway.ListMachineContainersRequest\x1a&.gateway.ListMachineContainersResponse\";\x82\xd3\xe4\x93\x025\x123/pools/{pool_name}/machines/{machine_id}/containers\x12X\n" + + "\n" + + "CreatePool\x12\x1a.gateway.CreatePoolRequest\x1a\x1b.gateway.CreatePoolResponse\"\x11\x82\xd3\xe4\x93\x02\v:\x01*\"\x06/pools\x12\\\n" + + "\n" + + "DeletePool\x12\x1a.gateway.DeletePoolRequest\x1a\x1b.gateway.DeletePoolResponse\"\x15\x82\xd3\xe4\x93\x02\x0f*\r/pools/{name}\x12~\n" + + "\x12ExtendPoolCapacity\x12\".gateway.ExtendPoolCapacityRequest\x1a#.gateway.ExtendPoolCapacityResponse\"\x1f\x82\xd3\xe4\x93\x02\x19:\x01*\"\x14/pools/{name}/extend\x12\x8b\x01\n" + + "\x13CreatePoolJoinToken\x12#.gateway.CreatePoolJoinTokenRequest\x1a$.gateway.CreatePoolJoinTokenResponse\")\x82\xd3\xe4\x93\x02#:\x01*\"\x1e/pools/{pool_name}/join-tokens\x12\x86\x01\n" + + "\x13RevokePoolJoinToken\x12#.gateway.RevokePoolJoinTokenRequest\x1a$.gateway.RevokePoolJoinTokenResponse\"$\x82\xd3\xe4\x93\x02\x1e:\x01*\"\x19/pools/join-tokens/revoke\x12\x89\x01\n" + + "\x12GetPoolJoinCommand\x12\".gateway.GetPoolJoinCommandRequest\x1a#.gateway.GetPoolJoinCommandResponse\"*\x82\xd3\xe4\x93\x02$:\x01*\"\x1f/pools/{pool_name}/join-command\x12|\n" + + "\x10ListPoolMachines\x12 .gateway.ListPoolMachinesRequest\x1a!.gateway.ListPoolMachinesResponse\"#\x82\xd3\xe4\x93\x02\x1d\x12\x1b/pools/{pool_name}/machines\x12Z\n" + + "\tJoinAgent\x12\x19.gateway.JoinAgentRequest\x1a\x1a.gateway.JoinAgentResponse\"\x16\x82\xd3\xe4\x93\x02\x10:\x01*\"\v/agent/join\x12\xac\x01\n" + + "\x1fRequestAgentTransportCredential\x12/.gateway.RequestAgentTransportCredentialRequest\x1a0.gateway.RequestAgentTransportCredentialResponse\"&\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/agent/transport-credential\x12c\n" + + "\x14CreateNodeEnrollment\x12$.gateway.CreateNodeEnrollmentRequest\x1a%.gateway.CreateNodeEnrollmentResponse\x12c\n" + + "\x14DeleteNodeEnrollment\x12$.gateway.DeleteNodeEnrollmentRequest\x1a%.gateway.DeleteNodeEnrollmentResponse\x12s\n" + + "\x0fListAgentRoutes\x12\x1f.gateway.ListAgentRoutesRequest\x1a .gateway.ListAgentRoutesResponse\"\x1d\x82\xd3\xe4\x93\x02\x17:\x01*\"\x12/agent/routes:list\x12\x8a\x01\n" + + "\x16UpdateAgentRouteStatus\x12&.gateway.UpdateAgentRouteStatusRequest\x1a'.gateway.UpdateAgentRouteStatusResponse\"\x1f\x82\xd3\xe4\x93\x02\x19:\x01*\"\x14/agent/routes/status\x12\x8c\x01\n" + + "\x17UpdateAgentAvailability\x12'.gateway.UpdateAgentAvailabilityRequest\x1a(.gateway.UpdateAgentAvailabilityResponse\"\x1e\x82\xd3\xe4\x93\x02\x18:\x01*\"\x13/agent/availability\x12J\n" + + "\vStreamAgent\x12\x1b.gateway.StreamAgentRequest\x1a\x1c.gateway.StreamAgentResponse0\x01\x12Y\n" + + "\x14StreamAgentTelemetry\x12\x1e.gateway.AgentTelemetryRequest\x1a\x1f.gateway.AgentTelemetryResponse(\x01\x12^\n" + + "\fListMachines\x12\x1c.gateway.ListMachinesRequest\x1a\x1d.gateway.ListMachinesResponse\"\x11\x82\xd3\xe4\x93\x02\v\x12\t/machines\x12d\n" + + "\rCreateMachine\x12\x1d.gateway.CreateMachineRequest\x1a\x1e.gateway.CreateMachineResponse\"\x14\x82\xd3\xe4\x93\x02\x0e:\x01*\"\t/machines\x12n\n" + + "\rDeleteMachine\x12\x1d.gateway.DeleteMachineRequest\x1a\x1e.gateway.DeleteMachineResponse\"\x1e\x82\xd3\xe4\x93\x02\x18*\x16/machines/{machine_id}\x12V\n" + + "\n" + + "ListTokens\x12\x1a.gateway.ListTokensRequest\x1a\x1b.gateway.ListTokensResponse\"\x0f\x82\xd3\xe4\x93\x02\t\x12\a/tokens\x12Y\n" + + "\vCreateToken\x12\x1b.gateway.CreateTokenRequest\x1a\x1c.gateway.CreateTokenResponse\"\x0f\x82\xd3\xe4\x93\x02\t\"\a/tokens\x12k\n" + + "\vToggleToken\x12\x1b.gateway.ToggleTokenRequest\x1a\x1c.gateway.ToggleTokenResponse\"!\x82\xd3\xe4\x93\x02\x1b\"\x19/tokens/{token_id}/toggle\x12d\n" + + "\vDeleteToken\x12\x1b.gateway.DeleteTokenRequest\x1a\x1c.gateway.DeleteTokenResponse\"\x1a\x82\xd3\xe4\x93\x02\x14*\x12/tokens/{token_id}\x12Z\n" + + "\vListWorkers\x12\x1b.gateway.ListWorkersRequest\x1a\x1c.gateway.ListWorkersResponse\"\x10\x82\xd3\xe4\x93\x02\n" + + "\x12\b/workers\x12p\n" + + "\fCordonWorker\x12\x1c.gateway.CordonWorkerRequest\x1a\x1d.gateway.CordonWorkerResponse\"#\x82\xd3\xe4\x93\x02\x1d\"\x1b/workers/{worker_id}/cordon\x12x\n" + + "\x0eUncordonWorker\x12\x1e.gateway.UncordonWorkerRequest\x1a\x1f.gateway.UncordonWorkerResponse\"%\x82\xd3\xe4\x93\x02\x1f\"\x1d/workers/{worker_id}/uncordon\x12l\n" + + "\vDrainWorker\x12\x1b.gateway.DrainWorkerRequest\x1a\x1c.gateway.DrainWorkerResponse\"\"\x82\xd3\xe4\x93\x02\x1c\"\x1a/workers/{worker_id}/drain\x12\x81\x01\n" + + "\x15ExportWorkspaceConfig\x12%.gateway.ExportWorkspaceConfigRequest\x1a&.gateway.ExportWorkspaceConfigResponse\"\x19\x82\xd3\xe4\x93\x02\x13\x12\x11/workspace/configB#Z!github.com/beam-cloud/beta9/protob\x06proto3" var ( file_gateway_proto_rawDescOnce sync.Once - file_gateway_proto_rawDescData = file_gateway_proto_rawDesc + file_gateway_proto_rawDescData []byte ) func file_gateway_proto_rawDescGZIP() []byte { file_gateway_proto_rawDescOnce.Do(func() { - file_gateway_proto_rawDescData = protoimpl.X.CompressGZIP(file_gateway_proto_rawDescData) + file_gateway_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gateway_proto_rawDesc), len(file_gateway_proto_rawDesc))) }) return file_gateway_proto_rawDescData } var file_gateway_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_gateway_proto_msgTypes = make([]protoimpl.MessageInfo, 185) -var file_gateway_proto_goTypes = []interface{}{ +var file_gateway_proto_msgTypes = make([]protoimpl.MessageInfo, 189) +var file_gateway_proto_goTypes = []any{ (SyncContainerWorkspaceOperation)(0), // 0: gateway.SyncContainerWorkspaceOperation (*AuthorizeRequest)(nil), // 1: gateway.AuthorizeRequest (*AuthorizeResponse)(nil), // 2: gateway.AuthorizeResponse @@ -16158,119 +14586,123 @@ var file_gateway_proto_goTypes = []interface{}{ (*AgentRoute)(nil), // 129: gateway.AgentRoute (*RequestAgentTransportCredentialRequest)(nil), // 130: gateway.RequestAgentTransportCredentialRequest (*RequestAgentTransportCredentialResponse)(nil), // 131: gateway.RequestAgentTransportCredentialResponse - (*ListAgentRoutesRequest)(nil), // 132: gateway.ListAgentRoutesRequest - (*ListAgentRoutesResponse)(nil), // 133: gateway.ListAgentRoutesResponse - (*UpdateAgentRouteStatusRequest)(nil), // 134: gateway.UpdateAgentRouteStatusRequest - (*UpdateAgentRouteStatusResponse)(nil), // 135: gateway.UpdateAgentRouteStatusResponse - (*AgentWorkerSlot)(nil), // 136: gateway.AgentWorkerSlot - (*StreamAgentRequest)(nil), // 137: gateway.StreamAgentRequest - (*StreamAgentResponse)(nil), // 138: gateway.StreamAgentResponse - (*AgentLogRecord)(nil), // 139: gateway.AgentLogRecord - (*AgentMetricSnapshot)(nil), // 140: gateway.AgentMetricSnapshot - (*AgentEventRecord)(nil), // 141: gateway.AgentEventRecord - (*AgentTelemetryRequest)(nil), // 142: gateway.AgentTelemetryRequest - (*AgentTelemetryResponse)(nil), // 143: gateway.AgentTelemetryResponse - (*Machine)(nil), // 144: gateway.Machine - (*MachineMetrics)(nil), // 145: gateway.MachineMetrics - (*MachinePathMetrics)(nil), // 146: gateway.MachinePathMetrics - (*ListMachinesRequest)(nil), // 147: gateway.ListMachinesRequest - (*ListMachinesResponse)(nil), // 148: gateway.ListMachinesResponse - (*CreateMachineRequest)(nil), // 149: gateway.CreateMachineRequest - (*CreateMachineResponse)(nil), // 150: gateway.CreateMachineResponse - (*DeleteMachineRequest)(nil), // 151: gateway.DeleteMachineRequest - (*DeleteMachineResponse)(nil), // 152: gateway.DeleteMachineResponse - (*Token)(nil), // 153: gateway.Token - (*ListTokensRequest)(nil), // 154: gateway.ListTokensRequest - (*ListTokensResponse)(nil), // 155: gateway.ListTokensResponse - (*CreateTokenRequest)(nil), // 156: gateway.CreateTokenRequest - (*CreateTokenResponse)(nil), // 157: gateway.CreateTokenResponse - (*ToggleTokenRequest)(nil), // 158: gateway.ToggleTokenRequest - (*ToggleTokenResponse)(nil), // 159: gateway.ToggleTokenResponse - (*DeleteTokenRequest)(nil), // 160: gateway.DeleteTokenRequest - (*DeleteTokenResponse)(nil), // 161: gateway.DeleteTokenResponse - (*GetURLRequest)(nil), // 162: gateway.GetURLRequest - (*GetURLResponse)(nil), // 163: gateway.GetURLResponse - (*ListWorkersRequest)(nil), // 164: gateway.ListWorkersRequest - (*ListWorkersResponse)(nil), // 165: gateway.ListWorkersResponse - (*CordonWorkerRequest)(nil), // 166: gateway.CordonWorkerRequest - (*CordonWorkerResponse)(nil), // 167: gateway.CordonWorkerResponse - (*UncordonWorkerRequest)(nil), // 168: gateway.UncordonWorkerRequest - (*UncordonWorkerResponse)(nil), // 169: gateway.UncordonWorkerResponse - (*DrainWorkerRequest)(nil), // 170: gateway.DrainWorkerRequest - (*DrainWorkerResponse)(nil), // 171: gateway.DrainWorkerResponse - (*ExportWorkspaceConfigRequest)(nil), // 172: gateway.ExportWorkspaceConfigRequest - (*ExportWorkspaceConfigResponse)(nil), // 173: gateway.ExportWorkspaceConfigResponse - (*UpdateAgentAvailabilityRequest)(nil), // 174: gateway.UpdateAgentAvailabilityRequest - (*UpdateAgentAvailabilityResponse)(nil), // 175: gateway.UpdateAgentAvailabilityResponse - nil, // 176: gateway.CreateObjectResponse.PutHeadersEntry - nil, // 177: gateway.ListTasksRequest.FiltersEntry - nil, // 178: gateway.Schema.FieldsEntry - nil, // 179: gateway.ListDeploymentsRequest.FiltersEntry - nil, // 180: gateway.ListPoolsRequest.FiltersEntry - nil, // 181: gateway.ListPrivatePoolsRequest.FiltersEntry - nil, // 182: gateway.UpdateAgentRouteStatusRequest.AttrsEntry - nil, // 183: gateway.AgentEventRecord.AttrsEntry - nil, // 184: gateway.ListMachinesResponse.GpusEntry - nil, // 185: gateway.ListMachinesResponse.SupportedGpusEntry - (*Container)(nil), // 186: types.Container - (*timestamppb.Timestamp)(nil), // 187: google.protobuf.Timestamp - (*MountPointConfig)(nil), // 188: types.MountPointConfig - (*PricingPolicy)(nil), // 189: types.PricingPolicy - (*CheckpointTrigger)(nil), // 190: types.CheckpointTrigger - (*WorkerPoolState)(nil), // 191: types.WorkerPoolState - (*Worker)(nil), // 192: types.Worker + (*CreateNodeEnrollmentRequest)(nil), // 132: gateway.CreateNodeEnrollmentRequest + (*CreateNodeEnrollmentResponse)(nil), // 133: gateway.CreateNodeEnrollmentResponse + (*DeleteNodeEnrollmentRequest)(nil), // 134: gateway.DeleteNodeEnrollmentRequest + (*DeleteNodeEnrollmentResponse)(nil), // 135: gateway.DeleteNodeEnrollmentResponse + (*ListAgentRoutesRequest)(nil), // 136: gateway.ListAgentRoutesRequest + (*ListAgentRoutesResponse)(nil), // 137: gateway.ListAgentRoutesResponse + (*UpdateAgentRouteStatusRequest)(nil), // 138: gateway.UpdateAgentRouteStatusRequest + (*UpdateAgentRouteStatusResponse)(nil), // 139: gateway.UpdateAgentRouteStatusResponse + (*AgentWorkerSlot)(nil), // 140: gateway.AgentWorkerSlot + (*StreamAgentRequest)(nil), // 141: gateway.StreamAgentRequest + (*StreamAgentResponse)(nil), // 142: gateway.StreamAgentResponse + (*AgentLogRecord)(nil), // 143: gateway.AgentLogRecord + (*AgentMetricSnapshot)(nil), // 144: gateway.AgentMetricSnapshot + (*AgentEventRecord)(nil), // 145: gateway.AgentEventRecord + (*AgentTelemetryRequest)(nil), // 146: gateway.AgentTelemetryRequest + (*AgentTelemetryResponse)(nil), // 147: gateway.AgentTelemetryResponse + (*Machine)(nil), // 148: gateway.Machine + (*MachineMetrics)(nil), // 149: gateway.MachineMetrics + (*MachinePathMetrics)(nil), // 150: gateway.MachinePathMetrics + (*ListMachinesRequest)(nil), // 151: gateway.ListMachinesRequest + (*ListMachinesResponse)(nil), // 152: gateway.ListMachinesResponse + (*CreateMachineRequest)(nil), // 153: gateway.CreateMachineRequest + (*CreateMachineResponse)(nil), // 154: gateway.CreateMachineResponse + (*DeleteMachineRequest)(nil), // 155: gateway.DeleteMachineRequest + (*DeleteMachineResponse)(nil), // 156: gateway.DeleteMachineResponse + (*Token)(nil), // 157: gateway.Token + (*ListTokensRequest)(nil), // 158: gateway.ListTokensRequest + (*ListTokensResponse)(nil), // 159: gateway.ListTokensResponse + (*CreateTokenRequest)(nil), // 160: gateway.CreateTokenRequest + (*CreateTokenResponse)(nil), // 161: gateway.CreateTokenResponse + (*ToggleTokenRequest)(nil), // 162: gateway.ToggleTokenRequest + (*ToggleTokenResponse)(nil), // 163: gateway.ToggleTokenResponse + (*DeleteTokenRequest)(nil), // 164: gateway.DeleteTokenRequest + (*DeleteTokenResponse)(nil), // 165: gateway.DeleteTokenResponse + (*GetURLRequest)(nil), // 166: gateway.GetURLRequest + (*GetURLResponse)(nil), // 167: gateway.GetURLResponse + (*ListWorkersRequest)(nil), // 168: gateway.ListWorkersRequest + (*ListWorkersResponse)(nil), // 169: gateway.ListWorkersResponse + (*CordonWorkerRequest)(nil), // 170: gateway.CordonWorkerRequest + (*CordonWorkerResponse)(nil), // 171: gateway.CordonWorkerResponse + (*UncordonWorkerRequest)(nil), // 172: gateway.UncordonWorkerRequest + (*UncordonWorkerResponse)(nil), // 173: gateway.UncordonWorkerResponse + (*DrainWorkerRequest)(nil), // 174: gateway.DrainWorkerRequest + (*DrainWorkerResponse)(nil), // 175: gateway.DrainWorkerResponse + (*ExportWorkspaceConfigRequest)(nil), // 176: gateway.ExportWorkspaceConfigRequest + (*ExportWorkspaceConfigResponse)(nil), // 177: gateway.ExportWorkspaceConfigResponse + (*UpdateAgentAvailabilityRequest)(nil), // 178: gateway.UpdateAgentAvailabilityRequest + (*UpdateAgentAvailabilityResponse)(nil), // 179: gateway.UpdateAgentAvailabilityResponse + nil, // 180: gateway.CreateObjectResponse.PutHeadersEntry + nil, // 181: gateway.ListTasksRequest.FiltersEntry + nil, // 182: gateway.Schema.FieldsEntry + nil, // 183: gateway.ListDeploymentsRequest.FiltersEntry + nil, // 184: gateway.ListPoolsRequest.FiltersEntry + nil, // 185: gateway.ListPrivatePoolsRequest.FiltersEntry + nil, // 186: gateway.UpdateAgentRouteStatusRequest.AttrsEntry + nil, // 187: gateway.AgentEventRecord.AttrsEntry + nil, // 188: gateway.ListMachinesResponse.GpusEntry + nil, // 189: gateway.ListMachinesResponse.SupportedGpusEntry + (*Container)(nil), // 190: types.Container + (*timestamppb.Timestamp)(nil), // 191: google.protobuf.Timestamp + (*MountPointConfig)(nil), // 192: types.MountPointConfig + (*PricingPolicy)(nil), // 193: types.PricingPolicy + (*CheckpointTrigger)(nil), // 194: types.CheckpointTrigger + (*WorkerPoolState)(nil), // 195: types.WorkerPoolState + (*Worker)(nil), // 196: types.Worker } var file_gateway_proto_depIdxs = []int32{ 5, // 0: gateway.HeadObjectResponse.object_metadata:type_name -> gateway.ObjectMetadata 5, // 1: gateway.CreateObjectRequest.object_metadata:type_name -> gateway.ObjectMetadata - 176, // 2: gateway.CreateObjectResponse.put_headers:type_name -> gateway.CreateObjectResponse.PutHeadersEntry + 180, // 2: gateway.CreateObjectResponse.put_headers:type_name -> gateway.CreateObjectResponse.PutHeadersEntry 5, // 3: gateway.PutObjectRequest.object_metadata:type_name -> gateway.ObjectMetadata 0, // 4: gateway.SyncContainerWorkspaceRequest.op:type_name -> gateway.SyncContainerWorkspaceOperation - 186, // 5: gateway.ListContainersResponse.containers:type_name -> types.Container + 190, // 5: gateway.ListContainersResponse.containers:type_name -> types.Container 21, // 6: gateway.ContainerStreamMessage.attach_request:type_name -> gateway.AttachToContainerRequest 12, // 7: gateway.ContainerStreamMessage.sync_container_workspace:type_name -> gateway.SyncContainerWorkspaceRequest - 177, // 8: gateway.ListTasksRequest.filters:type_name -> gateway.ListTasksRequest.FiltersEntry - 187, // 9: gateway.Task.started_at:type_name -> google.protobuf.Timestamp - 187, // 10: gateway.Task.ended_at:type_name -> google.protobuf.Timestamp - 187, // 11: gateway.Task.created_at:type_name -> google.protobuf.Timestamp - 187, // 12: gateway.Task.updated_at:type_name -> google.protobuf.Timestamp + 181, // 8: gateway.ListTasksRequest.filters:type_name -> gateway.ListTasksRequest.FiltersEntry + 191, // 9: gateway.Task.started_at:type_name -> google.protobuf.Timestamp + 191, // 10: gateway.Task.ended_at:type_name -> google.protobuf.Timestamp + 191, // 11: gateway.Task.created_at:type_name -> google.protobuf.Timestamp + 191, // 12: gateway.Task.updated_at:type_name -> google.protobuf.Timestamp 29, // 13: gateway.ListTasksResponse.tasks:type_name -> gateway.Task - 188, // 14: gateway.Volume.config:type_name -> types.MountPointConfig + 192, // 14: gateway.Volume.config:type_name -> types.MountPointConfig 36, // 15: gateway.ServingConfig.llm:type_name -> gateway.LLMConfig 37, // 16: gateway.ServingConfig.database:type_name -> gateway.DatabaseServingConfig - 178, // 17: gateway.Schema.fields:type_name -> gateway.Schema.FieldsEntry + 182, // 17: gateway.Schema.fields:type_name -> gateway.Schema.FieldsEntry 41, // 18: gateway.SchemaField.fields:type_name -> gateway.Schema 33, // 19: gateway.GetOrCreateStubRequest.volumes:type_name -> gateway.Volume 34, // 20: gateway.GetOrCreateStubRequest.secrets:type_name -> gateway.SecretVar 35, // 21: gateway.GetOrCreateStubRequest.autoscaler:type_name -> gateway.Autoscaler 40, // 22: gateway.GetOrCreateStubRequest.task_policy:type_name -> gateway.TaskPolicy - 189, // 23: gateway.GetOrCreateStubRequest.pricing:type_name -> types.PricingPolicy + 193, // 23: gateway.GetOrCreateStubRequest.pricing:type_name -> types.PricingPolicy 41, // 24: gateway.GetOrCreateStubRequest.inputs:type_name -> gateway.Schema 41, // 25: gateway.GetOrCreateStubRequest.outputs:type_name -> gateway.Schema 61, // 26: gateway.GetOrCreateStubRequest.pool:type_name -> gateway.PoolConfig 38, // 27: gateway.GetOrCreateStubRequest.serving:type_name -> gateway.ServingConfig 39, // 28: gateway.GetOrCreateStubRequest.disks:type_name -> gateway.DurableDisk - 190, // 29: gateway.GetOrCreateStubRequest.checkpoint_trigger:type_name -> types.CheckpointTrigger - 187, // 30: gateway.Deployment.created_at:type_name -> google.protobuf.Timestamp - 187, // 31: gateway.Deployment.updated_at:type_name -> google.protobuf.Timestamp - 179, // 32: gateway.ListDeploymentsRequest.filters:type_name -> gateway.ListDeploymentsRequest.FiltersEntry + 194, // 29: gateway.GetOrCreateStubRequest.checkpoint_trigger:type_name -> types.CheckpointTrigger + 191, // 30: gateway.Deployment.created_at:type_name -> google.protobuf.Timestamp + 191, // 31: gateway.Deployment.updated_at:type_name -> google.protobuf.Timestamp + 183, // 32: gateway.ListDeploymentsRequest.filters:type_name -> gateway.ListDeploymentsRequest.FiltersEntry 47, // 33: gateway.ListDeploymentsResponse.deployments:type_name -> gateway.Deployment - 191, // 34: gateway.Pool.state:type_name -> types.WorkerPoolState - 180, // 35: gateway.ListPoolsRequest.filters:type_name -> gateway.ListPoolsRequest.FiltersEntry + 195, // 34: gateway.Pool.state:type_name -> types.WorkerPoolState + 184, // 35: gateway.ListPoolsRequest.filters:type_name -> gateway.ListPoolsRequest.FiltersEntry 58, // 36: gateway.ListPoolsResponse.pools:type_name -> gateway.Pool - 187, // 37: gateway.ProviderInstance.created_at:type_name -> google.protobuf.Timestamp - 187, // 38: gateway.ProviderInstance.expires_at:type_name -> google.protobuf.Timestamp - 187, // 39: gateway.ProviderInstance.billing_renewal_at:type_name -> google.protobuf.Timestamp + 191, // 37: gateway.ProviderInstance.created_at:type_name -> google.protobuf.Timestamp + 191, // 38: gateway.ProviderInstance.expires_at:type_name -> google.protobuf.Timestamp + 191, // 39: gateway.ProviderInstance.billing_renewal_at:type_name -> google.protobuf.Timestamp 61, // 40: gateway.PrivatePool.config:type_name -> gateway.PoolConfig 63, // 41: gateway.PrivatePool.reservations:type_name -> gateway.ProviderInstance - 187, // 42: gateway.PrivatePool.created_at:type_name -> google.protobuf.Timestamp - 187, // 43: gateway.PrivatePool.expires_at:type_name -> google.protobuf.Timestamp + 191, // 42: gateway.PrivatePool.created_at:type_name -> google.protobuf.Timestamp + 191, // 43: gateway.PrivatePool.expires_at:type_name -> google.protobuf.Timestamp 73, // 44: gateway.PrivatePool.byoc:type_name -> gateway.BYOCPoolState 61, // 45: gateway.ListPoolOffersRequest.pool:type_name -> gateway.PoolConfig 62, // 46: gateway.ListPoolOffersResponse.offers:type_name -> gateway.PoolOffer 61, // 47: gateway.LaunchPoolCapacityRequest.pool:type_name -> gateway.PoolConfig 64, // 48: gateway.LaunchPoolCapacityResponse.pool:type_name -> gateway.PrivatePool - 181, // 49: gateway.ListPrivatePoolsRequest.filters:type_name -> gateway.ListPrivatePoolsRequest.FiltersEntry + 185, // 49: gateway.ListPrivatePoolsRequest.filters:type_name -> gateway.ListPrivatePoolsRequest.FiltersEntry 64, // 50: gateway.ListPrivatePoolsResponse.pools:type_name -> gateway.PrivatePool 64, // 51: gateway.CreateBYOCPoolResponse.pool:type_name -> gateway.PrivatePool 73, // 52: gateway.CreateBYOCPoolResponse.byoc:type_name -> gateway.BYOCPoolState @@ -16278,26 +14710,26 @@ var file_gateway_proto_depIdxs = []int32{ 73, // 54: gateway.GetBYOCPoolResponse.byoc:type_name -> gateway.BYOCPoolState 64, // 55: gateway.ScaleBYOCPoolResponse.pool:type_name -> gateway.PrivatePool 73, // 56: gateway.ScaleBYOCPoolResponse.byoc:type_name -> gateway.BYOCPoolState - 187, // 57: gateway.MarketplaceListing.created_at:type_name -> google.protobuf.Timestamp - 187, // 58: gateway.MarketplaceListing.updated_at:type_name -> google.protobuf.Timestamp - 187, // 59: gateway.MarketplaceOffer.created_at:type_name -> google.protobuf.Timestamp + 191, // 57: gateway.MarketplaceListing.created_at:type_name -> google.protobuf.Timestamp + 191, // 58: gateway.MarketplaceListing.updated_at:type_name -> google.protobuf.Timestamp + 191, // 59: gateway.MarketplaceOffer.created_at:type_name -> google.protobuf.Timestamp 78, // 60: gateway.CreateMarketplaceListingResponse.listing:type_name -> gateway.MarketplaceListing 78, // 61: gateway.UpdateMarketplaceListingResponse.listing:type_name -> gateway.MarketplaceListing 78, // 62: gateway.ListMarketplaceListingsResponse.listings:type_name -> gateway.MarketplaceListing - 187, // 63: gateway.GetMarketplaceJoinCommandResponse.expires_at:type_name -> google.protobuf.Timestamp + 191, // 63: gateway.GetMarketplaceJoinCommandResponse.expires_at:type_name -> google.protobuf.Timestamp 79, // 64: gateway.ListMarketplaceOffersResponse.offers:type_name -> gateway.MarketplaceOffer 79, // 65: gateway.GetMarketplaceOfferResponse.offer:type_name -> gateway.MarketplaceOffer - 187, // 66: gateway.MarketplaceRental.created_at:type_name -> google.protobuf.Timestamp + 191, // 66: gateway.MarketplaceRental.created_at:type_name -> google.protobuf.Timestamp 94, // 67: gateway.CreateMarketplaceRentalResponse.rental:type_name -> gateway.MarketplaceRental 94, // 68: gateway.ListMarketplaceRentalsResponse.rentals:type_name -> gateway.MarketplaceRental - 144, // 69: gateway.ListMarketplaceMachinesResponse.machines:type_name -> gateway.Machine + 148, // 69: gateway.ListMarketplaceMachinesResponse.machines:type_name -> gateway.Machine 106, // 70: gateway.ListMachineContainersResponse.containers:type_name -> gateway.MachineContainer 61, // 71: gateway.CreatePoolRequest.pool:type_name -> gateway.PoolConfig 64, // 72: gateway.CreatePoolResponse.pool:type_name -> gateway.PrivatePool 64, // 73: gateway.ExtendPoolCapacityResponse.pool:type_name -> gateway.PrivatePool - 187, // 74: gateway.CreatePoolJoinTokenResponse.expires_at:type_name -> google.protobuf.Timestamp - 187, // 75: gateway.GetPoolJoinCommandResponse.expires_at:type_name -> google.protobuf.Timestamp - 144, // 76: gateway.ListPoolMachinesResponse.machines:type_name -> gateway.Machine + 191, // 74: gateway.CreatePoolJoinTokenResponse.expires_at:type_name -> google.protobuf.Timestamp + 191, // 75: gateway.GetPoolJoinCommandResponse.expires_at:type_name -> google.protobuf.Timestamp + 148, // 76: gateway.ListPoolMachinesResponse.machines:type_name -> gateway.Machine 124, // 77: gateway.AgentBootstrapConfig.telemetry:type_name -> gateway.AgentTelemetryConfig 123, // 78: gateway.AgentBootstrapConfig.billing:type_name -> gateway.AgentBillingConfig 125, // 79: gateway.AgentTelemetryConfig.logs:type_name -> gateway.AgentTelemetrySinkConfig @@ -16305,26 +14737,26 @@ var file_gateway_proto_depIdxs = []int32{ 128, // 81: gateway.JoinAgentRequest.preflight:type_name -> gateway.AgentPreflightCheck 122, // 82: gateway.JoinAgentResponse.bootstrap:type_name -> gateway.AgentBootstrapConfig 129, // 83: gateway.ListAgentRoutesResponse.routes:type_name -> gateway.AgentRoute - 182, // 84: gateway.UpdateAgentRouteStatusRequest.attrs:type_name -> gateway.UpdateAgentRouteStatusRequest.AttrsEntry + 186, // 84: gateway.UpdateAgentRouteStatusRequest.attrs:type_name -> gateway.UpdateAgentRouteStatusRequest.AttrsEntry 129, // 85: gateway.StreamAgentResponse.routes:type_name -> gateway.AgentRoute - 136, // 86: gateway.StreamAgentResponse.slots:type_name -> gateway.AgentWorkerSlot - 146, // 87: gateway.AgentMetricSnapshot.path_metrics:type_name -> gateway.MachinePathMetrics - 183, // 88: gateway.AgentEventRecord.attrs:type_name -> gateway.AgentEventRecord.AttrsEntry - 139, // 89: gateway.AgentTelemetryRequest.logs:type_name -> gateway.AgentLogRecord - 140, // 90: gateway.AgentTelemetryRequest.metrics:type_name -> gateway.AgentMetricSnapshot - 141, // 91: gateway.AgentTelemetryRequest.events:type_name -> gateway.AgentEventRecord - 145, // 92: gateway.Machine.machine_metrics:type_name -> gateway.MachineMetrics - 146, // 93: gateway.MachineMetrics.path_metrics:type_name -> gateway.MachinePathMetrics - 144, // 94: gateway.ListMachinesResponse.machines:type_name -> gateway.Machine - 184, // 95: gateway.ListMachinesResponse.gpus:type_name -> gateway.ListMachinesResponse.GpusEntry - 185, // 96: gateway.ListMachinesResponse.supported_gpus:type_name -> gateway.ListMachinesResponse.SupportedGpusEntry - 144, // 97: gateway.CreateMachineResponse.machine:type_name -> gateway.Machine - 187, // 98: gateway.Token.created_at:type_name -> google.protobuf.Timestamp - 187, // 99: gateway.Token.updated_at:type_name -> google.protobuf.Timestamp - 153, // 100: gateway.ListTokensResponse.tokens:type_name -> gateway.Token - 153, // 101: gateway.CreateTokenResponse.token:type_name -> gateway.Token - 153, // 102: gateway.ToggleTokenResponse.token:type_name -> gateway.Token - 192, // 103: gateway.ListWorkersResponse.workers:type_name -> types.Worker + 140, // 86: gateway.StreamAgentResponse.slots:type_name -> gateway.AgentWorkerSlot + 150, // 87: gateway.AgentMetricSnapshot.path_metrics:type_name -> gateway.MachinePathMetrics + 187, // 88: gateway.AgentEventRecord.attrs:type_name -> gateway.AgentEventRecord.AttrsEntry + 143, // 89: gateway.AgentTelemetryRequest.logs:type_name -> gateway.AgentLogRecord + 144, // 90: gateway.AgentTelemetryRequest.metrics:type_name -> gateway.AgentMetricSnapshot + 145, // 91: gateway.AgentTelemetryRequest.events:type_name -> gateway.AgentEventRecord + 149, // 92: gateway.Machine.machine_metrics:type_name -> gateway.MachineMetrics + 150, // 93: gateway.MachineMetrics.path_metrics:type_name -> gateway.MachinePathMetrics + 148, // 94: gateway.ListMachinesResponse.machines:type_name -> gateway.Machine + 188, // 95: gateway.ListMachinesResponse.gpus:type_name -> gateway.ListMachinesResponse.GpusEntry + 189, // 96: gateway.ListMachinesResponse.supported_gpus:type_name -> gateway.ListMachinesResponse.SupportedGpusEntry + 148, // 97: gateway.CreateMachineResponse.machine:type_name -> gateway.Machine + 191, // 98: gateway.Token.created_at:type_name -> google.protobuf.Timestamp + 191, // 99: gateway.Token.updated_at:type_name -> google.protobuf.Timestamp + 157, // 100: gateway.ListTokensResponse.tokens:type_name -> gateway.Token + 157, // 101: gateway.CreateTokenResponse.token:type_name -> gateway.Token + 157, // 102: gateway.ToggleTokenResponse.token:type_name -> gateway.Token + 196, // 103: gateway.ListWorkersResponse.workers:type_name -> types.Worker 27, // 104: gateway.ListTasksRequest.FiltersEntry.value:type_name -> gateway.StringList 42, // 105: gateway.Schema.FieldsEntry.value:type_name -> gateway.SchemaField 27, // 106: gateway.ListDeploymentsRequest.FiltersEntry.value:type_name -> gateway.StringList @@ -16345,7 +14777,7 @@ var file_gateway_proto_depIdxs = []int32{ 28, // 121: gateway.GatewayService.ListTasks:input_type -> gateway.ListTasksRequest 43, // 122: gateway.GatewayService.GetOrCreateStub:input_type -> gateway.GetOrCreateStubRequest 45, // 123: gateway.GatewayService.DeployStub:input_type -> gateway.DeployStubRequest - 162, // 124: gateway.GatewayService.GetURL:input_type -> gateway.GetURLRequest + 166, // 124: gateway.GatewayService.GetURL:input_type -> gateway.GetURLRequest 48, // 125: gateway.GatewayService.ListDeployments:input_type -> gateway.ListDeploymentsRequest 50, // 126: gateway.GatewayService.StopDeployment:input_type -> gateway.StopDeploymentRequest 52, // 127: gateway.GatewayService.StartDeployment:input_type -> gateway.StartDeploymentRequest @@ -16380,92 +14812,96 @@ var file_gateway_proto_depIdxs = []int32{ 120, // 156: gateway.GatewayService.ListPoolMachines:input_type -> gateway.ListPoolMachinesRequest 126, // 157: gateway.GatewayService.JoinAgent:input_type -> gateway.JoinAgentRequest 130, // 158: gateway.GatewayService.RequestAgentTransportCredential:input_type -> gateway.RequestAgentTransportCredentialRequest - 132, // 159: gateway.GatewayService.ListAgentRoutes:input_type -> gateway.ListAgentRoutesRequest - 134, // 160: gateway.GatewayService.UpdateAgentRouteStatus:input_type -> gateway.UpdateAgentRouteStatusRequest - 174, // 161: gateway.GatewayService.UpdateAgentAvailability:input_type -> gateway.UpdateAgentAvailabilityRequest - 137, // 162: gateway.GatewayService.StreamAgent:input_type -> gateway.StreamAgentRequest - 142, // 163: gateway.GatewayService.StreamAgentTelemetry:input_type -> gateway.AgentTelemetryRequest - 147, // 164: gateway.GatewayService.ListMachines:input_type -> gateway.ListMachinesRequest - 149, // 165: gateway.GatewayService.CreateMachine:input_type -> gateway.CreateMachineRequest - 151, // 166: gateway.GatewayService.DeleteMachine:input_type -> gateway.DeleteMachineRequest - 154, // 167: gateway.GatewayService.ListTokens:input_type -> gateway.ListTokensRequest - 156, // 168: gateway.GatewayService.CreateToken:input_type -> gateway.CreateTokenRequest - 158, // 169: gateway.GatewayService.ToggleToken:input_type -> gateway.ToggleTokenRequest - 160, // 170: gateway.GatewayService.DeleteToken:input_type -> gateway.DeleteTokenRequest - 164, // 171: gateway.GatewayService.ListWorkers:input_type -> gateway.ListWorkersRequest - 166, // 172: gateway.GatewayService.CordonWorker:input_type -> gateway.CordonWorkerRequest - 168, // 173: gateway.GatewayService.UncordonWorker:input_type -> gateway.UncordonWorkerRequest - 170, // 174: gateway.GatewayService.DrainWorker:input_type -> gateway.DrainWorkerRequest - 172, // 175: gateway.GatewayService.ExportWorkspaceConfig:input_type -> gateway.ExportWorkspaceConfigRequest - 2, // 176: gateway.GatewayService.Authorize:output_type -> gateway.AuthorizeResponse - 4, // 177: gateway.GatewayService.SignPayload:output_type -> gateway.SignPayloadResponse - 7, // 178: gateway.GatewayService.HeadObject:output_type -> gateway.HeadObjectResponse - 9, // 179: gateway.GatewayService.CreateObject:output_type -> gateway.CreateObjectResponse - 11, // 180: gateway.GatewayService.PutObjectStream:output_type -> gateway.PutObjectResponse - 19, // 181: gateway.GatewayService.CheckpointContainer:output_type -> gateway.CheckpointContainerResponse - 15, // 182: gateway.GatewayService.ListContainers:output_type -> gateway.ListContainersResponse - 17, // 183: gateway.GatewayService.StopContainer:output_type -> gateway.StopContainerResponse - 22, // 184: gateway.GatewayService.AttachToContainer:output_type -> gateway.AttachToContainerResponse - 24, // 185: gateway.GatewayService.StartTask:output_type -> gateway.StartTaskResponse - 26, // 186: gateway.GatewayService.EndTask:output_type -> gateway.EndTaskResponse - 32, // 187: gateway.GatewayService.StopTasks:output_type -> gateway.StopTasksResponse - 30, // 188: gateway.GatewayService.ListTasks:output_type -> gateway.ListTasksResponse - 44, // 189: gateway.GatewayService.GetOrCreateStub:output_type -> gateway.GetOrCreateStubResponse - 46, // 190: gateway.GatewayService.DeployStub:output_type -> gateway.DeployStubResponse - 163, // 191: gateway.GatewayService.GetURL:output_type -> gateway.GetURLResponse - 49, // 192: gateway.GatewayService.ListDeployments:output_type -> gateway.ListDeploymentsResponse - 51, // 193: gateway.GatewayService.StopDeployment:output_type -> gateway.StopDeploymentResponse - 53, // 194: gateway.GatewayService.StartDeployment:output_type -> gateway.StartDeploymentResponse - 55, // 195: gateway.GatewayService.ScaleDeployment:output_type -> gateway.ScaleDeploymentResponse - 57, // 196: gateway.GatewayService.DeleteDeployment:output_type -> gateway.DeleteDeploymentResponse - 60, // 197: gateway.GatewayService.ListPools:output_type -> gateway.ListPoolsResponse - 66, // 198: gateway.GatewayService.ListPoolOffers:output_type -> gateway.ListPoolOffersResponse - 68, // 199: gateway.GatewayService.LaunchPoolCapacity:output_type -> gateway.LaunchPoolCapacityResponse - 70, // 200: gateway.GatewayService.ListPrivatePools:output_type -> gateway.ListPrivatePoolsResponse - 72, // 201: gateway.GatewayService.CreateBYOCPool:output_type -> gateway.CreateBYOCPoolResponse - 75, // 202: gateway.GatewayService.GetBYOCPool:output_type -> gateway.GetBYOCPoolResponse - 77, // 203: gateway.GatewayService.ScaleBYOCPool:output_type -> gateway.ScaleBYOCPoolResponse - 81, // 204: gateway.GatewayService.CreateMarketplaceListing:output_type -> gateway.CreateMarketplaceListingResponse - 83, // 205: gateway.GatewayService.UpdateMarketplaceListing:output_type -> gateway.UpdateMarketplaceListingResponse - 85, // 206: gateway.GatewayService.DeleteMarketplaceListing:output_type -> gateway.DeleteMarketplaceListingResponse - 87, // 207: gateway.GatewayService.ListMarketplaceListings:output_type -> gateway.ListMarketplaceListingsResponse - 89, // 208: gateway.GatewayService.GetMarketplaceJoinCommand:output_type -> gateway.GetMarketplaceJoinCommandResponse - 91, // 209: gateway.GatewayService.ListMarketplaceOffers:output_type -> gateway.ListMarketplaceOffersResponse - 93, // 210: gateway.GatewayService.GetMarketplaceOffer:output_type -> gateway.GetMarketplaceOfferResponse - 96, // 211: gateway.GatewayService.CreateMarketplaceRental:output_type -> gateway.CreateMarketplaceRentalResponse - 98, // 212: gateway.GatewayService.ListMarketplaceRentals:output_type -> gateway.ListMarketplaceRentalsResponse - 100, // 213: gateway.GatewayService.DeleteMarketplaceRental:output_type -> gateway.DeleteMarketplaceRentalResponse - 102, // 214: gateway.GatewayService.LaunchRentalWorkload:output_type -> gateway.LaunchRentalWorkloadResponse - 104, // 215: gateway.GatewayService.ListMarketplaceMachines:output_type -> gateway.ListMarketplaceMachinesResponse - 107, // 216: gateway.GatewayService.ListMachineContainers:output_type -> gateway.ListMachineContainersResponse - 109, // 217: gateway.GatewayService.CreatePool:output_type -> gateway.CreatePoolResponse - 111, // 218: gateway.GatewayService.DeletePool:output_type -> gateway.DeletePoolResponse - 113, // 219: gateway.GatewayService.ExtendPoolCapacity:output_type -> gateway.ExtendPoolCapacityResponse - 115, // 220: gateway.GatewayService.CreatePoolJoinToken:output_type -> gateway.CreatePoolJoinTokenResponse - 117, // 221: gateway.GatewayService.RevokePoolJoinToken:output_type -> gateway.RevokePoolJoinTokenResponse - 119, // 222: gateway.GatewayService.GetPoolJoinCommand:output_type -> gateway.GetPoolJoinCommandResponse - 121, // 223: gateway.GatewayService.ListPoolMachines:output_type -> gateway.ListPoolMachinesResponse - 127, // 224: gateway.GatewayService.JoinAgent:output_type -> gateway.JoinAgentResponse - 131, // 225: gateway.GatewayService.RequestAgentTransportCredential:output_type -> gateway.RequestAgentTransportCredentialResponse - 133, // 226: gateway.GatewayService.ListAgentRoutes:output_type -> gateway.ListAgentRoutesResponse - 135, // 227: gateway.GatewayService.UpdateAgentRouteStatus:output_type -> gateway.UpdateAgentRouteStatusResponse - 175, // 228: gateway.GatewayService.UpdateAgentAvailability:output_type -> gateway.UpdateAgentAvailabilityResponse - 138, // 229: gateway.GatewayService.StreamAgent:output_type -> gateway.StreamAgentResponse - 143, // 230: gateway.GatewayService.StreamAgentTelemetry:output_type -> gateway.AgentTelemetryResponse - 148, // 231: gateway.GatewayService.ListMachines:output_type -> gateway.ListMachinesResponse - 150, // 232: gateway.GatewayService.CreateMachine:output_type -> gateway.CreateMachineResponse - 152, // 233: gateway.GatewayService.DeleteMachine:output_type -> gateway.DeleteMachineResponse - 155, // 234: gateway.GatewayService.ListTokens:output_type -> gateway.ListTokensResponse - 157, // 235: gateway.GatewayService.CreateToken:output_type -> gateway.CreateTokenResponse - 159, // 236: gateway.GatewayService.ToggleToken:output_type -> gateway.ToggleTokenResponse - 161, // 237: gateway.GatewayService.DeleteToken:output_type -> gateway.DeleteTokenResponse - 165, // 238: gateway.GatewayService.ListWorkers:output_type -> gateway.ListWorkersResponse - 167, // 239: gateway.GatewayService.CordonWorker:output_type -> gateway.CordonWorkerResponse - 169, // 240: gateway.GatewayService.UncordonWorker:output_type -> gateway.UncordonWorkerResponse - 171, // 241: gateway.GatewayService.DrainWorker:output_type -> gateway.DrainWorkerResponse - 173, // 242: gateway.GatewayService.ExportWorkspaceConfig:output_type -> gateway.ExportWorkspaceConfigResponse - 176, // [176:243] is the sub-list for method output_type - 109, // [109:176] is the sub-list for method input_type + 132, // 159: gateway.GatewayService.CreateNodeEnrollment:input_type -> gateway.CreateNodeEnrollmentRequest + 134, // 160: gateway.GatewayService.DeleteNodeEnrollment:input_type -> gateway.DeleteNodeEnrollmentRequest + 136, // 161: gateway.GatewayService.ListAgentRoutes:input_type -> gateway.ListAgentRoutesRequest + 138, // 162: gateway.GatewayService.UpdateAgentRouteStatus:input_type -> gateway.UpdateAgentRouteStatusRequest + 178, // 163: gateway.GatewayService.UpdateAgentAvailability:input_type -> gateway.UpdateAgentAvailabilityRequest + 141, // 164: gateway.GatewayService.StreamAgent:input_type -> gateway.StreamAgentRequest + 146, // 165: gateway.GatewayService.StreamAgentTelemetry:input_type -> gateway.AgentTelemetryRequest + 151, // 166: gateway.GatewayService.ListMachines:input_type -> gateway.ListMachinesRequest + 153, // 167: gateway.GatewayService.CreateMachine:input_type -> gateway.CreateMachineRequest + 155, // 168: gateway.GatewayService.DeleteMachine:input_type -> gateway.DeleteMachineRequest + 158, // 169: gateway.GatewayService.ListTokens:input_type -> gateway.ListTokensRequest + 160, // 170: gateway.GatewayService.CreateToken:input_type -> gateway.CreateTokenRequest + 162, // 171: gateway.GatewayService.ToggleToken:input_type -> gateway.ToggleTokenRequest + 164, // 172: gateway.GatewayService.DeleteToken:input_type -> gateway.DeleteTokenRequest + 168, // 173: gateway.GatewayService.ListWorkers:input_type -> gateway.ListWorkersRequest + 170, // 174: gateway.GatewayService.CordonWorker:input_type -> gateway.CordonWorkerRequest + 172, // 175: gateway.GatewayService.UncordonWorker:input_type -> gateway.UncordonWorkerRequest + 174, // 176: gateway.GatewayService.DrainWorker:input_type -> gateway.DrainWorkerRequest + 176, // 177: gateway.GatewayService.ExportWorkspaceConfig:input_type -> gateway.ExportWorkspaceConfigRequest + 2, // 178: gateway.GatewayService.Authorize:output_type -> gateway.AuthorizeResponse + 4, // 179: gateway.GatewayService.SignPayload:output_type -> gateway.SignPayloadResponse + 7, // 180: gateway.GatewayService.HeadObject:output_type -> gateway.HeadObjectResponse + 9, // 181: gateway.GatewayService.CreateObject:output_type -> gateway.CreateObjectResponse + 11, // 182: gateway.GatewayService.PutObjectStream:output_type -> gateway.PutObjectResponse + 19, // 183: gateway.GatewayService.CheckpointContainer:output_type -> gateway.CheckpointContainerResponse + 15, // 184: gateway.GatewayService.ListContainers:output_type -> gateway.ListContainersResponse + 17, // 185: gateway.GatewayService.StopContainer:output_type -> gateway.StopContainerResponse + 22, // 186: gateway.GatewayService.AttachToContainer:output_type -> gateway.AttachToContainerResponse + 24, // 187: gateway.GatewayService.StartTask:output_type -> gateway.StartTaskResponse + 26, // 188: gateway.GatewayService.EndTask:output_type -> gateway.EndTaskResponse + 32, // 189: gateway.GatewayService.StopTasks:output_type -> gateway.StopTasksResponse + 30, // 190: gateway.GatewayService.ListTasks:output_type -> gateway.ListTasksResponse + 44, // 191: gateway.GatewayService.GetOrCreateStub:output_type -> gateway.GetOrCreateStubResponse + 46, // 192: gateway.GatewayService.DeployStub:output_type -> gateway.DeployStubResponse + 167, // 193: gateway.GatewayService.GetURL:output_type -> gateway.GetURLResponse + 49, // 194: gateway.GatewayService.ListDeployments:output_type -> gateway.ListDeploymentsResponse + 51, // 195: gateway.GatewayService.StopDeployment:output_type -> gateway.StopDeploymentResponse + 53, // 196: gateway.GatewayService.StartDeployment:output_type -> gateway.StartDeploymentResponse + 55, // 197: gateway.GatewayService.ScaleDeployment:output_type -> gateway.ScaleDeploymentResponse + 57, // 198: gateway.GatewayService.DeleteDeployment:output_type -> gateway.DeleteDeploymentResponse + 60, // 199: gateway.GatewayService.ListPools:output_type -> gateway.ListPoolsResponse + 66, // 200: gateway.GatewayService.ListPoolOffers:output_type -> gateway.ListPoolOffersResponse + 68, // 201: gateway.GatewayService.LaunchPoolCapacity:output_type -> gateway.LaunchPoolCapacityResponse + 70, // 202: gateway.GatewayService.ListPrivatePools:output_type -> gateway.ListPrivatePoolsResponse + 72, // 203: gateway.GatewayService.CreateBYOCPool:output_type -> gateway.CreateBYOCPoolResponse + 75, // 204: gateway.GatewayService.GetBYOCPool:output_type -> gateway.GetBYOCPoolResponse + 77, // 205: gateway.GatewayService.ScaleBYOCPool:output_type -> gateway.ScaleBYOCPoolResponse + 81, // 206: gateway.GatewayService.CreateMarketplaceListing:output_type -> gateway.CreateMarketplaceListingResponse + 83, // 207: gateway.GatewayService.UpdateMarketplaceListing:output_type -> gateway.UpdateMarketplaceListingResponse + 85, // 208: gateway.GatewayService.DeleteMarketplaceListing:output_type -> gateway.DeleteMarketplaceListingResponse + 87, // 209: gateway.GatewayService.ListMarketplaceListings:output_type -> gateway.ListMarketplaceListingsResponse + 89, // 210: gateway.GatewayService.GetMarketplaceJoinCommand:output_type -> gateway.GetMarketplaceJoinCommandResponse + 91, // 211: gateway.GatewayService.ListMarketplaceOffers:output_type -> gateway.ListMarketplaceOffersResponse + 93, // 212: gateway.GatewayService.GetMarketplaceOffer:output_type -> gateway.GetMarketplaceOfferResponse + 96, // 213: gateway.GatewayService.CreateMarketplaceRental:output_type -> gateway.CreateMarketplaceRentalResponse + 98, // 214: gateway.GatewayService.ListMarketplaceRentals:output_type -> gateway.ListMarketplaceRentalsResponse + 100, // 215: gateway.GatewayService.DeleteMarketplaceRental:output_type -> gateway.DeleteMarketplaceRentalResponse + 102, // 216: gateway.GatewayService.LaunchRentalWorkload:output_type -> gateway.LaunchRentalWorkloadResponse + 104, // 217: gateway.GatewayService.ListMarketplaceMachines:output_type -> gateway.ListMarketplaceMachinesResponse + 107, // 218: gateway.GatewayService.ListMachineContainers:output_type -> gateway.ListMachineContainersResponse + 109, // 219: gateway.GatewayService.CreatePool:output_type -> gateway.CreatePoolResponse + 111, // 220: gateway.GatewayService.DeletePool:output_type -> gateway.DeletePoolResponse + 113, // 221: gateway.GatewayService.ExtendPoolCapacity:output_type -> gateway.ExtendPoolCapacityResponse + 115, // 222: gateway.GatewayService.CreatePoolJoinToken:output_type -> gateway.CreatePoolJoinTokenResponse + 117, // 223: gateway.GatewayService.RevokePoolJoinToken:output_type -> gateway.RevokePoolJoinTokenResponse + 119, // 224: gateway.GatewayService.GetPoolJoinCommand:output_type -> gateway.GetPoolJoinCommandResponse + 121, // 225: gateway.GatewayService.ListPoolMachines:output_type -> gateway.ListPoolMachinesResponse + 127, // 226: gateway.GatewayService.JoinAgent:output_type -> gateway.JoinAgentResponse + 131, // 227: gateway.GatewayService.RequestAgentTransportCredential:output_type -> gateway.RequestAgentTransportCredentialResponse + 133, // 228: gateway.GatewayService.CreateNodeEnrollment:output_type -> gateway.CreateNodeEnrollmentResponse + 135, // 229: gateway.GatewayService.DeleteNodeEnrollment:output_type -> gateway.DeleteNodeEnrollmentResponse + 137, // 230: gateway.GatewayService.ListAgentRoutes:output_type -> gateway.ListAgentRoutesResponse + 139, // 231: gateway.GatewayService.UpdateAgentRouteStatus:output_type -> gateway.UpdateAgentRouteStatusResponse + 179, // 232: gateway.GatewayService.UpdateAgentAvailability:output_type -> gateway.UpdateAgentAvailabilityResponse + 142, // 233: gateway.GatewayService.StreamAgent:output_type -> gateway.StreamAgentResponse + 147, // 234: gateway.GatewayService.StreamAgentTelemetry:output_type -> gateway.AgentTelemetryResponse + 152, // 235: gateway.GatewayService.ListMachines:output_type -> gateway.ListMachinesResponse + 154, // 236: gateway.GatewayService.CreateMachine:output_type -> gateway.CreateMachineResponse + 156, // 237: gateway.GatewayService.DeleteMachine:output_type -> gateway.DeleteMachineResponse + 159, // 238: gateway.GatewayService.ListTokens:output_type -> gateway.ListTokensResponse + 161, // 239: gateway.GatewayService.CreateToken:output_type -> gateway.CreateTokenResponse + 163, // 240: gateway.GatewayService.ToggleToken:output_type -> gateway.ToggleTokenResponse + 165, // 241: gateway.GatewayService.DeleteToken:output_type -> gateway.DeleteTokenResponse + 169, // 242: gateway.GatewayService.ListWorkers:output_type -> gateway.ListWorkersResponse + 171, // 243: gateway.GatewayService.CordonWorker:output_type -> gateway.CordonWorkerResponse + 173, // 244: gateway.GatewayService.UncordonWorker:output_type -> gateway.UncordonWorkerResponse + 175, // 245: gateway.GatewayService.DrainWorker:output_type -> gateway.DrainWorkerResponse + 177, // 246: gateway.GatewayService.ExportWorkspaceConfig:output_type -> gateway.ExportWorkspaceConfigResponse + 178, // [178:247] is the sub-list for method output_type + 109, // [109:178] is the sub-list for method input_type 109, // [109:109] is the sub-list for extension type_name 109, // [109:109] is the sub-list for extension extendee 0, // [0:109] is the sub-list for field type_name @@ -16477,2122 +14913,20 @@ func file_gateway_proto_init() { return } file_types_proto_init() - if !protoimpl.UnsafeEnabled { - file_gateway_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthorizeRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthorizeResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignPayloadRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignPayloadResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObjectMetadata); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HeadObjectRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HeadObjectResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateObjectRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateObjectResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutObjectRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutObjectResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncContainerWorkspaceRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncContainerWorkspaceResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListContainersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListContainersResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopContainerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopContainerResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CheckpointContainerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CheckpointContainerResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerStreamMessage); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachToContainerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachToContainerResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartTaskRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartTaskResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EndTaskRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EndTaskResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StringList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTasksRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Task); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTasksResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopTasksRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopTasksResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Volume); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SecretVar); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Autoscaler); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LLMConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseServingConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServingConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DurableDisk); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TaskPolicy); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Schema); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SchemaField); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetOrCreateStubRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetOrCreateStubResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeployStubRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeployStubResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Deployment); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListDeploymentsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListDeploymentsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopDeploymentRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopDeploymentResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartDeploymentRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartDeploymentResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ScaleDeploymentRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ScaleDeploymentResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteDeploymentRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteDeploymentResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Pool); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPoolsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPoolsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PoolConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PoolOffer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProviderInstance); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PrivatePool); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPoolOffersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPoolOffersResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LaunchPoolCapacityRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LaunchPoolCapacityResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPrivatePoolsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPrivatePoolsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateBYOCPoolRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateBYOCPoolResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BYOCPoolState); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBYOCPoolRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBYOCPoolResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ScaleBYOCPoolRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ScaleBYOCPoolResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarketplaceListing); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarketplaceOffer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMarketplaceListingRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMarketplaceListingResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateMarketplaceListingRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateMarketplaceListingResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMarketplaceListingRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMarketplaceListingResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarketplaceListingsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarketplaceListingsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMarketplaceJoinCommandRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMarketplaceJoinCommandResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarketplaceOffersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarketplaceOffersResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMarketplaceOfferRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMarketplaceOfferResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarketplaceRental); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMarketplaceRentalRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMarketplaceRentalResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarketplaceRentalsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarketplaceRentalsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMarketplaceRentalRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMarketplaceRentalResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LaunchRentalWorkloadRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LaunchRentalWorkloadResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarketplaceMachinesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarketplaceMachinesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMachineContainersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MachineContainer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMachineContainersResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreatePoolRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreatePoolResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeletePoolRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeletePoolResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtendPoolCapacityRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtendPoolCapacityResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreatePoolJoinTokenRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreatePoolJoinTokenResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RevokePoolJoinTokenRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RevokePoolJoinTokenResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPoolJoinCommandRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPoolJoinCommandResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPoolMachinesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPoolMachinesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentBootstrapConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentBillingConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentTelemetryConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentTelemetrySinkConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JoinAgentRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JoinAgentResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentPreflightCheck); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentRoute); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RequestAgentTransportCredentialRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RequestAgentTransportCredentialResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAgentRoutesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAgentRoutesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateAgentRouteStatusRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateAgentRouteStatusResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentWorkerSlot); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamAgentRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamAgentResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentLogRecord); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentMetricSnapshot); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentEventRecord); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentTelemetryRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentTelemetryResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Machine); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MachineMetrics); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MachinePathMetrics); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[146].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMachinesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[147].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMachinesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[148].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMachineRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[149].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMachineResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[150].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMachineRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[151].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMachineResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[152].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Token); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[153].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTokensRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[154].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTokensResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[155].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTokenRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[156].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTokenResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[157].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ToggleTokenRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[158].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ToggleTokenResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[159].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteTokenRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[160].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteTokenResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[161].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetURLRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[162].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetURLResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[163].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[164].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkersResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[165].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CordonWorkerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[166].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CordonWorkerResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[167].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UncordonWorkerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[168].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UncordonWorkerResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[169].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DrainWorkerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[170].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DrainWorkerResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[171].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExportWorkspaceConfigRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[172].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExportWorkspaceConfigResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[173].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateAgentAvailabilityRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[174].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateAgentAvailabilityResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_gateway_proto_msgTypes[19].OneofWrappers = []interface{}{ + file_gateway_proto_msgTypes[19].OneofWrappers = []any{ (*ContainerStreamMessage_AttachRequest)(nil), (*ContainerStreamMessage_SyncContainerWorkspace)(nil), } - file_gateway_proto_msgTypes[32].OneofWrappers = []interface{}{} - file_gateway_proto_msgTypes[81].OneofWrappers = []interface{}{} - file_gateway_proto_msgTypes[152].OneofWrappers = []interface{}{} + file_gateway_proto_msgTypes[32].OneofWrappers = []any{} + file_gateway_proto_msgTypes[81].OneofWrappers = []any{} + file_gateway_proto_msgTypes[156].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gateway_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gateway_proto_rawDesc), len(file_gateway_proto_rawDesc)), NumEnums: 1, - NumMessages: 185, + NumMessages: 189, NumExtensions: 0, NumServices: 1, }, @@ -18602,7 +14936,6 @@ func file_gateway_proto_init() { MessageInfos: file_gateway_proto_msgTypes, }.Build() File_gateway_proto = out.File - file_gateway_proto_rawDesc = nil file_gateway_proto_goTypes = nil file_gateway_proto_depIdxs = nil } diff --git a/proto/gateway_grpc.pb.go b/proto/gateway_grpc.pb.go index dc780a008..d7e61a229 100644 --- a/proto/gateway_grpc.pb.go +++ b/proto/gateway_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 +// - protoc-gen-go-grpc v1.6.2 // - protoc v3.21.12 // source: gateway.proto @@ -15,8 +15,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 const ( GatewayService_Authorize_FullMethodName = "/gateway.GatewayService/Authorize" @@ -69,6 +69,8 @@ const ( GatewayService_ListPoolMachines_FullMethodName = "/gateway.GatewayService/ListPoolMachines" GatewayService_JoinAgent_FullMethodName = "/gateway.GatewayService/JoinAgent" GatewayService_RequestAgentTransportCredential_FullMethodName = "/gateway.GatewayService/RequestAgentTransportCredential" + GatewayService_CreateNodeEnrollment_FullMethodName = "/gateway.GatewayService/CreateNodeEnrollment" + GatewayService_DeleteNodeEnrollment_FullMethodName = "/gateway.GatewayService/DeleteNodeEnrollment" GatewayService_ListAgentRoutes_FullMethodName = "/gateway.GatewayService/ListAgentRoutes" GatewayService_UpdateAgentRouteStatus_FullMethodName = "/gateway.GatewayService/UpdateAgentRouteStatus" GatewayService_UpdateAgentAvailability_FullMethodName = "/gateway.GatewayService/UpdateAgentAvailability" @@ -98,12 +100,12 @@ type GatewayServiceClient interface { // Objects HeadObject(ctx context.Context, in *HeadObjectRequest, opts ...grpc.CallOption) (*HeadObjectResponse, error) CreateObject(ctx context.Context, in *CreateObjectRequest, opts ...grpc.CallOption) (*CreateObjectResponse, error) - PutObjectStream(ctx context.Context, opts ...grpc.CallOption) (GatewayService_PutObjectStreamClient, error) + PutObjectStream(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[PutObjectRequest, PutObjectResponse], error) // Containers CheckpointContainer(ctx context.Context, in *CheckpointContainerRequest, opts ...grpc.CallOption) (*CheckpointContainerResponse, error) ListContainers(ctx context.Context, in *ListContainersRequest, opts ...grpc.CallOption) (*ListContainersResponse, error) StopContainer(ctx context.Context, in *StopContainerRequest, opts ...grpc.CallOption) (*StopContainerResponse, error) - AttachToContainer(ctx context.Context, opts ...grpc.CallOption) (GatewayService_AttachToContainerClient, error) + AttachToContainer(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[ContainerStreamMessage, AttachToContainerResponse], error) // Tasks StartTask(ctx context.Context, in *StartTaskRequest, opts ...grpc.CallOption) (*StartTaskResponse, error) EndTask(ctx context.Context, in *EndTaskRequest, opts ...grpc.CallOption) (*EndTaskResponse, error) @@ -150,11 +152,13 @@ type GatewayServiceClient interface { ListPoolMachines(ctx context.Context, in *ListPoolMachinesRequest, opts ...grpc.CallOption) (*ListPoolMachinesResponse, error) JoinAgent(ctx context.Context, in *JoinAgentRequest, opts ...grpc.CallOption) (*JoinAgentResponse, error) RequestAgentTransportCredential(ctx context.Context, in *RequestAgentTransportCredentialRequest, opts ...grpc.CallOption) (*RequestAgentTransportCredentialResponse, error) + CreateNodeEnrollment(ctx context.Context, in *CreateNodeEnrollmentRequest, opts ...grpc.CallOption) (*CreateNodeEnrollmentResponse, error) + DeleteNodeEnrollment(ctx context.Context, in *DeleteNodeEnrollmentRequest, opts ...grpc.CallOption) (*DeleteNodeEnrollmentResponse, error) ListAgentRoutes(ctx context.Context, in *ListAgentRoutesRequest, opts ...grpc.CallOption) (*ListAgentRoutesResponse, error) UpdateAgentRouteStatus(ctx context.Context, in *UpdateAgentRouteStatusRequest, opts ...grpc.CallOption) (*UpdateAgentRouteStatusResponse, error) UpdateAgentAvailability(ctx context.Context, in *UpdateAgentAvailabilityRequest, opts ...grpc.CallOption) (*UpdateAgentAvailabilityResponse, error) - StreamAgent(ctx context.Context, in *StreamAgentRequest, opts ...grpc.CallOption) (GatewayService_StreamAgentClient, error) - StreamAgentTelemetry(ctx context.Context, opts ...grpc.CallOption) (GatewayService_StreamAgentTelemetryClient, error) + StreamAgent(ctx context.Context, in *StreamAgentRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[StreamAgentResponse], error) + StreamAgentTelemetry(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[AgentTelemetryRequest, AgentTelemetryResponse], error) // Machines ListMachines(ctx context.Context, in *ListMachinesRequest, opts ...grpc.CallOption) (*ListMachinesResponse, error) CreateMachine(ctx context.Context, in *CreateMachineRequest, opts ...grpc.CallOption) (*CreateMachineResponse, error) @@ -182,8 +186,9 @@ func NewGatewayServiceClient(cc grpc.ClientConnInterface) GatewayServiceClient { } func (c *gatewayServiceClient) Authorize(ctx context.Context, in *AuthorizeRequest, opts ...grpc.CallOption) (*AuthorizeResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(AuthorizeResponse) - err := c.cc.Invoke(ctx, GatewayService_Authorize_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_Authorize_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -191,8 +196,9 @@ func (c *gatewayServiceClient) Authorize(ctx context.Context, in *AuthorizeReque } func (c *gatewayServiceClient) SignPayload(ctx context.Context, in *SignPayloadRequest, opts ...grpc.CallOption) (*SignPayloadResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(SignPayloadResponse) - err := c.cc.Invoke(ctx, GatewayService_SignPayload_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_SignPayload_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -200,8 +206,9 @@ func (c *gatewayServiceClient) SignPayload(ctx context.Context, in *SignPayloadR } func (c *gatewayServiceClient) HeadObject(ctx context.Context, in *HeadObjectRequest, opts ...grpc.CallOption) (*HeadObjectResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(HeadObjectResponse) - err := c.cc.Invoke(ctx, GatewayService_HeadObject_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_HeadObject_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -209,51 +216,32 @@ func (c *gatewayServiceClient) HeadObject(ctx context.Context, in *HeadObjectReq } func (c *gatewayServiceClient) CreateObject(ctx context.Context, in *CreateObjectRequest, opts ...grpc.CallOption) (*CreateObjectResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CreateObjectResponse) - err := c.cc.Invoke(ctx, GatewayService_CreateObject_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_CreateObject_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *gatewayServiceClient) PutObjectStream(ctx context.Context, opts ...grpc.CallOption) (GatewayService_PutObjectStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &GatewayService_ServiceDesc.Streams[0], GatewayService_PutObjectStream_FullMethodName, opts...) +func (c *gatewayServiceClient) PutObjectStream(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[PutObjectRequest, PutObjectResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &GatewayService_ServiceDesc.Streams[0], GatewayService_PutObjectStream_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &gatewayServicePutObjectStreamClient{stream} + x := &grpc.GenericClientStream[PutObjectRequest, PutObjectResponse]{ClientStream: stream} return x, nil } -type GatewayService_PutObjectStreamClient interface { - Send(*PutObjectRequest) error - CloseAndRecv() (*PutObjectResponse, error) - grpc.ClientStream -} - -type gatewayServicePutObjectStreamClient struct { - grpc.ClientStream -} - -func (x *gatewayServicePutObjectStreamClient) Send(m *PutObjectRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *gatewayServicePutObjectStreamClient) CloseAndRecv() (*PutObjectResponse, error) { - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - m := new(PutObjectResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type GatewayService_PutObjectStreamClient = grpc.ClientStreamingClient[PutObjectRequest, PutObjectResponse] func (c *gatewayServiceClient) CheckpointContainer(ctx context.Context, in *CheckpointContainerRequest, opts ...grpc.CallOption) (*CheckpointContainerResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CheckpointContainerResponse) - err := c.cc.Invoke(ctx, GatewayService_CheckpointContainer_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_CheckpointContainer_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -261,8 +249,9 @@ func (c *gatewayServiceClient) CheckpointContainer(ctx context.Context, in *Chec } func (c *gatewayServiceClient) ListContainers(ctx context.Context, in *ListContainersRequest, opts ...grpc.CallOption) (*ListContainersResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListContainersResponse) - err := c.cc.Invoke(ctx, GatewayService_ListContainers_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ListContainers_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -270,48 +259,32 @@ func (c *gatewayServiceClient) ListContainers(ctx context.Context, in *ListConta } func (c *gatewayServiceClient) StopContainer(ctx context.Context, in *StopContainerRequest, opts ...grpc.CallOption) (*StopContainerResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(StopContainerResponse) - err := c.cc.Invoke(ctx, GatewayService_StopContainer_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_StopContainer_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *gatewayServiceClient) AttachToContainer(ctx context.Context, opts ...grpc.CallOption) (GatewayService_AttachToContainerClient, error) { - stream, err := c.cc.NewStream(ctx, &GatewayService_ServiceDesc.Streams[1], GatewayService_AttachToContainer_FullMethodName, opts...) +func (c *gatewayServiceClient) AttachToContainer(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[ContainerStreamMessage, AttachToContainerResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &GatewayService_ServiceDesc.Streams[1], GatewayService_AttachToContainer_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &gatewayServiceAttachToContainerClient{stream} + x := &grpc.GenericClientStream[ContainerStreamMessage, AttachToContainerResponse]{ClientStream: stream} return x, nil } -type GatewayService_AttachToContainerClient interface { - Send(*ContainerStreamMessage) error - Recv() (*AttachToContainerResponse, error) - grpc.ClientStream -} - -type gatewayServiceAttachToContainerClient struct { - grpc.ClientStream -} - -func (x *gatewayServiceAttachToContainerClient) Send(m *ContainerStreamMessage) error { - return x.ClientStream.SendMsg(m) -} - -func (x *gatewayServiceAttachToContainerClient) Recv() (*AttachToContainerResponse, error) { - m := new(AttachToContainerResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type GatewayService_AttachToContainerClient = grpc.BidiStreamingClient[ContainerStreamMessage, AttachToContainerResponse] func (c *gatewayServiceClient) StartTask(ctx context.Context, in *StartTaskRequest, opts ...grpc.CallOption) (*StartTaskResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(StartTaskResponse) - err := c.cc.Invoke(ctx, GatewayService_StartTask_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_StartTask_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -319,8 +292,9 @@ func (c *gatewayServiceClient) StartTask(ctx context.Context, in *StartTaskReque } func (c *gatewayServiceClient) EndTask(ctx context.Context, in *EndTaskRequest, opts ...grpc.CallOption) (*EndTaskResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(EndTaskResponse) - err := c.cc.Invoke(ctx, GatewayService_EndTask_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_EndTask_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -328,8 +302,9 @@ func (c *gatewayServiceClient) EndTask(ctx context.Context, in *EndTaskRequest, } func (c *gatewayServiceClient) StopTasks(ctx context.Context, in *StopTasksRequest, opts ...grpc.CallOption) (*StopTasksResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(StopTasksResponse) - err := c.cc.Invoke(ctx, GatewayService_StopTasks_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_StopTasks_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -337,8 +312,9 @@ func (c *gatewayServiceClient) StopTasks(ctx context.Context, in *StopTasksReque } func (c *gatewayServiceClient) ListTasks(ctx context.Context, in *ListTasksRequest, opts ...grpc.CallOption) (*ListTasksResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListTasksResponse) - err := c.cc.Invoke(ctx, GatewayService_ListTasks_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ListTasks_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -346,8 +322,9 @@ func (c *gatewayServiceClient) ListTasks(ctx context.Context, in *ListTasksReque } func (c *gatewayServiceClient) GetOrCreateStub(ctx context.Context, in *GetOrCreateStubRequest, opts ...grpc.CallOption) (*GetOrCreateStubResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetOrCreateStubResponse) - err := c.cc.Invoke(ctx, GatewayService_GetOrCreateStub_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_GetOrCreateStub_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -355,8 +332,9 @@ func (c *gatewayServiceClient) GetOrCreateStub(ctx context.Context, in *GetOrCre } func (c *gatewayServiceClient) DeployStub(ctx context.Context, in *DeployStubRequest, opts ...grpc.CallOption) (*DeployStubResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(DeployStubResponse) - err := c.cc.Invoke(ctx, GatewayService_DeployStub_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_DeployStub_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -364,8 +342,9 @@ func (c *gatewayServiceClient) DeployStub(ctx context.Context, in *DeployStubReq } func (c *gatewayServiceClient) GetURL(ctx context.Context, in *GetURLRequest, opts ...grpc.CallOption) (*GetURLResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetURLResponse) - err := c.cc.Invoke(ctx, GatewayService_GetURL_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_GetURL_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -373,8 +352,9 @@ func (c *gatewayServiceClient) GetURL(ctx context.Context, in *GetURLRequest, op } func (c *gatewayServiceClient) ListDeployments(ctx context.Context, in *ListDeploymentsRequest, opts ...grpc.CallOption) (*ListDeploymentsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListDeploymentsResponse) - err := c.cc.Invoke(ctx, GatewayService_ListDeployments_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ListDeployments_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -382,8 +362,9 @@ func (c *gatewayServiceClient) ListDeployments(ctx context.Context, in *ListDepl } func (c *gatewayServiceClient) StopDeployment(ctx context.Context, in *StopDeploymentRequest, opts ...grpc.CallOption) (*StopDeploymentResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(StopDeploymentResponse) - err := c.cc.Invoke(ctx, GatewayService_StopDeployment_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_StopDeployment_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -391,8 +372,9 @@ func (c *gatewayServiceClient) StopDeployment(ctx context.Context, in *StopDeplo } func (c *gatewayServiceClient) StartDeployment(ctx context.Context, in *StartDeploymentRequest, opts ...grpc.CallOption) (*StartDeploymentResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(StartDeploymentResponse) - err := c.cc.Invoke(ctx, GatewayService_StartDeployment_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_StartDeployment_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -400,8 +382,9 @@ func (c *gatewayServiceClient) StartDeployment(ctx context.Context, in *StartDep } func (c *gatewayServiceClient) ScaleDeployment(ctx context.Context, in *ScaleDeploymentRequest, opts ...grpc.CallOption) (*ScaleDeploymentResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ScaleDeploymentResponse) - err := c.cc.Invoke(ctx, GatewayService_ScaleDeployment_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ScaleDeployment_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -409,8 +392,9 @@ func (c *gatewayServiceClient) ScaleDeployment(ctx context.Context, in *ScaleDep } func (c *gatewayServiceClient) DeleteDeployment(ctx context.Context, in *DeleteDeploymentRequest, opts ...grpc.CallOption) (*DeleteDeploymentResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(DeleteDeploymentResponse) - err := c.cc.Invoke(ctx, GatewayService_DeleteDeployment_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_DeleteDeployment_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -418,8 +402,9 @@ func (c *gatewayServiceClient) DeleteDeployment(ctx context.Context, in *DeleteD } func (c *gatewayServiceClient) ListPools(ctx context.Context, in *ListPoolsRequest, opts ...grpc.CallOption) (*ListPoolsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListPoolsResponse) - err := c.cc.Invoke(ctx, GatewayService_ListPools_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ListPools_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -427,8 +412,9 @@ func (c *gatewayServiceClient) ListPools(ctx context.Context, in *ListPoolsReque } func (c *gatewayServiceClient) ListPoolOffers(ctx context.Context, in *ListPoolOffersRequest, opts ...grpc.CallOption) (*ListPoolOffersResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListPoolOffersResponse) - err := c.cc.Invoke(ctx, GatewayService_ListPoolOffers_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ListPoolOffers_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -436,8 +422,9 @@ func (c *gatewayServiceClient) ListPoolOffers(ctx context.Context, in *ListPoolO } func (c *gatewayServiceClient) LaunchPoolCapacity(ctx context.Context, in *LaunchPoolCapacityRequest, opts ...grpc.CallOption) (*LaunchPoolCapacityResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(LaunchPoolCapacityResponse) - err := c.cc.Invoke(ctx, GatewayService_LaunchPoolCapacity_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_LaunchPoolCapacity_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -445,8 +432,9 @@ func (c *gatewayServiceClient) LaunchPoolCapacity(ctx context.Context, in *Launc } func (c *gatewayServiceClient) ListPrivatePools(ctx context.Context, in *ListPrivatePoolsRequest, opts ...grpc.CallOption) (*ListPrivatePoolsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListPrivatePoolsResponse) - err := c.cc.Invoke(ctx, GatewayService_ListPrivatePools_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ListPrivatePools_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -454,8 +442,9 @@ func (c *gatewayServiceClient) ListPrivatePools(ctx context.Context, in *ListPri } func (c *gatewayServiceClient) CreateBYOCPool(ctx context.Context, in *CreateBYOCPoolRequest, opts ...grpc.CallOption) (*CreateBYOCPoolResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CreateBYOCPoolResponse) - err := c.cc.Invoke(ctx, GatewayService_CreateBYOCPool_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_CreateBYOCPool_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -463,8 +452,9 @@ func (c *gatewayServiceClient) CreateBYOCPool(ctx context.Context, in *CreateBYO } func (c *gatewayServiceClient) GetBYOCPool(ctx context.Context, in *GetBYOCPoolRequest, opts ...grpc.CallOption) (*GetBYOCPoolResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetBYOCPoolResponse) - err := c.cc.Invoke(ctx, GatewayService_GetBYOCPool_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_GetBYOCPool_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -472,8 +462,9 @@ func (c *gatewayServiceClient) GetBYOCPool(ctx context.Context, in *GetBYOCPoolR } func (c *gatewayServiceClient) ScaleBYOCPool(ctx context.Context, in *ScaleBYOCPoolRequest, opts ...grpc.CallOption) (*ScaleBYOCPoolResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ScaleBYOCPoolResponse) - err := c.cc.Invoke(ctx, GatewayService_ScaleBYOCPool_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ScaleBYOCPool_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -481,8 +472,9 @@ func (c *gatewayServiceClient) ScaleBYOCPool(ctx context.Context, in *ScaleBYOCP } func (c *gatewayServiceClient) CreateMarketplaceListing(ctx context.Context, in *CreateMarketplaceListingRequest, opts ...grpc.CallOption) (*CreateMarketplaceListingResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CreateMarketplaceListingResponse) - err := c.cc.Invoke(ctx, GatewayService_CreateMarketplaceListing_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_CreateMarketplaceListing_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -490,8 +482,9 @@ func (c *gatewayServiceClient) CreateMarketplaceListing(ctx context.Context, in } func (c *gatewayServiceClient) UpdateMarketplaceListing(ctx context.Context, in *UpdateMarketplaceListingRequest, opts ...grpc.CallOption) (*UpdateMarketplaceListingResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(UpdateMarketplaceListingResponse) - err := c.cc.Invoke(ctx, GatewayService_UpdateMarketplaceListing_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_UpdateMarketplaceListing_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -499,8 +492,9 @@ func (c *gatewayServiceClient) UpdateMarketplaceListing(ctx context.Context, in } func (c *gatewayServiceClient) DeleteMarketplaceListing(ctx context.Context, in *DeleteMarketplaceListingRequest, opts ...grpc.CallOption) (*DeleteMarketplaceListingResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(DeleteMarketplaceListingResponse) - err := c.cc.Invoke(ctx, GatewayService_DeleteMarketplaceListing_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_DeleteMarketplaceListing_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -508,8 +502,9 @@ func (c *gatewayServiceClient) DeleteMarketplaceListing(ctx context.Context, in } func (c *gatewayServiceClient) ListMarketplaceListings(ctx context.Context, in *ListMarketplaceListingsRequest, opts ...grpc.CallOption) (*ListMarketplaceListingsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListMarketplaceListingsResponse) - err := c.cc.Invoke(ctx, GatewayService_ListMarketplaceListings_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ListMarketplaceListings_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -517,8 +512,9 @@ func (c *gatewayServiceClient) ListMarketplaceListings(ctx context.Context, in * } func (c *gatewayServiceClient) GetMarketplaceJoinCommand(ctx context.Context, in *GetMarketplaceJoinCommandRequest, opts ...grpc.CallOption) (*GetMarketplaceJoinCommandResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetMarketplaceJoinCommandResponse) - err := c.cc.Invoke(ctx, GatewayService_GetMarketplaceJoinCommand_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_GetMarketplaceJoinCommand_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -526,8 +522,9 @@ func (c *gatewayServiceClient) GetMarketplaceJoinCommand(ctx context.Context, in } func (c *gatewayServiceClient) ListMarketplaceOffers(ctx context.Context, in *ListMarketplaceOffersRequest, opts ...grpc.CallOption) (*ListMarketplaceOffersResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListMarketplaceOffersResponse) - err := c.cc.Invoke(ctx, GatewayService_ListMarketplaceOffers_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ListMarketplaceOffers_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -535,8 +532,9 @@ func (c *gatewayServiceClient) ListMarketplaceOffers(ctx context.Context, in *Li } func (c *gatewayServiceClient) GetMarketplaceOffer(ctx context.Context, in *GetMarketplaceOfferRequest, opts ...grpc.CallOption) (*GetMarketplaceOfferResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetMarketplaceOfferResponse) - err := c.cc.Invoke(ctx, GatewayService_GetMarketplaceOffer_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_GetMarketplaceOffer_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -544,8 +542,9 @@ func (c *gatewayServiceClient) GetMarketplaceOffer(ctx context.Context, in *GetM } func (c *gatewayServiceClient) CreateMarketplaceRental(ctx context.Context, in *CreateMarketplaceRentalRequest, opts ...grpc.CallOption) (*CreateMarketplaceRentalResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CreateMarketplaceRentalResponse) - err := c.cc.Invoke(ctx, GatewayService_CreateMarketplaceRental_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_CreateMarketplaceRental_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -553,8 +552,9 @@ func (c *gatewayServiceClient) CreateMarketplaceRental(ctx context.Context, in * } func (c *gatewayServiceClient) ListMarketplaceRentals(ctx context.Context, in *ListMarketplaceRentalsRequest, opts ...grpc.CallOption) (*ListMarketplaceRentalsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListMarketplaceRentalsResponse) - err := c.cc.Invoke(ctx, GatewayService_ListMarketplaceRentals_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ListMarketplaceRentals_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -562,8 +562,9 @@ func (c *gatewayServiceClient) ListMarketplaceRentals(ctx context.Context, in *L } func (c *gatewayServiceClient) DeleteMarketplaceRental(ctx context.Context, in *DeleteMarketplaceRentalRequest, opts ...grpc.CallOption) (*DeleteMarketplaceRentalResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(DeleteMarketplaceRentalResponse) - err := c.cc.Invoke(ctx, GatewayService_DeleteMarketplaceRental_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_DeleteMarketplaceRental_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -571,8 +572,9 @@ func (c *gatewayServiceClient) DeleteMarketplaceRental(ctx context.Context, in * } func (c *gatewayServiceClient) LaunchRentalWorkload(ctx context.Context, in *LaunchRentalWorkloadRequest, opts ...grpc.CallOption) (*LaunchRentalWorkloadResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(LaunchRentalWorkloadResponse) - err := c.cc.Invoke(ctx, GatewayService_LaunchRentalWorkload_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_LaunchRentalWorkload_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -580,8 +582,9 @@ func (c *gatewayServiceClient) LaunchRentalWorkload(ctx context.Context, in *Lau } func (c *gatewayServiceClient) ListMarketplaceMachines(ctx context.Context, in *ListMarketplaceMachinesRequest, opts ...grpc.CallOption) (*ListMarketplaceMachinesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListMarketplaceMachinesResponse) - err := c.cc.Invoke(ctx, GatewayService_ListMarketplaceMachines_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ListMarketplaceMachines_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -589,8 +592,9 @@ func (c *gatewayServiceClient) ListMarketplaceMachines(ctx context.Context, in * } func (c *gatewayServiceClient) ListMachineContainers(ctx context.Context, in *ListMachineContainersRequest, opts ...grpc.CallOption) (*ListMachineContainersResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListMachineContainersResponse) - err := c.cc.Invoke(ctx, GatewayService_ListMachineContainers_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ListMachineContainers_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -598,8 +602,9 @@ func (c *gatewayServiceClient) ListMachineContainers(ctx context.Context, in *Li } func (c *gatewayServiceClient) CreatePool(ctx context.Context, in *CreatePoolRequest, opts ...grpc.CallOption) (*CreatePoolResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CreatePoolResponse) - err := c.cc.Invoke(ctx, GatewayService_CreatePool_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_CreatePool_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -607,8 +612,9 @@ func (c *gatewayServiceClient) CreatePool(ctx context.Context, in *CreatePoolReq } func (c *gatewayServiceClient) DeletePool(ctx context.Context, in *DeletePoolRequest, opts ...grpc.CallOption) (*DeletePoolResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(DeletePoolResponse) - err := c.cc.Invoke(ctx, GatewayService_DeletePool_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_DeletePool_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -616,8 +622,9 @@ func (c *gatewayServiceClient) DeletePool(ctx context.Context, in *DeletePoolReq } func (c *gatewayServiceClient) ExtendPoolCapacity(ctx context.Context, in *ExtendPoolCapacityRequest, opts ...grpc.CallOption) (*ExtendPoolCapacityResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ExtendPoolCapacityResponse) - err := c.cc.Invoke(ctx, GatewayService_ExtendPoolCapacity_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ExtendPoolCapacity_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -625,8 +632,9 @@ func (c *gatewayServiceClient) ExtendPoolCapacity(ctx context.Context, in *Exten } func (c *gatewayServiceClient) CreatePoolJoinToken(ctx context.Context, in *CreatePoolJoinTokenRequest, opts ...grpc.CallOption) (*CreatePoolJoinTokenResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CreatePoolJoinTokenResponse) - err := c.cc.Invoke(ctx, GatewayService_CreatePoolJoinToken_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_CreatePoolJoinToken_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -634,8 +642,9 @@ func (c *gatewayServiceClient) CreatePoolJoinToken(ctx context.Context, in *Crea } func (c *gatewayServiceClient) RevokePoolJoinToken(ctx context.Context, in *RevokePoolJoinTokenRequest, opts ...grpc.CallOption) (*RevokePoolJoinTokenResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(RevokePoolJoinTokenResponse) - err := c.cc.Invoke(ctx, GatewayService_RevokePoolJoinToken_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_RevokePoolJoinToken_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -643,8 +652,9 @@ func (c *gatewayServiceClient) RevokePoolJoinToken(ctx context.Context, in *Revo } func (c *gatewayServiceClient) GetPoolJoinCommand(ctx context.Context, in *GetPoolJoinCommandRequest, opts ...grpc.CallOption) (*GetPoolJoinCommandResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetPoolJoinCommandResponse) - err := c.cc.Invoke(ctx, GatewayService_GetPoolJoinCommand_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_GetPoolJoinCommand_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -652,8 +662,9 @@ func (c *gatewayServiceClient) GetPoolJoinCommand(ctx context.Context, in *GetPo } func (c *gatewayServiceClient) ListPoolMachines(ctx context.Context, in *ListPoolMachinesRequest, opts ...grpc.CallOption) (*ListPoolMachinesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListPoolMachinesResponse) - err := c.cc.Invoke(ctx, GatewayService_ListPoolMachines_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ListPoolMachines_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -661,8 +672,9 @@ func (c *gatewayServiceClient) ListPoolMachines(ctx context.Context, in *ListPoo } func (c *gatewayServiceClient) JoinAgent(ctx context.Context, in *JoinAgentRequest, opts ...grpc.CallOption) (*JoinAgentResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(JoinAgentResponse) - err := c.cc.Invoke(ctx, GatewayService_JoinAgent_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_JoinAgent_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -670,8 +682,29 @@ func (c *gatewayServiceClient) JoinAgent(ctx context.Context, in *JoinAgentReque } func (c *gatewayServiceClient) RequestAgentTransportCredential(ctx context.Context, in *RequestAgentTransportCredentialRequest, opts ...grpc.CallOption) (*RequestAgentTransportCredentialResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(RequestAgentTransportCredentialResponse) - err := c.cc.Invoke(ctx, GatewayService_RequestAgentTransportCredential_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_RequestAgentTransportCredential_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *gatewayServiceClient) CreateNodeEnrollment(ctx context.Context, in *CreateNodeEnrollmentRequest, opts ...grpc.CallOption) (*CreateNodeEnrollmentResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateNodeEnrollmentResponse) + err := c.cc.Invoke(ctx, GatewayService_CreateNodeEnrollment_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *gatewayServiceClient) DeleteNodeEnrollment(ctx context.Context, in *DeleteNodeEnrollmentRequest, opts ...grpc.CallOption) (*DeleteNodeEnrollmentResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteNodeEnrollmentResponse) + err := c.cc.Invoke(ctx, GatewayService_DeleteNodeEnrollment_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -679,8 +712,9 @@ func (c *gatewayServiceClient) RequestAgentTransportCredential(ctx context.Conte } func (c *gatewayServiceClient) ListAgentRoutes(ctx context.Context, in *ListAgentRoutesRequest, opts ...grpc.CallOption) (*ListAgentRoutesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListAgentRoutesResponse) - err := c.cc.Invoke(ctx, GatewayService_ListAgentRoutes_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ListAgentRoutes_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -688,8 +722,9 @@ func (c *gatewayServiceClient) ListAgentRoutes(ctx context.Context, in *ListAgen } func (c *gatewayServiceClient) UpdateAgentRouteStatus(ctx context.Context, in *UpdateAgentRouteStatusRequest, opts ...grpc.CallOption) (*UpdateAgentRouteStatusResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(UpdateAgentRouteStatusResponse) - err := c.cc.Invoke(ctx, GatewayService_UpdateAgentRouteStatus_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_UpdateAgentRouteStatus_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -697,20 +732,22 @@ func (c *gatewayServiceClient) UpdateAgentRouteStatus(ctx context.Context, in *U } func (c *gatewayServiceClient) UpdateAgentAvailability(ctx context.Context, in *UpdateAgentAvailabilityRequest, opts ...grpc.CallOption) (*UpdateAgentAvailabilityResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(UpdateAgentAvailabilityResponse) - err := c.cc.Invoke(ctx, GatewayService_UpdateAgentAvailability_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_UpdateAgentAvailability_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *gatewayServiceClient) StreamAgent(ctx context.Context, in *StreamAgentRequest, opts ...grpc.CallOption) (GatewayService_StreamAgentClient, error) { - stream, err := c.cc.NewStream(ctx, &GatewayService_ServiceDesc.Streams[2], GatewayService_StreamAgent_FullMethodName, opts...) +func (c *gatewayServiceClient) StreamAgent(ctx context.Context, in *StreamAgentRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[StreamAgentResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &GatewayService_ServiceDesc.Streams[2], GatewayService_StreamAgent_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &gatewayServiceStreamAgentClient{stream} + x := &grpc.GenericClientStream[StreamAgentRequest, StreamAgentResponse]{ClientStream: stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -720,60 +757,26 @@ func (c *gatewayServiceClient) StreamAgent(ctx context.Context, in *StreamAgentR return x, nil } -type GatewayService_StreamAgentClient interface { - Recv() (*StreamAgentResponse, error) - grpc.ClientStream -} - -type gatewayServiceStreamAgentClient struct { - grpc.ClientStream -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type GatewayService_StreamAgentClient = grpc.ServerStreamingClient[StreamAgentResponse] -func (x *gatewayServiceStreamAgentClient) Recv() (*StreamAgentResponse, error) { - m := new(StreamAgentResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *gatewayServiceClient) StreamAgentTelemetry(ctx context.Context, opts ...grpc.CallOption) (GatewayService_StreamAgentTelemetryClient, error) { - stream, err := c.cc.NewStream(ctx, &GatewayService_ServiceDesc.Streams[3], GatewayService_StreamAgentTelemetry_FullMethodName, opts...) +func (c *gatewayServiceClient) StreamAgentTelemetry(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[AgentTelemetryRequest, AgentTelemetryResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &GatewayService_ServiceDesc.Streams[3], GatewayService_StreamAgentTelemetry_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &gatewayServiceStreamAgentTelemetryClient{stream} + x := &grpc.GenericClientStream[AgentTelemetryRequest, AgentTelemetryResponse]{ClientStream: stream} return x, nil } -type GatewayService_StreamAgentTelemetryClient interface { - Send(*AgentTelemetryRequest) error - CloseAndRecv() (*AgentTelemetryResponse, error) - grpc.ClientStream -} - -type gatewayServiceStreamAgentTelemetryClient struct { - grpc.ClientStream -} - -func (x *gatewayServiceStreamAgentTelemetryClient) Send(m *AgentTelemetryRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *gatewayServiceStreamAgentTelemetryClient) CloseAndRecv() (*AgentTelemetryResponse, error) { - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - m := new(AgentTelemetryResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type GatewayService_StreamAgentTelemetryClient = grpc.ClientStreamingClient[AgentTelemetryRequest, AgentTelemetryResponse] func (c *gatewayServiceClient) ListMachines(ctx context.Context, in *ListMachinesRequest, opts ...grpc.CallOption) (*ListMachinesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListMachinesResponse) - err := c.cc.Invoke(ctx, GatewayService_ListMachines_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ListMachines_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -781,8 +784,9 @@ func (c *gatewayServiceClient) ListMachines(ctx context.Context, in *ListMachine } func (c *gatewayServiceClient) CreateMachine(ctx context.Context, in *CreateMachineRequest, opts ...grpc.CallOption) (*CreateMachineResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CreateMachineResponse) - err := c.cc.Invoke(ctx, GatewayService_CreateMachine_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_CreateMachine_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -790,8 +794,9 @@ func (c *gatewayServiceClient) CreateMachine(ctx context.Context, in *CreateMach } func (c *gatewayServiceClient) DeleteMachine(ctx context.Context, in *DeleteMachineRequest, opts ...grpc.CallOption) (*DeleteMachineResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(DeleteMachineResponse) - err := c.cc.Invoke(ctx, GatewayService_DeleteMachine_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_DeleteMachine_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -799,8 +804,9 @@ func (c *gatewayServiceClient) DeleteMachine(ctx context.Context, in *DeleteMach } func (c *gatewayServiceClient) ListTokens(ctx context.Context, in *ListTokensRequest, opts ...grpc.CallOption) (*ListTokensResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListTokensResponse) - err := c.cc.Invoke(ctx, GatewayService_ListTokens_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ListTokens_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -808,8 +814,9 @@ func (c *gatewayServiceClient) ListTokens(ctx context.Context, in *ListTokensReq } func (c *gatewayServiceClient) CreateToken(ctx context.Context, in *CreateTokenRequest, opts ...grpc.CallOption) (*CreateTokenResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CreateTokenResponse) - err := c.cc.Invoke(ctx, GatewayService_CreateToken_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_CreateToken_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -817,8 +824,9 @@ func (c *gatewayServiceClient) CreateToken(ctx context.Context, in *CreateTokenR } func (c *gatewayServiceClient) ToggleToken(ctx context.Context, in *ToggleTokenRequest, opts ...grpc.CallOption) (*ToggleTokenResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ToggleTokenResponse) - err := c.cc.Invoke(ctx, GatewayService_ToggleToken_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ToggleToken_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -826,8 +834,9 @@ func (c *gatewayServiceClient) ToggleToken(ctx context.Context, in *ToggleTokenR } func (c *gatewayServiceClient) DeleteToken(ctx context.Context, in *DeleteTokenRequest, opts ...grpc.CallOption) (*DeleteTokenResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(DeleteTokenResponse) - err := c.cc.Invoke(ctx, GatewayService_DeleteToken_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_DeleteToken_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -835,8 +844,9 @@ func (c *gatewayServiceClient) DeleteToken(ctx context.Context, in *DeleteTokenR } func (c *gatewayServiceClient) ListWorkers(ctx context.Context, in *ListWorkersRequest, opts ...grpc.CallOption) (*ListWorkersResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ListWorkersResponse) - err := c.cc.Invoke(ctx, GatewayService_ListWorkers_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ListWorkers_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -844,8 +854,9 @@ func (c *gatewayServiceClient) ListWorkers(ctx context.Context, in *ListWorkersR } func (c *gatewayServiceClient) CordonWorker(ctx context.Context, in *CordonWorkerRequest, opts ...grpc.CallOption) (*CordonWorkerResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CordonWorkerResponse) - err := c.cc.Invoke(ctx, GatewayService_CordonWorker_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_CordonWorker_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -853,8 +864,9 @@ func (c *gatewayServiceClient) CordonWorker(ctx context.Context, in *CordonWorke } func (c *gatewayServiceClient) UncordonWorker(ctx context.Context, in *UncordonWorkerRequest, opts ...grpc.CallOption) (*UncordonWorkerResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(UncordonWorkerResponse) - err := c.cc.Invoke(ctx, GatewayService_UncordonWorker_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_UncordonWorker_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -862,8 +874,9 @@ func (c *gatewayServiceClient) UncordonWorker(ctx context.Context, in *UncordonW } func (c *gatewayServiceClient) DrainWorker(ctx context.Context, in *DrainWorkerRequest, opts ...grpc.CallOption) (*DrainWorkerResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(DrainWorkerResponse) - err := c.cc.Invoke(ctx, GatewayService_DrainWorker_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_DrainWorker_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -871,8 +884,9 @@ func (c *gatewayServiceClient) DrainWorker(ctx context.Context, in *DrainWorkerR } func (c *gatewayServiceClient) ExportWorkspaceConfig(ctx context.Context, in *ExportWorkspaceConfigRequest, opts ...grpc.CallOption) (*ExportWorkspaceConfigResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ExportWorkspaceConfigResponse) - err := c.cc.Invoke(ctx, GatewayService_ExportWorkspaceConfig_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, GatewayService_ExportWorkspaceConfig_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -881,7 +895,7 @@ func (c *gatewayServiceClient) ExportWorkspaceConfig(ctx context.Context, in *Ex // GatewayServiceServer is the server API for GatewayService service. // All implementations must embed UnimplementedGatewayServiceServer -// for forward compatibility +// for forward compatibility. type GatewayServiceServer interface { // Auth Authorize(context.Context, *AuthorizeRequest) (*AuthorizeResponse, error) @@ -889,12 +903,12 @@ type GatewayServiceServer interface { // Objects HeadObject(context.Context, *HeadObjectRequest) (*HeadObjectResponse, error) CreateObject(context.Context, *CreateObjectRequest) (*CreateObjectResponse, error) - PutObjectStream(GatewayService_PutObjectStreamServer) error + PutObjectStream(grpc.ClientStreamingServer[PutObjectRequest, PutObjectResponse]) error // Containers CheckpointContainer(context.Context, *CheckpointContainerRequest) (*CheckpointContainerResponse, error) ListContainers(context.Context, *ListContainersRequest) (*ListContainersResponse, error) StopContainer(context.Context, *StopContainerRequest) (*StopContainerResponse, error) - AttachToContainer(GatewayService_AttachToContainerServer) error + AttachToContainer(grpc.BidiStreamingServer[ContainerStreamMessage, AttachToContainerResponse]) error // Tasks StartTask(context.Context, *StartTaskRequest) (*StartTaskResponse, error) EndTask(context.Context, *EndTaskRequest) (*EndTaskResponse, error) @@ -941,11 +955,13 @@ type GatewayServiceServer interface { ListPoolMachines(context.Context, *ListPoolMachinesRequest) (*ListPoolMachinesResponse, error) JoinAgent(context.Context, *JoinAgentRequest) (*JoinAgentResponse, error) RequestAgentTransportCredential(context.Context, *RequestAgentTransportCredentialRequest) (*RequestAgentTransportCredentialResponse, error) + CreateNodeEnrollment(context.Context, *CreateNodeEnrollmentRequest) (*CreateNodeEnrollmentResponse, error) + DeleteNodeEnrollment(context.Context, *DeleteNodeEnrollmentRequest) (*DeleteNodeEnrollmentResponse, error) ListAgentRoutes(context.Context, *ListAgentRoutesRequest) (*ListAgentRoutesResponse, error) UpdateAgentRouteStatus(context.Context, *UpdateAgentRouteStatusRequest) (*UpdateAgentRouteStatusResponse, error) UpdateAgentAvailability(context.Context, *UpdateAgentAvailabilityRequest) (*UpdateAgentAvailabilityResponse, error) - StreamAgent(*StreamAgentRequest, GatewayService_StreamAgentServer) error - StreamAgentTelemetry(GatewayService_StreamAgentTelemetryServer) error + StreamAgent(*StreamAgentRequest, grpc.ServerStreamingServer[StreamAgentResponse]) error + StreamAgentTelemetry(grpc.ClientStreamingServer[AgentTelemetryRequest, AgentTelemetryResponse]) error // Machines ListMachines(context.Context, *ListMachinesRequest) (*ListMachinesResponse, error) CreateMachine(context.Context, *CreateMachineRequest) (*CreateMachineResponse, error) @@ -965,212 +981,222 @@ type GatewayServiceServer interface { mustEmbedUnimplementedGatewayServiceServer() } -// UnimplementedGatewayServiceServer must be embedded to have forward compatible implementations. -type UnimplementedGatewayServiceServer struct { -} +// UnimplementedGatewayServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedGatewayServiceServer struct{} func (UnimplementedGatewayServiceServer) Authorize(context.Context, *AuthorizeRequest) (*AuthorizeResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Authorize not implemented") + return nil, status.Error(codes.Unimplemented, "method Authorize not implemented") } func (UnimplementedGatewayServiceServer) SignPayload(context.Context, *SignPayloadRequest) (*SignPayloadResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method SignPayload not implemented") + return nil, status.Error(codes.Unimplemented, "method SignPayload not implemented") } func (UnimplementedGatewayServiceServer) HeadObject(context.Context, *HeadObjectRequest) (*HeadObjectResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method HeadObject not implemented") + return nil, status.Error(codes.Unimplemented, "method HeadObject not implemented") } func (UnimplementedGatewayServiceServer) CreateObject(context.Context, *CreateObjectRequest) (*CreateObjectResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateObject not implemented") + return nil, status.Error(codes.Unimplemented, "method CreateObject not implemented") } -func (UnimplementedGatewayServiceServer) PutObjectStream(GatewayService_PutObjectStreamServer) error { - return status.Errorf(codes.Unimplemented, "method PutObjectStream not implemented") +func (UnimplementedGatewayServiceServer) PutObjectStream(grpc.ClientStreamingServer[PutObjectRequest, PutObjectResponse]) error { + return status.Error(codes.Unimplemented, "method PutObjectStream not implemented") } func (UnimplementedGatewayServiceServer) CheckpointContainer(context.Context, *CheckpointContainerRequest) (*CheckpointContainerResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CheckpointContainer not implemented") + return nil, status.Error(codes.Unimplemented, "method CheckpointContainer not implemented") } func (UnimplementedGatewayServiceServer) ListContainers(context.Context, *ListContainersRequest) (*ListContainersResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListContainers not implemented") + return nil, status.Error(codes.Unimplemented, "method ListContainers not implemented") } func (UnimplementedGatewayServiceServer) StopContainer(context.Context, *StopContainerRequest) (*StopContainerResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method StopContainer not implemented") + return nil, status.Error(codes.Unimplemented, "method StopContainer not implemented") } -func (UnimplementedGatewayServiceServer) AttachToContainer(GatewayService_AttachToContainerServer) error { - return status.Errorf(codes.Unimplemented, "method AttachToContainer not implemented") +func (UnimplementedGatewayServiceServer) AttachToContainer(grpc.BidiStreamingServer[ContainerStreamMessage, AttachToContainerResponse]) error { + return status.Error(codes.Unimplemented, "method AttachToContainer not implemented") } func (UnimplementedGatewayServiceServer) StartTask(context.Context, *StartTaskRequest) (*StartTaskResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method StartTask not implemented") + return nil, status.Error(codes.Unimplemented, "method StartTask not implemented") } func (UnimplementedGatewayServiceServer) EndTask(context.Context, *EndTaskRequest) (*EndTaskResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method EndTask not implemented") + return nil, status.Error(codes.Unimplemented, "method EndTask not implemented") } func (UnimplementedGatewayServiceServer) StopTasks(context.Context, *StopTasksRequest) (*StopTasksResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method StopTasks not implemented") + return nil, status.Error(codes.Unimplemented, "method StopTasks not implemented") } func (UnimplementedGatewayServiceServer) ListTasks(context.Context, *ListTasksRequest) (*ListTasksResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListTasks not implemented") + return nil, status.Error(codes.Unimplemented, "method ListTasks not implemented") } func (UnimplementedGatewayServiceServer) GetOrCreateStub(context.Context, *GetOrCreateStubRequest) (*GetOrCreateStubResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetOrCreateStub not implemented") + return nil, status.Error(codes.Unimplemented, "method GetOrCreateStub not implemented") } func (UnimplementedGatewayServiceServer) DeployStub(context.Context, *DeployStubRequest) (*DeployStubResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeployStub not implemented") + return nil, status.Error(codes.Unimplemented, "method DeployStub not implemented") } func (UnimplementedGatewayServiceServer) GetURL(context.Context, *GetURLRequest) (*GetURLResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetURL not implemented") + return nil, status.Error(codes.Unimplemented, "method GetURL not implemented") } func (UnimplementedGatewayServiceServer) ListDeployments(context.Context, *ListDeploymentsRequest) (*ListDeploymentsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListDeployments not implemented") + return nil, status.Error(codes.Unimplemented, "method ListDeployments not implemented") } func (UnimplementedGatewayServiceServer) StopDeployment(context.Context, *StopDeploymentRequest) (*StopDeploymentResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method StopDeployment not implemented") + return nil, status.Error(codes.Unimplemented, "method StopDeployment not implemented") } func (UnimplementedGatewayServiceServer) StartDeployment(context.Context, *StartDeploymentRequest) (*StartDeploymentResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method StartDeployment not implemented") + return nil, status.Error(codes.Unimplemented, "method StartDeployment not implemented") } func (UnimplementedGatewayServiceServer) ScaleDeployment(context.Context, *ScaleDeploymentRequest) (*ScaleDeploymentResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ScaleDeployment not implemented") + return nil, status.Error(codes.Unimplemented, "method ScaleDeployment not implemented") } func (UnimplementedGatewayServiceServer) DeleteDeployment(context.Context, *DeleteDeploymentRequest) (*DeleteDeploymentResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteDeployment not implemented") + return nil, status.Error(codes.Unimplemented, "method DeleteDeployment not implemented") } func (UnimplementedGatewayServiceServer) ListPools(context.Context, *ListPoolsRequest) (*ListPoolsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListPools not implemented") + return nil, status.Error(codes.Unimplemented, "method ListPools not implemented") } func (UnimplementedGatewayServiceServer) ListPoolOffers(context.Context, *ListPoolOffersRequest) (*ListPoolOffersResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListPoolOffers not implemented") + return nil, status.Error(codes.Unimplemented, "method ListPoolOffers not implemented") } func (UnimplementedGatewayServiceServer) LaunchPoolCapacity(context.Context, *LaunchPoolCapacityRequest) (*LaunchPoolCapacityResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method LaunchPoolCapacity not implemented") + return nil, status.Error(codes.Unimplemented, "method LaunchPoolCapacity not implemented") } func (UnimplementedGatewayServiceServer) ListPrivatePools(context.Context, *ListPrivatePoolsRequest) (*ListPrivatePoolsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListPrivatePools not implemented") + return nil, status.Error(codes.Unimplemented, "method ListPrivatePools not implemented") } func (UnimplementedGatewayServiceServer) CreateBYOCPool(context.Context, *CreateBYOCPoolRequest) (*CreateBYOCPoolResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateBYOCPool not implemented") + return nil, status.Error(codes.Unimplemented, "method CreateBYOCPool not implemented") } func (UnimplementedGatewayServiceServer) GetBYOCPool(context.Context, *GetBYOCPoolRequest) (*GetBYOCPoolResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetBYOCPool not implemented") + return nil, status.Error(codes.Unimplemented, "method GetBYOCPool not implemented") } func (UnimplementedGatewayServiceServer) ScaleBYOCPool(context.Context, *ScaleBYOCPoolRequest) (*ScaleBYOCPoolResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ScaleBYOCPool not implemented") + return nil, status.Error(codes.Unimplemented, "method ScaleBYOCPool not implemented") } func (UnimplementedGatewayServiceServer) CreateMarketplaceListing(context.Context, *CreateMarketplaceListingRequest) (*CreateMarketplaceListingResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateMarketplaceListing not implemented") + return nil, status.Error(codes.Unimplemented, "method CreateMarketplaceListing not implemented") } func (UnimplementedGatewayServiceServer) UpdateMarketplaceListing(context.Context, *UpdateMarketplaceListingRequest) (*UpdateMarketplaceListingResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateMarketplaceListing not implemented") + return nil, status.Error(codes.Unimplemented, "method UpdateMarketplaceListing not implemented") } func (UnimplementedGatewayServiceServer) DeleteMarketplaceListing(context.Context, *DeleteMarketplaceListingRequest) (*DeleteMarketplaceListingResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteMarketplaceListing not implemented") + return nil, status.Error(codes.Unimplemented, "method DeleteMarketplaceListing not implemented") } func (UnimplementedGatewayServiceServer) ListMarketplaceListings(context.Context, *ListMarketplaceListingsRequest) (*ListMarketplaceListingsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListMarketplaceListings not implemented") + return nil, status.Error(codes.Unimplemented, "method ListMarketplaceListings not implemented") } func (UnimplementedGatewayServiceServer) GetMarketplaceJoinCommand(context.Context, *GetMarketplaceJoinCommandRequest) (*GetMarketplaceJoinCommandResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetMarketplaceJoinCommand not implemented") + return nil, status.Error(codes.Unimplemented, "method GetMarketplaceJoinCommand not implemented") } func (UnimplementedGatewayServiceServer) ListMarketplaceOffers(context.Context, *ListMarketplaceOffersRequest) (*ListMarketplaceOffersResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListMarketplaceOffers not implemented") + return nil, status.Error(codes.Unimplemented, "method ListMarketplaceOffers not implemented") } func (UnimplementedGatewayServiceServer) GetMarketplaceOffer(context.Context, *GetMarketplaceOfferRequest) (*GetMarketplaceOfferResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetMarketplaceOffer not implemented") + return nil, status.Error(codes.Unimplemented, "method GetMarketplaceOffer not implemented") } func (UnimplementedGatewayServiceServer) CreateMarketplaceRental(context.Context, *CreateMarketplaceRentalRequest) (*CreateMarketplaceRentalResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateMarketplaceRental not implemented") + return nil, status.Error(codes.Unimplemented, "method CreateMarketplaceRental not implemented") } func (UnimplementedGatewayServiceServer) ListMarketplaceRentals(context.Context, *ListMarketplaceRentalsRequest) (*ListMarketplaceRentalsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListMarketplaceRentals not implemented") + return nil, status.Error(codes.Unimplemented, "method ListMarketplaceRentals not implemented") } func (UnimplementedGatewayServiceServer) DeleteMarketplaceRental(context.Context, *DeleteMarketplaceRentalRequest) (*DeleteMarketplaceRentalResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteMarketplaceRental not implemented") + return nil, status.Error(codes.Unimplemented, "method DeleteMarketplaceRental not implemented") } func (UnimplementedGatewayServiceServer) LaunchRentalWorkload(context.Context, *LaunchRentalWorkloadRequest) (*LaunchRentalWorkloadResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method LaunchRentalWorkload not implemented") + return nil, status.Error(codes.Unimplemented, "method LaunchRentalWorkload not implemented") } func (UnimplementedGatewayServiceServer) ListMarketplaceMachines(context.Context, *ListMarketplaceMachinesRequest) (*ListMarketplaceMachinesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListMarketplaceMachines not implemented") + return nil, status.Error(codes.Unimplemented, "method ListMarketplaceMachines not implemented") } func (UnimplementedGatewayServiceServer) ListMachineContainers(context.Context, *ListMachineContainersRequest) (*ListMachineContainersResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListMachineContainers not implemented") + return nil, status.Error(codes.Unimplemented, "method ListMachineContainers not implemented") } func (UnimplementedGatewayServiceServer) CreatePool(context.Context, *CreatePoolRequest) (*CreatePoolResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreatePool not implemented") + return nil, status.Error(codes.Unimplemented, "method CreatePool not implemented") } func (UnimplementedGatewayServiceServer) DeletePool(context.Context, *DeletePoolRequest) (*DeletePoolResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeletePool not implemented") + return nil, status.Error(codes.Unimplemented, "method DeletePool not implemented") } func (UnimplementedGatewayServiceServer) ExtendPoolCapacity(context.Context, *ExtendPoolCapacityRequest) (*ExtendPoolCapacityResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ExtendPoolCapacity not implemented") + return nil, status.Error(codes.Unimplemented, "method ExtendPoolCapacity not implemented") } func (UnimplementedGatewayServiceServer) CreatePoolJoinToken(context.Context, *CreatePoolJoinTokenRequest) (*CreatePoolJoinTokenResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreatePoolJoinToken not implemented") + return nil, status.Error(codes.Unimplemented, "method CreatePoolJoinToken not implemented") } func (UnimplementedGatewayServiceServer) RevokePoolJoinToken(context.Context, *RevokePoolJoinTokenRequest) (*RevokePoolJoinTokenResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method RevokePoolJoinToken not implemented") + return nil, status.Error(codes.Unimplemented, "method RevokePoolJoinToken not implemented") } func (UnimplementedGatewayServiceServer) GetPoolJoinCommand(context.Context, *GetPoolJoinCommandRequest) (*GetPoolJoinCommandResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetPoolJoinCommand not implemented") + return nil, status.Error(codes.Unimplemented, "method GetPoolJoinCommand not implemented") } func (UnimplementedGatewayServiceServer) ListPoolMachines(context.Context, *ListPoolMachinesRequest) (*ListPoolMachinesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListPoolMachines not implemented") + return nil, status.Error(codes.Unimplemented, "method ListPoolMachines not implemented") } func (UnimplementedGatewayServiceServer) JoinAgent(context.Context, *JoinAgentRequest) (*JoinAgentResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method JoinAgent not implemented") + return nil, status.Error(codes.Unimplemented, "method JoinAgent not implemented") } func (UnimplementedGatewayServiceServer) RequestAgentTransportCredential(context.Context, *RequestAgentTransportCredentialRequest) (*RequestAgentTransportCredentialResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method RequestAgentTransportCredential not implemented") + return nil, status.Error(codes.Unimplemented, "method RequestAgentTransportCredential not implemented") +} +func (UnimplementedGatewayServiceServer) CreateNodeEnrollment(context.Context, *CreateNodeEnrollmentRequest) (*CreateNodeEnrollmentResponse, error) { + return nil, status.Error(codes.Unimplemented, "method CreateNodeEnrollment not implemented") +} +func (UnimplementedGatewayServiceServer) DeleteNodeEnrollment(context.Context, *DeleteNodeEnrollmentRequest) (*DeleteNodeEnrollmentResponse, error) { + return nil, status.Error(codes.Unimplemented, "method DeleteNodeEnrollment not implemented") } func (UnimplementedGatewayServiceServer) ListAgentRoutes(context.Context, *ListAgentRoutesRequest) (*ListAgentRoutesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListAgentRoutes not implemented") + return nil, status.Error(codes.Unimplemented, "method ListAgentRoutes not implemented") } func (UnimplementedGatewayServiceServer) UpdateAgentRouteStatus(context.Context, *UpdateAgentRouteStatusRequest) (*UpdateAgentRouteStatusResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateAgentRouteStatus not implemented") + return nil, status.Error(codes.Unimplemented, "method UpdateAgentRouteStatus not implemented") } func (UnimplementedGatewayServiceServer) UpdateAgentAvailability(context.Context, *UpdateAgentAvailabilityRequest) (*UpdateAgentAvailabilityResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateAgentAvailability not implemented") + return nil, status.Error(codes.Unimplemented, "method UpdateAgentAvailability not implemented") } -func (UnimplementedGatewayServiceServer) StreamAgent(*StreamAgentRequest, GatewayService_StreamAgentServer) error { - return status.Errorf(codes.Unimplemented, "method StreamAgent not implemented") +func (UnimplementedGatewayServiceServer) StreamAgent(*StreamAgentRequest, grpc.ServerStreamingServer[StreamAgentResponse]) error { + return status.Error(codes.Unimplemented, "method StreamAgent not implemented") } -func (UnimplementedGatewayServiceServer) StreamAgentTelemetry(GatewayService_StreamAgentTelemetryServer) error { - return status.Errorf(codes.Unimplemented, "method StreamAgentTelemetry not implemented") +func (UnimplementedGatewayServiceServer) StreamAgentTelemetry(grpc.ClientStreamingServer[AgentTelemetryRequest, AgentTelemetryResponse]) error { + return status.Error(codes.Unimplemented, "method StreamAgentTelemetry not implemented") } func (UnimplementedGatewayServiceServer) ListMachines(context.Context, *ListMachinesRequest) (*ListMachinesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListMachines not implemented") + return nil, status.Error(codes.Unimplemented, "method ListMachines not implemented") } func (UnimplementedGatewayServiceServer) CreateMachine(context.Context, *CreateMachineRequest) (*CreateMachineResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateMachine not implemented") + return nil, status.Error(codes.Unimplemented, "method CreateMachine not implemented") } func (UnimplementedGatewayServiceServer) DeleteMachine(context.Context, *DeleteMachineRequest) (*DeleteMachineResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteMachine not implemented") + return nil, status.Error(codes.Unimplemented, "method DeleteMachine not implemented") } func (UnimplementedGatewayServiceServer) ListTokens(context.Context, *ListTokensRequest) (*ListTokensResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListTokens not implemented") + return nil, status.Error(codes.Unimplemented, "method ListTokens not implemented") } func (UnimplementedGatewayServiceServer) CreateToken(context.Context, *CreateTokenRequest) (*CreateTokenResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateToken not implemented") + return nil, status.Error(codes.Unimplemented, "method CreateToken not implemented") } func (UnimplementedGatewayServiceServer) ToggleToken(context.Context, *ToggleTokenRequest) (*ToggleTokenResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ToggleToken not implemented") + return nil, status.Error(codes.Unimplemented, "method ToggleToken not implemented") } func (UnimplementedGatewayServiceServer) DeleteToken(context.Context, *DeleteTokenRequest) (*DeleteTokenResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteToken not implemented") + return nil, status.Error(codes.Unimplemented, "method DeleteToken not implemented") } func (UnimplementedGatewayServiceServer) ListWorkers(context.Context, *ListWorkersRequest) (*ListWorkersResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListWorkers not implemented") + return nil, status.Error(codes.Unimplemented, "method ListWorkers not implemented") } func (UnimplementedGatewayServiceServer) CordonWorker(context.Context, *CordonWorkerRequest) (*CordonWorkerResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CordonWorker not implemented") + return nil, status.Error(codes.Unimplemented, "method CordonWorker not implemented") } func (UnimplementedGatewayServiceServer) UncordonWorker(context.Context, *UncordonWorkerRequest) (*UncordonWorkerResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UncordonWorker not implemented") + return nil, status.Error(codes.Unimplemented, "method UncordonWorker not implemented") } func (UnimplementedGatewayServiceServer) DrainWorker(context.Context, *DrainWorkerRequest) (*DrainWorkerResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DrainWorker not implemented") + return nil, status.Error(codes.Unimplemented, "method DrainWorker not implemented") } func (UnimplementedGatewayServiceServer) ExportWorkspaceConfig(context.Context, *ExportWorkspaceConfigRequest) (*ExportWorkspaceConfigResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ExportWorkspaceConfig not implemented") + return nil, status.Error(codes.Unimplemented, "method ExportWorkspaceConfig not implemented") } func (UnimplementedGatewayServiceServer) mustEmbedUnimplementedGatewayServiceServer() {} +func (UnimplementedGatewayServiceServer) testEmbeddedByValue() {} // UnsafeGatewayServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to GatewayServiceServer will @@ -1180,6 +1206,13 @@ type UnsafeGatewayServiceServer interface { } func RegisterGatewayServiceServer(s grpc.ServiceRegistrar, srv GatewayServiceServer) { + // If the following call panics, it indicates UnimplementedGatewayServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&GatewayService_ServiceDesc, srv) } @@ -1256,30 +1289,11 @@ func _GatewayService_CreateObject_Handler(srv interface{}, ctx context.Context, } func _GatewayService_PutObjectStream_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(GatewayServiceServer).PutObjectStream(&gatewayServicePutObjectStreamServer{stream}) + return srv.(GatewayServiceServer).PutObjectStream(&grpc.GenericServerStream[PutObjectRequest, PutObjectResponse]{ServerStream: stream}) } -type GatewayService_PutObjectStreamServer interface { - SendAndClose(*PutObjectResponse) error - Recv() (*PutObjectRequest, error) - grpc.ServerStream -} - -type gatewayServicePutObjectStreamServer struct { - grpc.ServerStream -} - -func (x *gatewayServicePutObjectStreamServer) SendAndClose(m *PutObjectResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *gatewayServicePutObjectStreamServer) Recv() (*PutObjectRequest, error) { - m := new(PutObjectRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type GatewayService_PutObjectStreamServer = grpc.ClientStreamingServer[PutObjectRequest, PutObjectResponse] func _GatewayService_CheckpointContainer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CheckpointContainerRequest) @@ -1336,30 +1350,11 @@ func _GatewayService_StopContainer_Handler(srv interface{}, ctx context.Context, } func _GatewayService_AttachToContainer_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(GatewayServiceServer).AttachToContainer(&gatewayServiceAttachToContainerServer{stream}) -} - -type GatewayService_AttachToContainerServer interface { - Send(*AttachToContainerResponse) error - Recv() (*ContainerStreamMessage, error) - grpc.ServerStream + return srv.(GatewayServiceServer).AttachToContainer(&grpc.GenericServerStream[ContainerStreamMessage, AttachToContainerResponse]{ServerStream: stream}) } -type gatewayServiceAttachToContainerServer struct { - grpc.ServerStream -} - -func (x *gatewayServiceAttachToContainerServer) Send(m *AttachToContainerResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *gatewayServiceAttachToContainerServer) Recv() (*ContainerStreamMessage, error) { - m := new(ContainerStreamMessage) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type GatewayService_AttachToContainerServer = grpc.BidiStreamingServer[ContainerStreamMessage, AttachToContainerResponse] func _GatewayService_StartTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(StartTaskRequest) @@ -2099,6 +2094,42 @@ func _GatewayService_RequestAgentTransportCredential_Handler(srv interface{}, ct return interceptor(ctx, in, info, handler) } +func _GatewayService_CreateNodeEnrollment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateNodeEnrollmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GatewayServiceServer).CreateNodeEnrollment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GatewayService_CreateNodeEnrollment_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GatewayServiceServer).CreateNodeEnrollment(ctx, req.(*CreateNodeEnrollmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GatewayService_DeleteNodeEnrollment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteNodeEnrollmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GatewayServiceServer).DeleteNodeEnrollment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GatewayService_DeleteNodeEnrollment_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GatewayServiceServer).DeleteNodeEnrollment(ctx, req.(*DeleteNodeEnrollmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _GatewayService_ListAgentRoutes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListAgentRoutesRequest) if err := dec(in); err != nil { @@ -2158,47 +2189,18 @@ func _GatewayService_StreamAgent_Handler(srv interface{}, stream grpc.ServerStre if err := stream.RecvMsg(m); err != nil { return err } - return srv.(GatewayServiceServer).StreamAgent(m, &gatewayServiceStreamAgentServer{stream}) + return srv.(GatewayServiceServer).StreamAgent(m, &grpc.GenericServerStream[StreamAgentRequest, StreamAgentResponse]{ServerStream: stream}) } -type GatewayService_StreamAgentServer interface { - Send(*StreamAgentResponse) error - grpc.ServerStream -} - -type gatewayServiceStreamAgentServer struct { - grpc.ServerStream -} - -func (x *gatewayServiceStreamAgentServer) Send(m *StreamAgentResponse) error { - return x.ServerStream.SendMsg(m) -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type GatewayService_StreamAgentServer = grpc.ServerStreamingServer[StreamAgentResponse] func _GatewayService_StreamAgentTelemetry_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(GatewayServiceServer).StreamAgentTelemetry(&gatewayServiceStreamAgentTelemetryServer{stream}) -} - -type GatewayService_StreamAgentTelemetryServer interface { - SendAndClose(*AgentTelemetryResponse) error - Recv() (*AgentTelemetryRequest, error) - grpc.ServerStream -} - -type gatewayServiceStreamAgentTelemetryServer struct { - grpc.ServerStream -} - -func (x *gatewayServiceStreamAgentTelemetryServer) SendAndClose(m *AgentTelemetryResponse) error { - return x.ServerStream.SendMsg(m) + return srv.(GatewayServiceServer).StreamAgentTelemetry(&grpc.GenericServerStream[AgentTelemetryRequest, AgentTelemetryResponse]{ServerStream: stream}) } -func (x *gatewayServiceStreamAgentTelemetryServer) Recv() (*AgentTelemetryRequest, error) { - m := new(AgentTelemetryRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type GatewayService_StreamAgentTelemetryServer = grpc.ClientStreamingServer[AgentTelemetryRequest, AgentTelemetryResponse] func _GatewayService_ListMachines_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListMachinesRequest) @@ -2615,6 +2617,14 @@ var GatewayService_ServiceDesc = grpc.ServiceDesc{ MethodName: "RequestAgentTransportCredential", Handler: _GatewayService_RequestAgentTransportCredential_Handler, }, + { + MethodName: "CreateNodeEnrollment", + Handler: _GatewayService_CreateNodeEnrollment_Handler, + }, + { + MethodName: "DeleteNodeEnrollment", + Handler: _GatewayService_DeleteNodeEnrollment_Handler, + }, { MethodName: "ListAgentRoutes", Handler: _GatewayService_ListAgentRoutes_Handler, diff --git a/proto/thunder.pb.go b/proto/thunder.pb.go new file mode 100644 index 000000000..ae498a8c2 --- /dev/null +++ b/proto/thunder.pb.go @@ -0,0 +1,297 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.11 +// protoc v3.21.12 +// source: thunder.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type CreateClientEnrollmentRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ContainerId string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateClientEnrollmentRequest) Reset() { + *x = CreateClientEnrollmentRequest{} + mi := &file_thunder_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateClientEnrollmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateClientEnrollmentRequest) ProtoMessage() {} + +func (x *CreateClientEnrollmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_thunder_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateClientEnrollmentRequest.ProtoReflect.Descriptor instead. +func (*CreateClientEnrollmentRequest) Descriptor() ([]byte, []int) { + return file_thunder_proto_rawDescGZIP(), []int{0} +} + +func (x *CreateClientEnrollmentRequest) GetContainerId() string { + if x != nil { + return x.ContainerId + } + return "" +} + +type CreateClientEnrollmentResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrorMsg string `protobuf:"bytes,2,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` + InstallCommand string `protobuf:"bytes,3,opt,name=install_command,json=installCommand,proto3" json:"install_command,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateClientEnrollmentResponse) Reset() { + *x = CreateClientEnrollmentResponse{} + mi := &file_thunder_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateClientEnrollmentResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateClientEnrollmentResponse) ProtoMessage() {} + +func (x *CreateClientEnrollmentResponse) ProtoReflect() protoreflect.Message { + mi := &file_thunder_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateClientEnrollmentResponse.ProtoReflect.Descriptor instead. +func (*CreateClientEnrollmentResponse) Descriptor() ([]byte, []int) { + return file_thunder_proto_rawDescGZIP(), []int{1} +} + +func (x *CreateClientEnrollmentResponse) GetOk() bool { + if x != nil { + return x.Ok + } + return false +} + +func (x *CreateClientEnrollmentResponse) GetErrorMsg() string { + if x != nil { + return x.ErrorMsg + } + return "" +} + +func (x *CreateClientEnrollmentResponse) GetInstallCommand() string { + if x != nil { + return x.InstallCommand + } + return "" +} + +type DeleteClientEnrollmentRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ContainerId string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteClientEnrollmentRequest) Reset() { + *x = DeleteClientEnrollmentRequest{} + mi := &file_thunder_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteClientEnrollmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteClientEnrollmentRequest) ProtoMessage() {} + +func (x *DeleteClientEnrollmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_thunder_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteClientEnrollmentRequest.ProtoReflect.Descriptor instead. +func (*DeleteClientEnrollmentRequest) Descriptor() ([]byte, []int) { + return file_thunder_proto_rawDescGZIP(), []int{2} +} + +func (x *DeleteClientEnrollmentRequest) GetContainerId() string { + if x != nil { + return x.ContainerId + } + return "" +} + +type DeleteClientEnrollmentResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrorMsg string `protobuf:"bytes,2,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteClientEnrollmentResponse) Reset() { + *x = DeleteClientEnrollmentResponse{} + mi := &file_thunder_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteClientEnrollmentResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteClientEnrollmentResponse) ProtoMessage() {} + +func (x *DeleteClientEnrollmentResponse) ProtoReflect() protoreflect.Message { + mi := &file_thunder_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteClientEnrollmentResponse.ProtoReflect.Descriptor instead. +func (*DeleteClientEnrollmentResponse) Descriptor() ([]byte, []int) { + return file_thunder_proto_rawDescGZIP(), []int{3} +} + +func (x *DeleteClientEnrollmentResponse) GetOk() bool { + if x != nil { + return x.Ok + } + return false +} + +func (x *DeleteClientEnrollmentResponse) GetErrorMsg() string { + if x != nil { + return x.ErrorMsg + } + return "" +} + +var File_thunder_proto protoreflect.FileDescriptor + +const file_thunder_proto_rawDesc = "" + + "\n" + + "\rthunder.proto\x12\athunder\"B\n" + + "\x1dCreateClientEnrollmentRequest\x12!\n" + + "\fcontainer_id\x18\x01 \x01(\tR\vcontainerId\"v\n" + + "\x1eCreateClientEnrollmentResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x1b\n" + + "\terror_msg\x18\x02 \x01(\tR\berrorMsg\x12'\n" + + "\x0finstall_command\x18\x03 \x01(\tR\x0einstallCommand\"B\n" + + "\x1dDeleteClientEnrollmentRequest\x12!\n" + + "\fcontainer_id\x18\x01 \x01(\tR\vcontainerId\"M\n" + + "\x1eDeleteClientEnrollmentResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x1b\n" + + "\terror_msg\x18\x02 \x01(\tR\berrorMsg2\xe6\x01\n" + + "\x0eThunderService\x12i\n" + + "\x16CreateClientEnrollment\x12&.thunder.CreateClientEnrollmentRequest\x1a'.thunder.CreateClientEnrollmentResponse\x12i\n" + + "\x16DeleteClientEnrollment\x12&.thunder.DeleteClientEnrollmentRequest\x1a'.thunder.DeleteClientEnrollmentResponseB#Z!github.com/beam-cloud/beta9/protob\x06proto3" + +var ( + file_thunder_proto_rawDescOnce sync.Once + file_thunder_proto_rawDescData []byte +) + +func file_thunder_proto_rawDescGZIP() []byte { + file_thunder_proto_rawDescOnce.Do(func() { + file_thunder_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_thunder_proto_rawDesc), len(file_thunder_proto_rawDesc))) + }) + return file_thunder_proto_rawDescData +} + +var file_thunder_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_thunder_proto_goTypes = []any{ + (*CreateClientEnrollmentRequest)(nil), // 0: thunder.CreateClientEnrollmentRequest + (*CreateClientEnrollmentResponse)(nil), // 1: thunder.CreateClientEnrollmentResponse + (*DeleteClientEnrollmentRequest)(nil), // 2: thunder.DeleteClientEnrollmentRequest + (*DeleteClientEnrollmentResponse)(nil), // 3: thunder.DeleteClientEnrollmentResponse +} +var file_thunder_proto_depIdxs = []int32{ + 0, // 0: thunder.ThunderService.CreateClientEnrollment:input_type -> thunder.CreateClientEnrollmentRequest + 2, // 1: thunder.ThunderService.DeleteClientEnrollment:input_type -> thunder.DeleteClientEnrollmentRequest + 1, // 2: thunder.ThunderService.CreateClientEnrollment:output_type -> thunder.CreateClientEnrollmentResponse + 3, // 3: thunder.ThunderService.DeleteClientEnrollment:output_type -> thunder.DeleteClientEnrollmentResponse + 2, // [2:4] is the sub-list for method output_type + 0, // [0:2] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_thunder_proto_init() } +func file_thunder_proto_init() { + if File_thunder_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_thunder_proto_rawDesc), len(file_thunder_proto_rawDesc)), + NumEnums: 0, + NumMessages: 4, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_thunder_proto_goTypes, + DependencyIndexes: file_thunder_proto_depIdxs, + MessageInfos: file_thunder_proto_msgTypes, + }.Build() + File_thunder_proto = out.File + file_thunder_proto_goTypes = nil + file_thunder_proto_depIdxs = nil +} diff --git a/proto/thunder_grpc.pb.go b/proto/thunder_grpc.pb.go new file mode 100644 index 000000000..6f4904471 --- /dev/null +++ b/proto/thunder_grpc.pb.go @@ -0,0 +1,159 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.6.2 +// - protoc v3.21.12 +// source: thunder.proto + +package proto + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + ThunderService_CreateClientEnrollment_FullMethodName = "/thunder.ThunderService/CreateClientEnrollment" + ThunderService_DeleteClientEnrollment_FullMethodName = "/thunder.ThunderService/DeleteClientEnrollment" +) + +// ThunderServiceClient is the client API for ThunderService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ThunderServiceClient interface { + CreateClientEnrollment(ctx context.Context, in *CreateClientEnrollmentRequest, opts ...grpc.CallOption) (*CreateClientEnrollmentResponse, error) + DeleteClientEnrollment(ctx context.Context, in *DeleteClientEnrollmentRequest, opts ...grpc.CallOption) (*DeleteClientEnrollmentResponse, error) +} + +type thunderServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewThunderServiceClient(cc grpc.ClientConnInterface) ThunderServiceClient { + return &thunderServiceClient{cc} +} + +func (c *thunderServiceClient) CreateClientEnrollment(ctx context.Context, in *CreateClientEnrollmentRequest, opts ...grpc.CallOption) (*CreateClientEnrollmentResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateClientEnrollmentResponse) + err := c.cc.Invoke(ctx, ThunderService_CreateClientEnrollment_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *thunderServiceClient) DeleteClientEnrollment(ctx context.Context, in *DeleteClientEnrollmentRequest, opts ...grpc.CallOption) (*DeleteClientEnrollmentResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteClientEnrollmentResponse) + err := c.cc.Invoke(ctx, ThunderService_DeleteClientEnrollment_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ThunderServiceServer is the server API for ThunderService service. +// All implementations must embed UnimplementedThunderServiceServer +// for forward compatibility. +type ThunderServiceServer interface { + CreateClientEnrollment(context.Context, *CreateClientEnrollmentRequest) (*CreateClientEnrollmentResponse, error) + DeleteClientEnrollment(context.Context, *DeleteClientEnrollmentRequest) (*DeleteClientEnrollmentResponse, error) + mustEmbedUnimplementedThunderServiceServer() +} + +// UnimplementedThunderServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedThunderServiceServer struct{} + +func (UnimplementedThunderServiceServer) CreateClientEnrollment(context.Context, *CreateClientEnrollmentRequest) (*CreateClientEnrollmentResponse, error) { + return nil, status.Error(codes.Unimplemented, "method CreateClientEnrollment not implemented") +} +func (UnimplementedThunderServiceServer) DeleteClientEnrollment(context.Context, *DeleteClientEnrollmentRequest) (*DeleteClientEnrollmentResponse, error) { + return nil, status.Error(codes.Unimplemented, "method DeleteClientEnrollment not implemented") +} +func (UnimplementedThunderServiceServer) mustEmbedUnimplementedThunderServiceServer() {} +func (UnimplementedThunderServiceServer) testEmbeddedByValue() {} + +// UnsafeThunderServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ThunderServiceServer will +// result in compilation errors. +type UnsafeThunderServiceServer interface { + mustEmbedUnimplementedThunderServiceServer() +} + +func RegisterThunderServiceServer(s grpc.ServiceRegistrar, srv ThunderServiceServer) { + // If the following call panics, it indicates UnimplementedThunderServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&ThunderService_ServiceDesc, srv) +} + +func _ThunderService_CreateClientEnrollment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateClientEnrollmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ThunderServiceServer).CreateClientEnrollment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ThunderService_CreateClientEnrollment_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ThunderServiceServer).CreateClientEnrollment(ctx, req.(*CreateClientEnrollmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ThunderService_DeleteClientEnrollment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteClientEnrollmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ThunderServiceServer).DeleteClientEnrollment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ThunderService_DeleteClientEnrollment_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ThunderServiceServer).DeleteClientEnrollment(ctx, req.(*DeleteClientEnrollmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// ThunderService_ServiceDesc is the grpc.ServiceDesc for ThunderService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ThunderService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "thunder.ThunderService", + HandlerType: (*ThunderServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateClientEnrollment", + Handler: _ThunderService_CreateClientEnrollment_Handler, + }, + { + MethodName: "DeleteClientEnrollment", + Handler: _ThunderService_DeleteClientEnrollment_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "thunder.proto", +} From 214bf636b43bb6275612e1a7bfe505e6ad08c3f8 Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Wed, 29 Jul 2026 17:22:41 +0000 Subject: [PATCH 13/26] added agent soft failure --- pkg/agent/thunder_test.go | 14 ++++++++++++++ pkg/agent/transport.go | 5 +++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/pkg/agent/thunder_test.go b/pkg/agent/thunder_test.go index 4d7370689..c84bda83f 100644 --- a/pkg/agent/thunder_test.go +++ b/pkg/agent/thunder_test.go @@ -41,6 +41,20 @@ func TestSetupThunderNodeInstallsWithTailscaleIP(t *testing.T) { } } +func TestSetupThunderNodeSkipsInstallerWhenEnrollmentFails(t *testing.T) { + client := &fakeGatewayNodeEnrollmentClient{createErr: errors.New("gateway unavailable")} + restore := stubThunderNodeInstallCommand(func(ctx context.Context, command string) error { + t.Fatalf("installer should not run when enrollment fails: %s", command) + return nil + }) + defer restore() + + err := setupThunderNode(context.Background(), client, "agent-token", []netip.Addr{netip.MustParseAddr("100.64.0.10")}, nil, nil) + if err == nil || !strings.Contains(err.Error(), "gateway unavailable") { + t.Fatalf("setupThunderNode() error = %v", err) + } +} + func TestSetupThunderNodeSkipsInstallerWhenAlreadyEnrolled(t *testing.T) { client := &fakeGatewayNodeEnrollmentClient{createResp: &pb.CreateNodeEnrollmentResponse{Ok: true}} restore := stubThunderNodeInstallCommand(func(ctx context.Context, command string) error { diff --git a/pkg/agent/transport.go b/pkg/agent/transport.go index 399e1bb0f..0acd338b9 100644 --- a/pkg/agent/transport.go +++ b/pkg/agent/transport.go @@ -90,9 +90,10 @@ func runTSNetRouteProxy(ctx context.Context, client pb.GatewayServiceClient, age } } if err := setupThunderNode(ctx, client, agentToken, tailscaleIPs, stdout, stderr); err != nil { - return err + fmt.Fprintf(stderr, "Thunder node enrollment skipped: %v\n", err) + } else { + defer deleteThunderNodeEnrollment(context.Background(), client, agentToken, stderr) } - defer deleteThunderNodeEnrollment(context.Background(), client, agentToken, stderr) listener, err := server.Listen("tcp", fmt.Sprintf(":%d", types.DefaultAgentTSNetRouteProxyPort)) if err != nil { From 2d2e2411a29301f39d5e2546eeae2393c52ffd8f Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Wed, 29 Jul 2026 17:30:49 +0000 Subject: [PATCH 14/26] used existing token state utilities --- pkg/gateway/gateway.go | 10 +-- pkg/gateway/services/compute/agent.go | 8 +++ pkg/gateway/services/thunder/service.go | 64 +++++++------------- pkg/gateway/services/thunder/service_test.go | 60 +++++++++--------- 4 files changed, 66 insertions(+), 76 deletions(-) diff --git a/pkg/gateway/gateway.go b/pkg/gateway/gateway.go index 6ce131de6..b5f9fae18 100644 --- a/pkg/gateway/gateway.go +++ b/pkg/gateway/gateway.go @@ -383,11 +383,11 @@ func (g *Gateway) registerServices() error { // Register Thunder service ts, err := thundersvc.NewService(thundersvc.ServiceOpts{ - RedisClient: g.RedisClient, - Client: thundersvc.NewClientFromEnv(nil), - ContainerRepo: g.ContainerRepo, - WorkerRepo: g.workerRepo, - ComputeRepo: g.ComputeRepo, + RedisClient: g.RedisClient, + Client: thundersvc.NewClientFromEnv(nil), + ContainerRepo: g.ContainerRepo, + WorkerRepo: g.workerRepo, + AgentStateValidator: g.ComputeService, }) if err != nil { return err diff --git a/pkg/gateway/services/compute/agent.go b/pkg/gateway/services/compute/agent.go index de8e621aa..995a8aa8c 100644 --- a/pkg/gateway/services/compute/agent.go +++ b/pkg/gateway/services/compute/agent.go @@ -285,6 +285,14 @@ func (s *Service) bindJoinTokenFingerprint(ctx context.Context, tokenState *mode // requireAgentState resolves an agent token to its current machine state, // returning a user-facing error message when the token is invalid or stale. // Shared by every agent-token-authenticated RPC in this file. +func (s *Service) ResolveAgentState(ctx context.Context, token string) (*model.AgentTokenState, error) { + agentState, errMsg := s.requireAgentState(ctx, token) + if errMsg != "" { + return nil, errors.New(errMsg) + } + return agentState, nil +} + func (s *Service) requireAgentState(ctx context.Context, token string) (*model.AgentTokenState, string) { agentState, err := s.getCurrentComputeAgentTokenState(ctx, token) if err != nil { diff --git a/pkg/gateway/services/thunder/service.go b/pkg/gateway/services/thunder/service.go index d06714a9e..01f091790 100644 --- a/pkg/gateway/services/thunder/service.go +++ b/pkg/gateway/services/thunder/service.go @@ -2,8 +2,6 @@ package thunder import ( "context" - "crypto/sha256" - "encoding/hex" "errors" "fmt" "net/http" @@ -25,13 +23,17 @@ type ThunderClient interface { ClientInstallCommand(enrollmentToken string) (string, error) } +type AgentStateValidator interface { + ResolveAgentState(ctx context.Context, agentToken string) (*model.AgentTokenState, error) +} + type ServiceOpts struct { - Repository Repository - RedisClient *common.RedisClient - Client ThunderClient - ContainerRepo repository.ContainerRepository - WorkerRepo repository.WorkerRepository - ComputeRepo repository.ComputeRepository + Repository Repository + RedisClient *common.RedisClient + Client ThunderClient + ContainerRepo repository.ContainerRepository + WorkerRepo repository.WorkerRepository + AgentStateValidator AgentStateValidator } var errThunderClientEnrollmentExists = errors.New("Thunder client enrollment already exists for container") @@ -39,11 +41,11 @@ var errThunderClientEnrollmentExists = errors.New("Thunder client enrollment alr type Service struct { pb.UnimplementedThunderServiceServer - repo Repository - client ThunderClient - containerRepo repository.ContainerRepository - workerRepo repository.WorkerRepository - computeRepo repository.ComputeRepository + repo Repository + client ThunderClient + containerRepo repository.ContainerRepository + workerRepo repository.WorkerRepository + agentValidator AgentStateValidator } func NewService(opts ServiceOpts) (*Service, error) { @@ -70,11 +72,11 @@ func NewService(opts ServiceOpts) (*Service, error) { } return &Service{ - repo: repo, - client: client, - containerRepo: opts.ContainerRepo, - workerRepo: opts.WorkerRepo, - computeRepo: opts.ComputeRepo, + repo: repo, + client: client, + containerRepo: opts.ContainerRepo, + workerRepo: opts.WorkerRepo, + agentValidator: opts.AgentStateValidator, }, nil } @@ -357,30 +359,10 @@ func (s *Service) requireAgentState(ctx context.Context, agentToken string) (*mo if agentToken == "" { return nil, fmt.Errorf("agent token is required") } - if s == nil || s.computeRepo == nil { - return nil, fmt.Errorf("compute repository is unavailable") - } - - state, err := s.computeRepo.GetAgentTokenState(ctx, hashThunderComputeToken(agentToken)) - if err != nil { - return nil, err - } - if state == nil { - return nil, fmt.Errorf("invalid agent token") + if s == nil || s.agentValidator == nil { + return nil, fmt.Errorf("agent state validator is unavailable") } - current, err := s.computeRepo.GetAgentMachineState(ctx, state.WorkspaceID, state.PoolName, state.MachineID) - if err != nil { - return nil, err - } - if current == nil || current.TokenHash != state.TokenHash { - return nil, fmt.Errorf("invalid agent token") - } - return current, nil -} - -func hashThunderComputeToken(token string) string { - sum := sha256.Sum256([]byte(token)) - return hex.EncodeToString(sum[:]) + return s.agentValidator.ResolveAgentState(ctx, agentToken) } func requireWorkerToken(ctx context.Context, workspaceID string) error { diff --git a/pkg/gateway/services/thunder/service_test.go b/pkg/gateway/services/thunder/service_test.go index 04c1595c2..69cce2d45 100644 --- a/pkg/gateway/services/thunder/service_test.go +++ b/pkg/gateway/services/thunder/service_test.go @@ -3,11 +3,11 @@ package thunder import ( "context" "encoding/json" + "errors" "net/http" "net/http/httptest" "strings" "testing" - "time" "github.com/beam-cloud/beta9/pkg/auth" model "github.com/beam-cloud/beta9/pkg/compute" @@ -256,9 +256,8 @@ func TestServiceCreateAndDeleteNodeEnrollment(t *testing.T) { defer rdb.Close() repo := NewRedisRepository(rdb) - computeRepo := repository.NewComputeRedisRepository(rdb) agentToken := "agent-token" - saveThunderAgentTokenState(t, computeRepo, agentToken, "workspace-1", "pool-1", "machine-1") + validator := &fakeAgentStateValidator{state: &model.AgentTokenState{WorkspaceID: "workspace-1", PoolName: "pool-1", MachineID: "machine-1"}} var createZoneCalls int var createTokenCalls int @@ -304,11 +303,11 @@ func TestServiceCreateAndDeleteNodeEnrollment(t *testing.T) { defer server.Close() service, err := NewService(ServiceOpts{ - Repository: repo, - Client: NewClient(server.URL, "central-token", server.Client()), - ContainerRepo: repository.NewContainerRedisRepositoryForTest(rdb), - WorkerRepo: repository.NewWorkerRedisRepositoryForTest(rdb), - ComputeRepo: computeRepo, + Repository: repo, + Client: NewClient(server.URL, "central-token", server.Client()), + ContainerRepo: repository.NewContainerRedisRepositoryForTest(rdb), + WorkerRepo: repository.NewWorkerRedisRepositoryForTest(rdb), + AgentStateValidator: validator, }) if err != nil { t.Fatal(err) @@ -361,19 +360,18 @@ func TestServiceCreateNodeEnrollmentWithExistingStateIsIdempotent(t *testing.T) defer rdb.Close() repo := NewRedisRepository(rdb) - computeRepo := repository.NewComputeRedisRepository(rdb) agentToken := "agent-token" - saveThunderAgentTokenState(t, computeRepo, agentToken, "workspace-1", "pool-1", "machine-1") + validator := &fakeAgentStateValidator{state: &model.AgentTokenState{WorkspaceID: "workspace-1", PoolName: "pool-1", MachineID: "machine-1"}} if err := repo.SaveNodeEnrollment(context.Background(), &NodeEnrollmentState{WorkspaceID: "workspace-1", PoolName: "pool-1", MachineID: "machine-1", EnrollmentTokenID: "node-token-existing"}, 0); err != nil { t.Fatal(err) } service, err := NewService(ServiceOpts{ - Repository: repo, - Client: NewClient("https://central.example", "central-token", nil), - ContainerRepo: repository.NewContainerRedisRepositoryForTest(rdb), - WorkerRepo: repository.NewWorkerRedisRepositoryForTest(rdb), - ComputeRepo: computeRepo, + Repository: repo, + Client: NewClient("https://central.example", "central-token", nil), + ContainerRepo: repository.NewContainerRedisRepositoryForTest(rdb), + WorkerRepo: repository.NewWorkerRedisRepositoryForTest(rdb), + AgentStateValidator: validator, }) if err != nil { t.Fatal(err) @@ -391,11 +389,11 @@ func TestServiceCreateNodeEnrollmentRequiresValidAgentToken(t *testing.T) { rdb := newThunderRedisClient(t) defer rdb.Close() service, err := NewService(ServiceOpts{ - Repository: NewRedisRepository(rdb), - Client: NewClient("https://central.example", "central-token", nil), - ContainerRepo: repository.NewContainerRedisRepositoryForTest(rdb), - WorkerRepo: repository.NewWorkerRedisRepositoryForTest(rdb), - ComputeRepo: repository.NewComputeRedisRepository(rdb), + Repository: NewRedisRepository(rdb), + Client: NewClient("https://central.example", "central-token", nil), + ContainerRepo: repository.NewContainerRedisRepositoryForTest(rdb), + WorkerRepo: repository.NewWorkerRedisRepositoryForTest(rdb), + AgentStateValidator: &fakeAgentStateValidator{err: errors.New("managed pool no longer exists")}, }) if err != nil { t.Fatal(err) @@ -404,21 +402,23 @@ func TestServiceCreateNodeEnrollmentRequiresValidAgentToken(t *testing.T) { if err != nil { t.Fatal(err) } - if resp.Ok || !strings.Contains(resp.ErrorMsg, "invalid agent token") { + if resp.Ok || !strings.Contains(resp.ErrorMsg, "managed pool no longer exists") { t.Fatalf("CreateNodeEnrollment() = %+v", resp) } } -func saveThunderAgentTokenState(t *testing.T, repo repository.ComputeRepository, agentToken, workspaceID, poolName, machineID string) { - t.Helper() - if err := repo.SaveAgentTokenState(context.Background(), &model.AgentTokenState{ - TokenHash: hashThunderComputeToken(agentToken), - WorkspaceID: workspaceID, - PoolName: poolName, - MachineID: machineID, - }, time.Hour); err != nil { - t.Fatal(err) +type fakeAgentStateValidator struct { + state *model.AgentTokenState + err error + token string +} + +func (v *fakeAgentStateValidator) ResolveAgentState(ctx context.Context, agentToken string) (*model.AgentTokenState, error) { + v.token = agentToken + if v.err != nil { + return nil, v.err } + return v.state, nil } func thunderWorkerAuthContext(tokenType, workspaceID string) context.Context { From 545a3b152e2c956942d4f08ac22a2c09cdbf19ef Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Wed, 29 Jul 2026 17:49:37 +0000 Subject: [PATCH 15/26] added multi-enrollment creation functionality --- pkg/gateway/services/thunder/service.go | 22 +++- pkg/gateway/services/thunder/service_test.go | 109 ++++++++++++++++++- 2 files changed, 121 insertions(+), 10 deletions(-) diff --git a/pkg/gateway/services/thunder/service.go b/pkg/gateway/services/thunder/service.go index 01f091790..647152590 100644 --- a/pkg/gateway/services/thunder/service.go +++ b/pkg/gateway/services/thunder/service.go @@ -36,8 +36,6 @@ type ServiceOpts struct { AgentStateValidator AgentStateValidator } -var errThunderClientEnrollmentExists = errors.New("Thunder client enrollment already exists for container") - type Service struct { pb.UnimplementedThunderServiceServer @@ -99,10 +97,11 @@ func (s *Service) CreateClientEnrollment(ctx context.Context, req *pb.CreateClie var installCommand string err = s.repo.WithPoolLock(ctx, attrs.workspaceID, attrs.poolName, func(ctx context.Context) error { + var previousEnrollmentTokenID string if existing, found, err := s.repo.GetClientEnrollment(ctx, containerID); err != nil { return err - } else if found && existing.EnrollmentTokenID != "" { - return errThunderClientEnrollmentExists + } else if found { + previousEnrollmentTokenID = strings.TrimSpace(existing.EnrollmentTokenID) } zoneID, err := s.ensureZoneLocked(ctx, attrs.workspaceID, attrs.poolName) @@ -134,6 +133,11 @@ func (s *Service) CreateClientEnrollment(ctx context.Context, req *pb.CreateClie } return err } + if previousEnrollmentTokenID != "" && previousEnrollmentTokenID != enrollment.EnrollmentTokenID { + if _, err := s.client.DeleteEnrollmentTokenNode(ctx, previousEnrollmentTokenID); err != nil && !isThunderNotFound(err) { + return fmt.Errorf("failed to revoke previous Thunder client enrollment token %q: %w", previousEnrollmentTokenID, err) + } + } return nil }) if err != nil { @@ -183,10 +187,11 @@ func (s *Service) CreateNodeEnrollment(ctx context.Context, req *pb.CreateNodeEn var enrollmentToken string err = s.repo.WithPoolLock(ctx, agentState.WorkspaceID, agentState.PoolName, func(ctx context.Context) error { + var previousEnrollmentTokenID string if existing, found, err := s.repo.GetNodeEnrollment(ctx, agentState.WorkspaceID, agentState.PoolName, agentState.MachineID); err != nil { return err - } else if found && strings.TrimSpace(existing.EnrollmentTokenID) != "" { - return nil + } else if found { + previousEnrollmentTokenID = strings.TrimSpace(existing.EnrollmentTokenID) } zoneID, err := s.ensureZoneLocked(ctx, agentState.WorkspaceID, agentState.PoolName) @@ -212,6 +217,11 @@ func (s *Service) CreateNodeEnrollment(ctx context.Context, req *pb.CreateNodeEn } return err } + if previousEnrollmentTokenID != "" && previousEnrollmentTokenID != enrollment.EnrollmentTokenID { + if _, err := s.client.DeleteEnrollmentTokenNode(ctx, previousEnrollmentTokenID); err != nil && !isThunderNotFound(err) { + return fmt.Errorf("failed to revoke previous Thunder node enrollment token %q: %w", previousEnrollmentTokenID, err) + } + } enrollmentToken = enrollment.EnrollmentToken return nil }) diff --git a/pkg/gateway/services/thunder/service_test.go b/pkg/gateway/services/thunder/service_test.go index 69cce2d45..99572ff15 100644 --- a/pkg/gateway/services/thunder/service_test.go +++ b/pkg/gateway/services/thunder/service_test.go @@ -188,6 +188,68 @@ func TestServiceCreateClientEnrollmentReusesExistingZone(t *testing.T) { } } +func TestServiceCreateClientEnrollmentReplacesExistingToken(t *testing.T) { + rdb := newThunderRedisClient(t) + defer rdb.Close() + + containerRepo := repository.NewContainerRedisRepositoryForTest(rdb) + workerRepo := repository.NewWorkerRedisRepositoryForTest(rdb) + if err := workerRepo.AddWorker(&types.Worker{Id: "worker-1", PoolName: "pool-1", MachineId: "machine-1"}); err != nil { + t.Fatal(err) + } + if err := containerRepo.SetContainerState("container-1", &types.ContainerState{ContainerId: "container-1", WorkspaceId: "workspace-1", WorkerId: "worker-1", MachineId: "machine-1", Gpu: "H100", GpuCount: 1}); err != nil { + t.Fatal(err) + } + repo := NewRedisRepository(rdb) + if err := repo.SaveZone(context.Background(), &ZoneState{WorkspaceID: "workspace-1", PoolName: "pool-1", ThunderZoneID: "zone-existing"}); err != nil { + t.Fatal(err) + } + if err := repo.SaveClientEnrollment(context.Background(), &ClientEnrollmentState{ContainerID: "container-1", WorkspaceID: "workspace-1", WorkerID: "worker-1", MachineID: "machine-1", PoolName: "pool-1", EnrollmentTokenID: "token-old"}, 0); err != nil { + t.Fatal(err) + } + + var createTokenCalls int + var deleted []string + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch { + case r.Method == http.MethodPost && r.URL.Path == thunderEnrollmentTokenPath: + createTokenCalls++ + _ = json.NewEncoder(w).Encode(EnrollmentToken{EnrollmentTokenID: "token-new", EnrollmentToken: "tr_client_new", ZoneID: "zone-existing", Role: thunderEnrollmentRoleClient}) + case r.Method == http.MethodDelete && strings.HasPrefix(r.URL.Path, "/api/v1/enrollment-tokens/"): + deleted = append(deleted, strings.TrimSuffix(strings.TrimPrefix(r.URL.Path, "/api/v1/enrollment-tokens/"), "/node")) + _ = json.NewEncoder(w).Encode(DeleteEnrollmentTokenNodeResponse{NodeDeleted: true}) + default: + t.Fatalf("unexpected request = %s %s", r.Method, r.URL.Path) + } + })) + defer server.Close() + + service, err := NewService(ServiceOpts{Repository: repo, Client: NewClient(server.URL, "central-token", server.Client()), ContainerRepo: containerRepo, WorkerRepo: workerRepo}) + if err != nil { + t.Fatal(err) + } + resp, err := service.CreateClientEnrollment(thunderWorkerAuthContext(types.TokenTypeWorker, ""), &pb.CreateClientEnrollmentRequest{ContainerId: "container-1"}) + if err != nil { + t.Fatal(err) + } + if !resp.Ok || resp.ErrorMsg != "" || !strings.Contains(resp.InstallCommand, "tr_client_new") { + t.Fatalf("CreateClientEnrollment() = %+v", resp) + } + if createTokenCalls != 1 { + t.Fatalf("createTokenCalls = %d", createTokenCalls) + } + if len(deleted) != 1 || deleted[0] != "token-old" { + t.Fatalf("deleted tokens = %+v", deleted) + } + state, found, err := repo.GetClientEnrollment(context.Background(), "container-1") + if err != nil || !found { + t.Fatalf("GetClientEnrollment() found=%v err=%v", found, err) + } + if state.EnrollmentTokenID != "token-new" { + t.Fatalf("client enrollment state = %+v", state) + } +} + func TestServiceCreateClientEnrollmentRequiresWorkerToken(t *testing.T) { service := &Service{} resp, err := service.CreateClientEnrollment(context.Background(), &pb.CreateClientEnrollmentRequest{ContainerId: "container-1"}) @@ -355,20 +417,46 @@ func TestServiceCreateAndDeleteNodeEnrollment(t *testing.T) { } } -func TestServiceCreateNodeEnrollmentWithExistingStateIsIdempotent(t *testing.T) { +func TestServiceCreateNodeEnrollmentReplacesExistingToken(t *testing.T) { rdb := newThunderRedisClient(t) defer rdb.Close() repo := NewRedisRepository(rdb) agentToken := "agent-token" validator := &fakeAgentStateValidator{state: &model.AgentTokenState{WorkspaceID: "workspace-1", PoolName: "pool-1", MachineID: "machine-1"}} - if err := repo.SaveNodeEnrollment(context.Background(), &NodeEnrollmentState{WorkspaceID: "workspace-1", PoolName: "pool-1", MachineID: "machine-1", EnrollmentTokenID: "node-token-existing"}, 0); err != nil { + if err := repo.SaveZone(context.Background(), &ZoneState{WorkspaceID: "workspace-1", PoolName: "pool-1", ThunderZoneID: "zone-existing"}); err != nil { t.Fatal(err) } + if err := repo.SaveNodeEnrollment(context.Background(), &NodeEnrollmentState{WorkspaceID: "workspace-1", PoolName: "pool-1", MachineID: "machine-1", EnrollmentTokenID: "node-token-old"}, 0); err != nil { + t.Fatal(err) + } + + var createTokenCalls int + var deleted []string + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch { + case r.Method == http.MethodPost && r.URL.Path == thunderEnrollmentTokenPath: + createTokenCalls++ + payload := map[string]any{} + if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { + t.Fatal(err) + } + if payload["zoneId"] != "zone-existing" || payload["role"] != thunderEnrollmentRoleServer { + t.Fatalf("node enrollment payload = %+v", payload) + } + _ = json.NewEncoder(w).Encode(EnrollmentToken{EnrollmentTokenID: "node-token-new", EnrollmentToken: "tr_node_new", ZoneID: "zone-existing", Role: thunderEnrollmentRoleServer}) + case r.Method == http.MethodDelete && strings.HasPrefix(r.URL.Path, "/api/v1/enrollment-tokens/"): + deleted = append(deleted, strings.TrimSuffix(strings.TrimPrefix(r.URL.Path, "/api/v1/enrollment-tokens/"), "/node")) + _ = json.NewEncoder(w).Encode(DeleteEnrollmentTokenNodeResponse{NodeDeleted: true}) + default: + t.Fatalf("unexpected request = %s %s", r.Method, r.URL.Path) + } + })) + defer server.Close() service, err := NewService(ServiceOpts{ Repository: repo, - Client: NewClient("https://central.example", "central-token", nil), + Client: NewClient(server.URL, "central-token", server.Client()), ContainerRepo: repository.NewContainerRedisRepositoryForTest(rdb), WorkerRepo: repository.NewWorkerRedisRepositoryForTest(rdb), AgentStateValidator: validator, @@ -380,9 +468,22 @@ func TestServiceCreateNodeEnrollmentWithExistingStateIsIdempotent(t *testing.T) if err != nil { t.Fatal(err) } - if !resp.Ok || resp.ErrorMsg != "" || resp.EnrollmentToken != "" { + if !resp.Ok || resp.ErrorMsg != "" || resp.EnrollmentToken != "tr_node_new" { t.Fatalf("CreateNodeEnrollment() = %+v", resp) } + if createTokenCalls != 1 { + t.Fatalf("createTokenCalls = %d", createTokenCalls) + } + if len(deleted) != 1 || deleted[0] != "node-token-old" { + t.Fatalf("deleted tokens = %+v", deleted) + } + state, found, err := repo.GetNodeEnrollment(context.Background(), "workspace-1", "pool-1", "machine-1") + if err != nil || !found { + t.Fatalf("GetNodeEnrollment() found=%v err=%v", found, err) + } + if state.EnrollmentTokenID != "node-token-new" { + t.Fatalf("node enrollment state = %+v", state) + } } func TestServiceCreateNodeEnrollmentRequiresValidAgentToken(t *testing.T) { From 08e4c6683ebd62764596ebde829fed646f5e4fc8 Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Wed, 29 Jul 2026 18:03:14 +0000 Subject: [PATCH 16/26] fixed redis hashing --- pkg/common/keys.go | 4 ++-- pkg/common/keys_test.go | 42 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 pkg/common/keys_test.go diff --git a/pkg/common/keys.go b/pkg/common/keys.go index d133cc79e..fdcf393a3 100644 --- a/pkg/common/keys.go +++ b/pkg/common/keys.go @@ -144,8 +144,8 @@ var ( ) var ( - thunderClientEnrollment string = "thunder:client:%s" - thunderClientEnrollmentIndex string = "thunder:clients" + thunderClientEnrollment string = "thunder:{client_enrollments}:client:%s" + thunderClientEnrollmentIndex string = "thunder:{client_enrollments}:clients" thunderNodeEnrollment string = "thunder:{%s}:pool:%s:machine:%s:node" thunderNodeEnrollmentIndex string = "thunder:{%s}:pool:%s:nodes" thunderZone string = "thunder:{%s}:pool:%s:zone" diff --git a/pkg/common/keys_test.go b/pkg/common/keys_test.go new file mode 100644 index 000000000..58630dd36 --- /dev/null +++ b/pkg/common/keys_test.go @@ -0,0 +1,42 @@ +package common + +import "testing" + +func TestThunderClientEnrollmentKeysShareHashTag(t *testing.T) { + stateKey := RedisKeys.ThunderClientEnrollment("container-1") + indexKey := RedisKeys.ThunderClientEnrollmentIndex() + + stateTag, ok := redisHashTag(stateKey) + if !ok { + t.Fatalf("state key %q has no hash tag", stateKey) + } + indexTag, ok := redisHashTag(indexKey) + if !ok { + t.Fatalf("index key %q has no hash tag", indexKey) + } + if stateTag != indexTag { + t.Fatalf("hash tags differ: state %q index %q", stateTag, indexTag) + } +} + +func redisHashTag(key string) (string, bool) { + start := -1 + for i, ch := range key { + if ch == '{' { + start = i + break + } + } + if start < 0 { + return "", false + } + for i := start + 1; i < len(key); i++ { + if key[i] == '}' { + if i == start+1 { + return "", false + } + return key[start+1 : i], true + } + } + return "", false +} From fa51446cb2653faee10aba0f39a44bb97eeb2aac Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Wed, 29 Jul 2026 18:31:12 +0000 Subject: [PATCH 17/26] bugfixes --- pkg/gateway/services/thunder/service.go | 93 ++++-- pkg/gateway/services/thunder/service_test.go | 323 +++++++++++++++++++ 2 files changed, 394 insertions(+), 22 deletions(-) diff --git a/pkg/gateway/services/thunder/service.go b/pkg/gateway/services/thunder/service.go index 647152590..76b40db1f 100644 --- a/pkg/gateway/services/thunder/service.go +++ b/pkg/gateway/services/thunder/service.go @@ -13,6 +13,7 @@ import ( "github.com/beam-cloud/beta9/pkg/repository" "github.com/beam-cloud/beta9/pkg/types" pb "github.com/beam-cloud/beta9/proto" + "github.com/rs/zerolog/log" ) type ThunderClient interface { @@ -133,11 +134,7 @@ func (s *Service) CreateClientEnrollment(ctx context.Context, req *pb.CreateClie } return err } - if previousEnrollmentTokenID != "" && previousEnrollmentTokenID != enrollment.EnrollmentTokenID { - if _, err := s.client.DeleteEnrollmentTokenNode(ctx, previousEnrollmentTokenID); err != nil && !isThunderNotFound(err) { - return fmt.Errorf("failed to revoke previous Thunder client enrollment token %q: %w", previousEnrollmentTokenID, err) - } - } + s.revokePreviousEnrollmentToken(ctx, previousEnrollmentTokenID, enrollment.EnrollmentTokenID, attrs.workspaceID, attrs.poolName, "container", containerID) return nil }) if err != nil { @@ -147,6 +144,24 @@ func (s *Service) CreateClientEnrollment(ctx context.Context, req *pb.CreateClie return &pb.CreateClientEnrollmentResponse{Ok: true, InstallCommand: installCommand}, nil } +func (s *Service) revokePreviousEnrollmentToken(ctx context.Context, previousEnrollmentTokenID, currentEnrollmentTokenID, workspaceID, poolName, ownerType, ownerID string) { + previousEnrollmentTokenID = strings.TrimSpace(previousEnrollmentTokenID) + currentEnrollmentTokenID = strings.TrimSpace(currentEnrollmentTokenID) + if previousEnrollmentTokenID == "" || previousEnrollmentTokenID == currentEnrollmentTokenID { + return + } + if _, err := s.client.DeleteEnrollmentTokenNode(ctx, previousEnrollmentTokenID); err != nil && !isThunderNotFound(err) { + log.Warn(). + Err(err). + Str("workspace_id", workspaceID). + Str("pool_name", poolName). + Str("owner_type", ownerType). + Str("owner_id", ownerID). + Str("enrollment_token_id", previousEnrollmentTokenID). + Msg("failed to revoke previous Thunder enrollment token") + } +} + func (s *Service) DeleteClientEnrollment(ctx context.Context, req *pb.DeleteClientEnrollmentRequest) (*pb.DeleteClientEnrollmentResponse, error) { containerID := strings.TrimSpace(req.GetContainerId()) if containerID == "" { @@ -167,13 +182,35 @@ func (s *Service) DeleteClientEnrollment(ctx context.Context, req *pb.DeleteClie return &pb.DeleteClientEnrollmentResponse{ErrorMsg: err.Error()}, nil } - if strings.TrimSpace(state.EnrollmentTokenID) != "" { - _, err = s.client.DeleteEnrollmentTokenNode(ctx, state.EnrollmentTokenID) - if err != nil && !isThunderNotFound(err) { - return &pb.DeleteClientEnrollmentResponse{ErrorMsg: err.Error()}, nil + initialEnrollmentTokenID := strings.TrimSpace(state.EnrollmentTokenID) + err = s.repo.WithPoolLock(ctx, state.WorkspaceID, state.PoolName, func(ctx context.Context) error { + current, found, err := s.repo.GetClientEnrollment(ctx, containerID) + if err != nil { + return err } - } - if err := s.repo.DeleteClientEnrollment(ctx, containerID); err != nil { + if !found { + return nil + } + if current.WorkspaceID != state.WorkspaceID || current.PoolName != state.PoolName { + return nil + } + if err := requireWorkerToken(ctx, current.WorkspaceID); err != nil { + return err + } + + currentEnrollmentTokenID := strings.TrimSpace(current.EnrollmentTokenID) + if currentEnrollmentTokenID != initialEnrollmentTokenID { + return nil + } + if currentEnrollmentTokenID != "" { + _, err = s.client.DeleteEnrollmentTokenNode(ctx, currentEnrollmentTokenID) + if err != nil && !isThunderNotFound(err) { + return err + } + } + return s.repo.DeleteClientEnrollment(ctx, containerID) + }) + if err != nil { return &pb.DeleteClientEnrollmentResponse{ErrorMsg: err.Error()}, nil } return &pb.DeleteClientEnrollmentResponse{Ok: true}, nil @@ -217,11 +254,7 @@ func (s *Service) CreateNodeEnrollment(ctx context.Context, req *pb.CreateNodeEn } return err } - if previousEnrollmentTokenID != "" && previousEnrollmentTokenID != enrollment.EnrollmentTokenID { - if _, err := s.client.DeleteEnrollmentTokenNode(ctx, previousEnrollmentTokenID); err != nil && !isThunderNotFound(err) { - return fmt.Errorf("failed to revoke previous Thunder node enrollment token %q: %w", previousEnrollmentTokenID, err) - } - } + s.revokePreviousEnrollmentToken(ctx, previousEnrollmentTokenID, enrollment.EnrollmentTokenID, agentState.WorkspaceID, agentState.PoolName, "machine", agentState.MachineID) enrollmentToken = enrollment.EnrollmentToken return nil }) @@ -245,14 +278,30 @@ func (s *Service) DeleteNodeEnrollment(ctx context.Context, req *pb.DeleteNodeEn if !found { return &pb.DeleteNodeEnrollmentResponse{Ok: true}, nil } + initialEnrollmentTokenID := strings.TrimSpace(state.EnrollmentTokenID) - if strings.TrimSpace(state.EnrollmentTokenID) != "" { - _, err = s.client.DeleteEnrollmentTokenNode(ctx, state.EnrollmentTokenID) - if err != nil && !isThunderNotFound(err) { - return &pb.DeleteNodeEnrollmentResponse{ErrorMsg: err.Error()}, nil + err = s.repo.WithPoolLock(ctx, agentState.WorkspaceID, agentState.PoolName, func(ctx context.Context) error { + current, found, err := s.repo.GetNodeEnrollment(ctx, agentState.WorkspaceID, agentState.PoolName, agentState.MachineID) + if err != nil { + return err } - } - if err := s.repo.DeleteNodeEnrollment(ctx, agentState.WorkspaceID, agentState.PoolName, agentState.MachineID); err != nil { + if !found { + return nil + } + + currentEnrollmentTokenID := strings.TrimSpace(current.EnrollmentTokenID) + if currentEnrollmentTokenID != initialEnrollmentTokenID { + return nil + } + if currentEnrollmentTokenID != "" { + _, err = s.client.DeleteEnrollmentTokenNode(ctx, currentEnrollmentTokenID) + if err != nil && !isThunderNotFound(err) { + return err + } + } + return s.repo.DeleteNodeEnrollment(ctx, agentState.WorkspaceID, agentState.PoolName, agentState.MachineID) + }) + if err != nil { return &pb.DeleteNodeEnrollmentResponse{ErrorMsg: err.Error()}, nil } return &pb.DeleteNodeEnrollmentResponse{Ok: true}, nil diff --git a/pkg/gateway/services/thunder/service_test.go b/pkg/gateway/services/thunder/service_test.go index 99572ff15..068914edc 100644 --- a/pkg/gateway/services/thunder/service_test.go +++ b/pkg/gateway/services/thunder/service_test.go @@ -8,6 +8,7 @@ import ( "net/http/httptest" "strings" "testing" + "time" "github.com/beam-cloud/beta9/pkg/auth" model "github.com/beam-cloud/beta9/pkg/compute" @@ -250,6 +251,55 @@ func TestServiceCreateClientEnrollmentReplacesExistingToken(t *testing.T) { } } +func TestServiceCreateClientEnrollmentSucceedsWhenPreviousTokenRevokeFails(t *testing.T) { + rdb := newThunderRedisClient(t) + defer rdb.Close() + + containerRepo := repository.NewContainerRedisRepositoryForTest(rdb) + workerRepo := repository.NewWorkerRedisRepositoryForTest(rdb) + if err := workerRepo.AddWorker(&types.Worker{Id: "worker-1", PoolName: "pool-1", MachineId: "machine-1"}); err != nil { + t.Fatal(err) + } + if err := containerRepo.SetContainerState("container-1", &types.ContainerState{ContainerId: "container-1", WorkspaceId: "workspace-1", WorkerId: "worker-1", MachineId: "machine-1", Gpu: "H100", GpuCount: 1}); err != nil { + t.Fatal(err) + } + repo := NewRedisRepository(rdb) + if err := repo.SaveZone(context.Background(), &ZoneState{WorkspaceID: "workspace-1", PoolName: "pool-1", ThunderZoneID: "zone-existing"}); err != nil { + t.Fatal(err) + } + if err := repo.SaveClientEnrollment(context.Background(), &ClientEnrollmentState{ContainerID: "container-1", WorkspaceID: "workspace-1", WorkerID: "worker-1", MachineID: "machine-1", PoolName: "pool-1", EnrollmentTokenID: "token-old"}, 0); err != nil { + t.Fatal(err) + } + + client := &recordingThunderClient{ + clientEnrollment: &EnrollmentToken{EnrollmentTokenID: "token-new", EnrollmentToken: "tr_client_new", ZoneID: "zone-existing", Role: thunderEnrollmentRoleClient}, + installCommand: "curl install thunder", + deleteErr: errors.New("Thunder delete failed"), + } + service, err := NewService(ServiceOpts{Repository: repo, Client: client, ContainerRepo: containerRepo, WorkerRepo: workerRepo}) + if err != nil { + t.Fatal(err) + } + + resp, err := service.CreateClientEnrollment(thunderWorkerAuthContext(types.TokenTypeWorker, ""), &pb.CreateClientEnrollmentRequest{ContainerId: "container-1"}) + if err != nil { + t.Fatal(err) + } + if !resp.Ok || resp.ErrorMsg != "" || resp.InstallCommand != "curl install thunder" { + t.Fatalf("CreateClientEnrollment() = %+v", resp) + } + if len(client.deletedEnrollmentTokenIDs) != 1 || client.deletedEnrollmentTokenIDs[0] != "token-old" { + t.Fatalf("deleted enrollment token ids = %+v", client.deletedEnrollmentTokenIDs) + } + state, found, err := repo.GetClientEnrollment(context.Background(), "container-1") + if err != nil || !found { + t.Fatalf("GetClientEnrollment() found=%v err=%v", found, err) + } + if state.EnrollmentTokenID != "token-new" { + t.Fatalf("client enrollment state = %+v", state) + } +} + func TestServiceCreateClientEnrollmentRequiresWorkerToken(t *testing.T) { service := &Service{} resp, err := service.CreateClientEnrollment(context.Background(), &pb.CreateClientEnrollmentRequest{ContainerId: "container-1"}) @@ -486,6 +536,134 @@ func TestServiceCreateNodeEnrollmentReplacesExistingToken(t *testing.T) { } } +func TestServiceCreateNodeEnrollmentSucceedsWhenPreviousTokenRevokeFails(t *testing.T) { + rdb := newThunderRedisClient(t) + defer rdb.Close() + + repo := NewRedisRepository(rdb) + if err := repo.SaveZone(context.Background(), &ZoneState{WorkspaceID: "workspace-1", PoolName: "pool-1", ThunderZoneID: "zone-existing"}); err != nil { + t.Fatal(err) + } + if err := repo.SaveNodeEnrollment(context.Background(), &NodeEnrollmentState{WorkspaceID: "workspace-1", PoolName: "pool-1", MachineID: "machine-1", EnrollmentTokenID: "node-token-old"}, 0); err != nil { + t.Fatal(err) + } + + client := &recordingThunderClient{ + serverEnrollment: &EnrollmentToken{EnrollmentTokenID: "node-token-new", EnrollmentToken: "tr_node_new", ZoneID: "zone-existing", Role: thunderEnrollmentRoleServer}, + deleteErr: errors.New("Thunder delete failed"), + } + service, err := NewService(ServiceOpts{ + Repository: repo, + Client: client, + ContainerRepo: repository.NewContainerRedisRepositoryForTest(rdb), + WorkerRepo: repository.NewWorkerRedisRepositoryForTest(rdb), + AgentStateValidator: &fakeAgentStateValidator{state: &model.AgentTokenState{WorkspaceID: "workspace-1", PoolName: "pool-1", MachineID: "machine-1"}}, + }) + if err != nil { + t.Fatal(err) + } + + resp, err := service.CreateNodeEnrollment(context.Background(), &pb.CreateNodeEnrollmentRequest{AgentToken: "agent-token"}) + if err != nil { + t.Fatal(err) + } + if !resp.Ok || resp.ErrorMsg != "" || resp.EnrollmentToken != "tr_node_new" { + t.Fatalf("CreateNodeEnrollment() = %+v", resp) + } + if len(client.deletedEnrollmentTokenIDs) != 1 || client.deletedEnrollmentTokenIDs[0] != "node-token-old" { + t.Fatalf("deleted enrollment token ids = %+v", client.deletedEnrollmentTokenIDs) + } + state, found, err := repo.GetNodeEnrollment(context.Background(), "workspace-1", "pool-1", "machine-1") + if err != nil || !found { + t.Fatalf("GetNodeEnrollment() found=%v err=%v", found, err) + } + if state.EnrollmentTokenID != "node-token-new" { + t.Fatalf("node enrollment state = %+v", state) + } +} + +func TestServiceDeleteClientEnrollmentSkipsChangedTokenUnderPoolLock(t *testing.T) { + repo := &lockingThunderRepository{ + clientBeforeLock: &ClientEnrollmentState{ + ContainerID: "container-1", + WorkspaceID: "workspace-1", + PoolName: "pool-1", + EnrollmentTokenID: "token-old", + }, + clientInsideLock: &ClientEnrollmentState{ + ContainerID: "container-1", + WorkspaceID: "workspace-1", + PoolName: "pool-1", + EnrollmentTokenID: "token-new", + }, + } + client := &recordingThunderClient{} + service := &Service{repo: repo, client: client} + + resp, err := service.DeleteClientEnrollment(thunderWorkerAuthContext(types.TokenTypeWorker, ""), &pb.DeleteClientEnrollmentRequest{ContainerId: "container-1"}) + if err != nil { + t.Fatal(err) + } + if !resp.Ok || resp.ErrorMsg != "" { + t.Fatalf("DeleteClientEnrollment() = %+v", resp) + } + if repo.lockedWorkspaceID != "workspace-1" || repo.lockedPoolName != "pool-1" { + t.Fatalf("pool lock = workspace %q pool %q", repo.lockedWorkspaceID, repo.lockedPoolName) + } + if repo.clientGetCalls != 2 { + t.Fatalf("client get calls = %d", repo.clientGetCalls) + } + if repo.deletedClientID != "" { + t.Fatalf("deleted client id = %q", repo.deletedClientID) + } + if len(client.deletedEnrollmentTokenIDs) != 0 { + t.Fatalf("deleted enrollment token ids = %+v", client.deletedEnrollmentTokenIDs) + } +} + +func TestServiceDeleteNodeEnrollmentSkipsChangedTokenUnderPoolLock(t *testing.T) { + repo := &lockingThunderRepository{ + nodeBeforeLock: &NodeEnrollmentState{ + WorkspaceID: "workspace-1", + PoolName: "pool-1", + MachineID: "machine-1", + EnrollmentTokenID: "node-token-old", + }, + nodeInsideLock: &NodeEnrollmentState{ + WorkspaceID: "workspace-1", + PoolName: "pool-1", + MachineID: "machine-1", + EnrollmentTokenID: "node-token-new", + }, + } + client := &recordingThunderClient{} + service := &Service{ + repo: repo, + client: client, + agentValidator: &fakeAgentStateValidator{state: &model.AgentTokenState{WorkspaceID: "workspace-1", PoolName: "pool-1", MachineID: "machine-1"}}, + } + + resp, err := service.DeleteNodeEnrollment(context.Background(), &pb.DeleteNodeEnrollmentRequest{AgentToken: "agent-token"}) + if err != nil { + t.Fatal(err) + } + if !resp.Ok || resp.ErrorMsg != "" { + t.Fatalf("DeleteNodeEnrollment() = %+v", resp) + } + if repo.lockedWorkspaceID != "workspace-1" || repo.lockedPoolName != "pool-1" { + t.Fatalf("pool lock = workspace %q pool %q", repo.lockedWorkspaceID, repo.lockedPoolName) + } + if repo.nodeGetOutsideLockCalls != 1 { + t.Fatalf("node get outside lock calls = %d", repo.nodeGetOutsideLockCalls) + } + if repo.deletedNodeMachineID != "" { + t.Fatalf("deleted node machine id = %q", repo.deletedNodeMachineID) + } + if len(client.deletedEnrollmentTokenIDs) != 0 { + t.Fatalf("deleted enrollment token ids = %+v", client.deletedEnrollmentTokenIDs) + } +} + func TestServiceCreateNodeEnrollmentRequiresValidAgentToken(t *testing.T) { rdb := newThunderRedisClient(t) defer rdb.Close() @@ -508,6 +686,151 @@ func TestServiceCreateNodeEnrollmentRequiresValidAgentToken(t *testing.T) { } } +type recordingThunderClient struct { + zone *Zone + clientEnrollment *EnrollmentToken + serverEnrollment *EnrollmentToken + installCommand string + deleteErr error + deletedEnrollmentTokenIDs []string +} + +func (c *recordingThunderClient) CreateZone(ctx context.Context, displayName string) (*Zone, error) { + if c.zone == nil { + return nil, errors.New("unexpected CreateZone call") + } + zone := *c.zone + return &zone, nil +} + +func (c *recordingThunderClient) CreateClientEnrollmentToken(ctx context.Context, zoneID, gpuType string, gpuCount int) (*EnrollmentToken, error) { + if c.clientEnrollment == nil { + return nil, errors.New("unexpected CreateClientEnrollmentToken call") + } + enrollment := *c.clientEnrollment + return &enrollment, nil +} + +func (c *recordingThunderClient) CreateServerEnrollmentToken(ctx context.Context, zoneID string) (*EnrollmentToken, error) { + if c.serverEnrollment == nil { + return nil, errors.New("unexpected CreateServerEnrollmentToken call") + } + enrollment := *c.serverEnrollment + return &enrollment, nil +} + +func (c *recordingThunderClient) DeleteEnrollmentTokenNode(ctx context.Context, enrollmentTokenID string) (*DeleteEnrollmentTokenNodeResponse, error) { + c.deletedEnrollmentTokenIDs = append(c.deletedEnrollmentTokenIDs, enrollmentTokenID) + if c.deleteErr != nil { + return nil, c.deleteErr + } + return &DeleteEnrollmentTokenNodeResponse{EnrollmentTokenID: enrollmentTokenID, NodeDeleted: true}, nil +} + +func (c *recordingThunderClient) ClientInstallCommand(enrollmentToken string) (string, error) { + if c.installCommand == "" { + return "", errors.New("unexpected ClientInstallCommand call") + } + return c.installCommand, nil +} + +type lockingThunderRepository struct { + inLock bool + lockedWorkspaceID string + lockedPoolName string + clientGetCalls int + nodeGetOutsideLockCalls int + clientBeforeLock *ClientEnrollmentState + clientInsideLock *ClientEnrollmentState + nodeBeforeLock *NodeEnrollmentState + nodeInsideLock *NodeEnrollmentState + deletedClientID string + deletedNodeMachineID string +} + +func (r *lockingThunderRepository) WithPoolLock(ctx context.Context, workspaceID, poolName string, fn func(context.Context) error) error { + r.lockedWorkspaceID = workspaceID + r.lockedPoolName = poolName + r.inLock = true + defer func() { r.inLock = false }() + return fn(ctx) +} + +func (r *lockingThunderRepository) GetClientEnrollment(ctx context.Context, containerID string) (*ClientEnrollmentState, bool, error) { + r.clientGetCalls++ + state := r.clientBeforeLock + if r.inLock { + state = r.clientInsideLock + } + if state == nil { + return nil, false, nil + } + copy := *state + return ©, true, nil +} + +func (r *lockingThunderRepository) SaveClientEnrollment(ctx context.Context, state *ClientEnrollmentState, ttl time.Duration) error { + return errors.New("unexpected SaveClientEnrollment call") +} + +func (r *lockingThunderRepository) DeleteClientEnrollment(ctx context.Context, containerID string) error { + if !r.inLock { + return errors.New("DeleteClientEnrollment called outside pool lock") + } + r.deletedClientID = containerID + return nil +} + +func (r *lockingThunderRepository) ListClientEnrollments(ctx context.Context) ([]*ClientEnrollmentState, error) { + return nil, errors.New("unexpected ListClientEnrollments call") +} + +func (r *lockingThunderRepository) GetNodeEnrollment(ctx context.Context, workspaceID, poolName, machineID string) (*NodeEnrollmentState, bool, error) { + state := r.nodeBeforeLock + if !r.inLock { + r.nodeGetOutsideLockCalls++ + } else { + state = r.nodeInsideLock + } + if state == nil { + return nil, false, nil + } + copy := *state + return ©, true, nil +} + +func (r *lockingThunderRepository) SaveNodeEnrollment(ctx context.Context, state *NodeEnrollmentState, ttl time.Duration) error { + return errors.New("unexpected SaveNodeEnrollment call") +} + +func (r *lockingThunderRepository) DeleteNodeEnrollment(ctx context.Context, workspaceID, poolName, machineID string) error { + if !r.inLock { + return errors.New("DeleteNodeEnrollment called outside pool lock") + } + r.deletedNodeMachineID = machineID + return nil +} + +func (r *lockingThunderRepository) ListNodeEnrollments(ctx context.Context, workspaceID, poolName string) ([]*NodeEnrollmentState, error) { + return nil, errors.New("unexpected ListNodeEnrollments call") +} + +func (r *lockingThunderRepository) GetZone(ctx context.Context, workspaceID, poolName string) (*ZoneState, bool, error) { + return nil, false, errors.New("unexpected GetZone call") +} + +func (r *lockingThunderRepository) SaveZone(ctx context.Context, state *ZoneState) error { + return errors.New("unexpected SaveZone call") +} + +func (r *lockingThunderRepository) DeleteZone(ctx context.Context, workspaceID, poolName string) error { + return errors.New("unexpected DeleteZone call") +} + +func (r *lockingThunderRepository) ListZones(ctx context.Context, workspaceID string) ([]*ZoneState, error) { + return nil, errors.New("unexpected ListZones call") +} + type fakeAgentStateValidator struct { state *model.AgentTokenState err error From bd73d5be0a4d089e7ded8d4952e5d0fe08e95f59 Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Wed, 29 Jul 2026 21:59:06 +0000 Subject: [PATCH 18/26] tailscale ip formatting --- pkg/agent/thunder.go | 25 +++++++++++++++++++++++++ pkg/agent/transport.go | 5 +---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/pkg/agent/thunder.go b/pkg/agent/thunder.go index cb58d6c24..473643795 100644 --- a/pkg/agent/thunder.go +++ b/pkg/agent/thunder.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "io" + "net" "net/netip" "os/exec" "strings" @@ -94,6 +95,30 @@ func thunderReachableNodeIP(ips []netip.Addr) (string, error) { return "", fmt.Errorf("tailscale IP address is required for Thunder node enrollment") } +func hostTailscaleIPs() []netip.Addr { + iface, err := net.InterfaceByName("tailscale0") + if err != nil { + return nil + } + addrs, err := iface.Addrs() + if err != nil { + return nil + } + + ips := make([]netip.Addr, 0, len(addrs)) + for _, addr := range addrs { + prefix, err := netip.ParsePrefix(addr.String()) + if err == nil { + ips = append(ips, prefix.Addr()) + continue + } + if ip, err := netip.ParseAddr(addr.String()); err == nil { + ips = append(ips, ip) + } + } + return ips +} + func thunderNodeInstallCommand(reachableIP, enrollmentToken string) string { return "curl -fsSL https://get.thundercompute.com/install.sh | sudo THUNDER_INSTALL_MODE=thunderd THUNDERD_IP=" + common.ShellQuote(reachableIP) + " THUNDER_ENROLLMENT_TOKEN=" + common.ShellQuote(enrollmentToken) + " sh" } diff --git a/pkg/agent/transport.go b/pkg/agent/transport.go index 0acd338b9..56955f282 100644 --- a/pkg/agent/transport.go +++ b/pkg/agent/transport.go @@ -6,7 +6,6 @@ import ( "fmt" "io" "net" - "net/netip" "sort" "strconv" "strings" @@ -80,16 +79,14 @@ func runTSNetRouteProxy(ctx context.Context, client pb.GatewayServiceClient, age } hostname := credential.Hostname - var tailscaleIPs []netip.Addr if localClient, err := server.LocalClient(); err == nil { if status, err := localClient.Status(ctx); err == nil { - tailscaleIPs = append(tailscaleIPs, status.TailscaleIPs...) if status.Self != nil && status.Self.DNSName != "" { hostname = strings.TrimSuffix(status.Self.DNSName, ".") } } } - if err := setupThunderNode(ctx, client, agentToken, tailscaleIPs, stdout, stderr); err != nil { + if err := setupThunderNode(ctx, client, agentToken, hostTailscaleIPs(), stdout, stderr); err != nil { fmt.Fprintf(stderr, "Thunder node enrollment skipped: %v\n", err) } else { defer deleteThunderNodeEnrollment(context.Background(), client, agentToken, stderr) From c0be6885dc25492f7306eaeae72b556e116ea9d3 Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Thu, 6 Aug 2026 01:38:51 +0000 Subject: [PATCH 19/26] added pool-level wiring of gpu virtualization --- pkg/agent/agent_test.go | 3 +- pkg/agent/worker_config.go | 2 + pkg/gateway/gateway.proto | 1 + pkg/gateway/services/compute/agent.go | 1 + pkg/gateway/services/compute/compute_test.go | 2 + pkg/types/config.go | 1 + proto/gateway.pb.go | 7234 +++++------------- 7 files changed, 1802 insertions(+), 5442 deletions(-) diff --git a/pkg/agent/agent_test.go b/pkg/agent/agent_test.go index a3b25f437..dcfcd9363 100644 --- a/pkg/agent/agent_test.go +++ b/pkg/agent/agent_test.go @@ -673,6 +673,7 @@ func TestAgentWorkerConfigUsesManagedPoolRuntimeAndCacheSettings(t *testing.T) { Mode: string(types.PoolModeExternal), PoolConfig: &pb.AgentPoolRuntimeConfig{ NetworkPreallocation: false, + GpuVirtualized: true, CriuEnabled: false, TmpSizeLimit: "50Gi", StorageMode: types.StorageModeAlluxio, @@ -692,7 +693,7 @@ func TestAgentWorkerConfigUsesManagedPoolRuntimeAndCacheSettings(t *testing.T) { config := newAgentWorkerConfig(bootstrapConfig{WorkspaceID: "admin-workspace"}, slot).sanitizedForAgent() pool := config.Worker.Pools[slot.PoolName] - if pool.NetworkPreallocation || pool.CRIUEnabled || pool.TmpSizeLimit != "50Gi" || pool.StorageMode != types.StorageModeAlluxio { + if pool.NetworkPreallocation || pool.CRIUEnabled || !pool.GpuVirtualized || pool.TmpSizeLimit != "50Gi" || pool.StorageMode != types.StorageModeAlluxio { t.Fatalf("managed pool runtime settings were not preserved: %#v", pool) } if !config.Cache.Enabled || !config.Worker.CacheEnabled || diff --git a/pkg/agent/worker_config.go b/pkg/agent/worker_config.go index 743468f33..8502aa238 100644 --- a/pkg/agent/worker_config.go +++ b/pkg/agent/worker_config.go @@ -145,6 +145,7 @@ type agentConfigPool struct { GPUType string `json:"gpuType"` ContainerRuntime string `json:"containerRuntime"` ContainerRuntimeConfig agentConfigRuntimeConfig `json:"containerRuntimeConfig"` + GpuVirtualized bool `json:"gpuVirtualized"` ContainerStartConcurrency int `json:"containerStartConcurrency"` NetworkPreallocation bool `json:"networkPreallocation"` NetworkSlotPoolSize int `json:"networkSlotPoolSize"` @@ -309,6 +310,7 @@ func newAgentWorkerConfig(bootstrap bootstrapConfig, slot *pb.AgentWorkerSlot) a GPUType: slot.Gpu, ContainerRuntime: poolRuntime, ContainerRuntimeConfig: agentRuntimeConfig, + GpuVirtualized: poolConfig.GetGpuVirtualized(), ContainerStartConcurrency: int(slot.ContainerStartConcurrency), NetworkPreallocation: networkPreallocation, NetworkSlotPoolSize: int(slot.NetworkSlotPoolSize), diff --git a/pkg/gateway/gateway.proto b/pkg/gateway/gateway.proto index 8b03b40ec..8a48484e0 100644 --- a/pkg/gateway/gateway.proto +++ b/pkg/gateway/gateway.proto @@ -1904,4 +1904,5 @@ message AgentPoolRuntimeConfig { string durable_disks_path = 7; AgentPoolCacheConfig cache = 8; string config_group = 9; + bool gpu_virtualized = 10; } diff --git a/pkg/gateway/services/compute/agent.go b/pkg/gateway/services/compute/agent.go index 5077fa0dc..7067c9f54 100644 --- a/pkg/gateway/services/compute/agent.go +++ b/pkg/gateway/services/compute/agent.go @@ -928,6 +928,7 @@ func agentPoolRuntimeConfigToProto(config *types.WorkerPoolConfig) *pb.AgentPool ImagesPath: config.ImagesPath, DurableDisksPath: config.DurableDisksPath, ConfigGroup: config.ConfigGroup, + GpuVirtualized: config.GpuVirtualized, Cache: &pb.AgentPoolCacheConfig{ Enabled: cacheEnabled, Disk: &pb.AgentPoolCacheDiskConfig{ diff --git a/pkg/gateway/services/compute/compute_test.go b/pkg/gateway/services/compute/compute_test.go index de4d81136..e9fdaccea 100644 --- a/pkg/gateway/services/compute/compute_test.go +++ b/pkg/gateway/services/compute/compute_test.go @@ -5671,6 +5671,7 @@ func TestAgentWorkerSlotStateCarriesMarketplaceModeAndRuntime(t *testing.T) { ContainerStartConcurrency: 64, NetworkSlotPoolSize: 128, NetworkPreallocation: &networkPreallocation, + GpuVirtualized: true, Priority: 10, CRIUEnabled: false, TmpSizeLimit: "50Gi", @@ -5698,6 +5699,7 @@ func TestAgentWorkerSlotStateCarriesMarketplaceModeAndRuntime(t *testing.T) { } if wireSlot.PoolConfig == nil || wireSlot.PoolConfig.NetworkPreallocation || + !wireSlot.PoolConfig.GpuVirtualized || wireSlot.PoolConfig.CriuEnabled || wireSlot.PoolConfig.StoragePath != "/mnt/raid/storage" || wireSlot.PoolConfig.ImagesPath != "/mnt/raid/images" || diff --git a/pkg/types/config.go b/pkg/types/config.go index f433aa81a..8dfb9fbdf 100644 --- a/pkg/types/config.go +++ b/pkg/types/config.go @@ -463,6 +463,7 @@ type WorkerPoolConfig struct { ContainerRuntime string `key:"containerRuntime" json:"container_runtime"` // Pool-specific container runtime: "runc" or "gvisor" ContainerRuntimeConfig RuntimeConfig `key:"containerRuntimeConfig" json:"container_runtime_config"` // Pool-specific container runtime configuration CPUAffinityEnforced bool `key:"cpuAffinityEnforced" json:"cpu_affinity_enforced"` + GpuVirtualized bool `key:"gpuVirtualized" json:"gpu_virtualized"` ContainerStartConcurrency int `key:"containerStartConcurrency" json:"container_start_concurrency"` NetworkPreallocation *bool `key:"networkPreallocation" json:"network_preallocation"` NetworkSlotPoolSize int `key:"networkSlotPoolSize" json:"network_slot_pool_size"` diff --git a/proto/gateway.pb.go b/proto/gateway.pb.go index 2ed5e4c62..29c4c46c0 100644 --- a/proto/gateway.pb.go +++ b/proto/gateway.pb.go @@ -9292,8 +9292,10 @@ type JoinAgentRequest struct { // Optional per-machine worker image override. The gateway remembers the // generated value as a baseline so untouched installs continue to follow // future image tag changes while manually edited values remain pinned. - WorkerImage string `protobuf:"bytes,17,opt,name=worker_image,json=workerImage,proto3" json:"worker_image,omitempty"` - Capabilities []string `protobuf:"bytes,18,rep,name=capabilities,proto3" json:"capabilities,omitempty"` + WorkerImage string `protobuf:"bytes,17,opt,name=worker_image,json=workerImage,proto3" json:"worker_image,omitempty"` + Capabilities []string `protobuf:"bytes,18,rep,name=capabilities,proto3" json:"capabilities,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *JoinAgentRequest) Reset() { @@ -10382,6 +10384,8 @@ type AgentWorkerSlot struct { Generation string `protobuf:"bytes,25,opt,name=generation,proto3" json:"generation,omitempty"` CpuAffinityEnforced bool `protobuf:"varint,26,opt,name=cpu_affinity_enforced,json=cpuAffinityEnforced,proto3" json:"cpu_affinity_enforced,omitempty"` PoolConfig *AgentPoolRuntimeConfig `protobuf:"bytes,27,opt,name=pool_config,json=poolConfig,proto3" json:"pool_config,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AgentWorkerSlot) Reset() { @@ -10653,13 +10657,9 @@ type StreamAgentResponse struct { ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` Routes []*AgentRoute `protobuf:"bytes,3,rep,name=routes,proto3" json:"routes,omitempty"` Slots []*AgentWorkerSlot `protobuf:"bytes,4,rep,name=slots,proto3" json:"slots,omitempty"` + Ssh *AgentSSHConfig `protobuf:"bytes,5,opt,name=ssh,proto3" json:"ssh,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Routes []*AgentRoute `protobuf:"bytes,3,rep,name=routes,proto3" json:"routes,omitempty"` - Slots []*AgentWorkerSlot `protobuf:"bytes,4,rep,name=slots,proto3" json:"slots,omitempty"` - Ssh *AgentSSHConfig `protobuf:"bytes,5,opt,name=ssh,proto3" json:"ssh,omitempty"` + sizeCache protoimpl.SizeCache } func (x *StreamAgentResponse) Reset() { @@ -11156,27 +11156,26 @@ func (x *AgentTelemetryResponse) GetErrMsg() string { } type Machine struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Cpu int64 `protobuf:"varint,2,opt,name=cpu,proto3" json:"cpu,omitempty"` - Memory int64 `protobuf:"varint,3,opt,name=memory,proto3" json:"memory,omitempty"` - Gpu string `protobuf:"bytes,4,opt,name=gpu,proto3" json:"gpu,omitempty"` - GpuCount uint32 `protobuf:"varint,5,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` - Status string `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"` - PoolName string `protobuf:"bytes,7,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` - ProviderName string `protobuf:"bytes,8,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` - RegistrationToken string `protobuf:"bytes,9,opt,name=registration_token,json=registrationToken,proto3" json:"registration_token,omitempty"` - TailscaleUrl string `protobuf:"bytes,10,opt,name=tailscale_url,json=tailscaleUrl,proto3" json:"tailscale_url,omitempty"` - TailscaleAuth string `protobuf:"bytes,11,opt,name=tailscale_auth,json=tailscaleAuth,proto3" json:"tailscale_auth,omitempty"` - LastKeepalive string `protobuf:"bytes,12,opt,name=last_keepalive,json=lastKeepalive,proto3" json:"last_keepalive,omitempty"` - Created string `protobuf:"bytes,13,opt,name=created,proto3" json:"created,omitempty"` - AgentVersion string `protobuf:"bytes,14,opt,name=agent_version,json=agentVersion,proto3" json:"agent_version,omitempty"` - MachineMetrics *MachineMetrics `protobuf:"bytes,15,opt,name=machine_metrics,json=machineMetrics,proto3" json:"machine_metrics,omitempty"` - UserData string `protobuf:"bytes,16,opt,name=user_data,json=userData,proto3" json:"user_data,omitempty"` - Ssh *MachineSSHAccess `protobuf:"bytes,17,opt,name=ssh,proto3" json:"ssh,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Cpu int64 `protobuf:"varint,2,opt,name=cpu,proto3" json:"cpu,omitempty"` + Memory int64 `protobuf:"varint,3,opt,name=memory,proto3" json:"memory,omitempty"` + Gpu string `protobuf:"bytes,4,opt,name=gpu,proto3" json:"gpu,omitempty"` + GpuCount uint32 `protobuf:"varint,5,opt,name=gpu_count,json=gpuCount,proto3" json:"gpu_count,omitempty"` + Status string `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"` + PoolName string `protobuf:"bytes,7,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + ProviderName string `protobuf:"bytes,8,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` + RegistrationToken string `protobuf:"bytes,9,opt,name=registration_token,json=registrationToken,proto3" json:"registration_token,omitempty"` + TailscaleUrl string `protobuf:"bytes,10,opt,name=tailscale_url,json=tailscaleUrl,proto3" json:"tailscale_url,omitempty"` + TailscaleAuth string `protobuf:"bytes,11,opt,name=tailscale_auth,json=tailscaleAuth,proto3" json:"tailscale_auth,omitempty"` + LastKeepalive string `protobuf:"bytes,12,opt,name=last_keepalive,json=lastKeepalive,proto3" json:"last_keepalive,omitempty"` + Created string `protobuf:"bytes,13,opt,name=created,proto3" json:"created,omitempty"` + AgentVersion string `protobuf:"bytes,14,opt,name=agent_version,json=agentVersion,proto3" json:"agent_version,omitempty"` + MachineMetrics *MachineMetrics `protobuf:"bytes,15,opt,name=machine_metrics,json=machineMetrics,proto3" json:"machine_metrics,omitempty"` + UserData string `protobuf:"bytes,16,opt,name=user_data,json=userData,proto3" json:"user_data,omitempty"` + Ssh *MachineSSHAccess `protobuf:"bytes,17,opt,name=ssh,proto3" json:"ssh,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Machine) Reset() { @@ -13223,21 +13222,18 @@ func (x *UpdateAgentAvailabilityResponse) GetErrMsg() string { // Managed SSH messages live at the end of this file so adding the feature // does not renumber every existing generated message implementation. type DownloadMachineSSHKeyRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + MachineId string `protobuf:"bytes,2,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` unknownFields protoimpl.UnknownFields - - PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` - MachineId string `protobuf:"bytes,2,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DownloadMachineSSHKeyRequest) Reset() { *x = DownloadMachineSSHKeyRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[175] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[179] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DownloadMachineSSHKeyRequest) String() string { @@ -13247,8 +13243,8 @@ func (x *DownloadMachineSSHKeyRequest) String() string { func (*DownloadMachineSSHKeyRequest) ProtoMessage() {} func (x *DownloadMachineSSHKeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[175] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[179] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13260,7 +13256,7 @@ func (x *DownloadMachineSSHKeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DownloadMachineSSHKeyRequest.ProtoReflect.Descriptor instead. func (*DownloadMachineSSHKeyRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{175} + return file_gateway_proto_rawDescGZIP(), []int{179} } func (x *DownloadMachineSSHKeyRequest) GetPoolName() string { @@ -13278,26 +13274,23 @@ func (x *DownloadMachineSSHKeyRequest) GetMachineId() string { } type DownloadMachineSSHKeyResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - PrivateKey string `protobuf:"bytes,3,opt,name=private_key,json=privateKey,proto3" json:"private_key,omitempty"` - Filename string `protobuf:"bytes,4,opt,name=filename,proto3" json:"filename,omitempty"` - Generation uint64 `protobuf:"varint,5,opt,name=generation,proto3" json:"generation,omitempty"` - Fingerprint string `protobuf:"bytes,6,opt,name=fingerprint,proto3" json:"fingerprint,omitempty"` - ActivationRequired bool `protobuf:"varint,7,opt,name=activation_required,json=activationRequired,proto3" json:"activation_required,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + PrivateKey string `protobuf:"bytes,3,opt,name=private_key,json=privateKey,proto3" json:"private_key,omitempty"` + Filename string `protobuf:"bytes,4,opt,name=filename,proto3" json:"filename,omitempty"` + Generation uint64 `protobuf:"varint,5,opt,name=generation,proto3" json:"generation,omitempty"` + Fingerprint string `protobuf:"bytes,6,opt,name=fingerprint,proto3" json:"fingerprint,omitempty"` + ActivationRequired bool `protobuf:"varint,7,opt,name=activation_required,json=activationRequired,proto3" json:"activation_required,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DownloadMachineSSHKeyResponse) Reset() { *x = DownloadMachineSSHKeyResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[176] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[180] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DownloadMachineSSHKeyResponse) String() string { @@ -13307,8 +13300,8 @@ func (x *DownloadMachineSSHKeyResponse) String() string { func (*DownloadMachineSSHKeyResponse) ProtoMessage() {} func (x *DownloadMachineSSHKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[176] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[180] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13320,7 +13313,7 @@ func (x *DownloadMachineSSHKeyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DownloadMachineSSHKeyResponse.ProtoReflect.Descriptor instead. func (*DownloadMachineSSHKeyResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{176} + return file_gateway_proto_rawDescGZIP(), []int{180} } func (x *DownloadMachineSSHKeyResponse) GetOk() bool { @@ -13373,21 +13366,18 @@ func (x *DownloadMachineSSHKeyResponse) GetActivationRequired() bool { } type RotateMachineSSHKeyRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + MachineId string `protobuf:"bytes,2,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` unknownFields protoimpl.UnknownFields - - PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` - MachineId string `protobuf:"bytes,2,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RotateMachineSSHKeyRequest) Reset() { *x = RotateMachineSSHKeyRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[177] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[181] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RotateMachineSSHKeyRequest) String() string { @@ -13397,8 +13387,8 @@ func (x *RotateMachineSSHKeyRequest) String() string { func (*RotateMachineSSHKeyRequest) ProtoMessage() {} func (x *RotateMachineSSHKeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[177] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[181] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13410,7 +13400,7 @@ func (x *RotateMachineSSHKeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RotateMachineSSHKeyRequest.ProtoReflect.Descriptor instead. func (*RotateMachineSSHKeyRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{177} + return file_gateway_proto_rawDescGZIP(), []int{181} } func (x *RotateMachineSSHKeyRequest) GetPoolName() string { @@ -13428,22 +13418,19 @@ func (x *RotateMachineSSHKeyRequest) GetMachineId() string { } type RotateMachineSSHKeyResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Ssh *MachineSSHAccess `protobuf:"bytes,3,opt,name=ssh,proto3" json:"ssh,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Ssh *MachineSSHAccess `protobuf:"bytes,3,opt,name=ssh,proto3" json:"ssh,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RotateMachineSSHKeyResponse) Reset() { *x = RotateMachineSSHKeyResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[178] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[182] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RotateMachineSSHKeyResponse) String() string { @@ -13453,8 +13440,8 @@ func (x *RotateMachineSSHKeyResponse) String() string { func (*RotateMachineSSHKeyResponse) ProtoMessage() {} func (x *RotateMachineSSHKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[178] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[182] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13466,7 +13453,7 @@ func (x *RotateMachineSSHKeyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RotateMachineSSHKeyResponse.ProtoReflect.Descriptor instead. func (*RotateMachineSSHKeyResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{178} + return file_gateway_proto_rawDescGZIP(), []int{182} } func (x *RotateMachineSSHKeyResponse) GetOk() bool { @@ -13491,22 +13478,19 @@ func (x *RotateMachineSSHKeyResponse) GetSsh() *MachineSSHAccess { } type ActivateMachineSSHKeyRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` + MachineId string `protobuf:"bytes,2,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` + Generation uint64 `protobuf:"varint,3,opt,name=generation,proto3" json:"generation,omitempty"` unknownFields protoimpl.UnknownFields - - PoolName string `protobuf:"bytes,1,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` - MachineId string `protobuf:"bytes,2,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` - Generation uint64 `protobuf:"varint,3,opt,name=generation,proto3" json:"generation,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ActivateMachineSSHKeyRequest) Reset() { *x = ActivateMachineSSHKeyRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[179] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[183] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ActivateMachineSSHKeyRequest) String() string { @@ -13516,8 +13500,8 @@ func (x *ActivateMachineSSHKeyRequest) String() string { func (*ActivateMachineSSHKeyRequest) ProtoMessage() {} func (x *ActivateMachineSSHKeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[179] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[183] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13529,7 +13513,7 @@ func (x *ActivateMachineSSHKeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ActivateMachineSSHKeyRequest.ProtoReflect.Descriptor instead. func (*ActivateMachineSSHKeyRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{179} + return file_gateway_proto_rawDescGZIP(), []int{183} } func (x *ActivateMachineSSHKeyRequest) GetPoolName() string { @@ -13554,22 +13538,19 @@ func (x *ActivateMachineSSHKeyRequest) GetGeneration() uint64 { } type ActivateMachineSSHKeyResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Ssh *MachineSSHAccess `protobuf:"bytes,3,opt,name=ssh,proto3" json:"ssh,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` - Ssh *MachineSSHAccess `protobuf:"bytes,3,opt,name=ssh,proto3" json:"ssh,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ActivateMachineSSHKeyResponse) Reset() { *x = ActivateMachineSSHKeyResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[180] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[184] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ActivateMachineSSHKeyResponse) String() string { @@ -13579,8 +13560,8 @@ func (x *ActivateMachineSSHKeyResponse) String() string { func (*ActivateMachineSSHKeyResponse) ProtoMessage() {} func (x *ActivateMachineSSHKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[180] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[184] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13592,7 +13573,7 @@ func (x *ActivateMachineSSHKeyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ActivateMachineSSHKeyResponse.ProtoReflect.Descriptor instead. func (*ActivateMachineSSHKeyResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{180} + return file_gateway_proto_rawDescGZIP(), []int{184} } func (x *ActivateMachineSSHKeyResponse) GetOk() bool { @@ -13617,24 +13598,21 @@ func (x *ActivateMachineSSHKeyResponse) GetSsh() *MachineSSHAccess { } type AgentSSHConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` - Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"` - PublicKey string `protobuf:"bytes,3,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` - KeyFingerprint string `protobuf:"bytes,4,opt,name=key_fingerprint,json=keyFingerprint,proto3" json:"key_fingerprint,omitempty"` - Generation uint64 `protobuf:"varint,5,opt,name=generation,proto3" json:"generation,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"` + PublicKey string `protobuf:"bytes,3,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + KeyFingerprint string `protobuf:"bytes,4,opt,name=key_fingerprint,json=keyFingerprint,proto3" json:"key_fingerprint,omitempty"` + Generation uint64 `protobuf:"varint,5,opt,name=generation,proto3" json:"generation,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AgentSSHConfig) Reset() { *x = AgentSSHConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[181] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[185] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AgentSSHConfig) String() string { @@ -13644,8 +13622,8 @@ func (x *AgentSSHConfig) String() string { func (*AgentSSHConfig) ProtoMessage() {} func (x *AgentSSHConfig) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[181] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[185] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13657,7 +13635,7 @@ func (x *AgentSSHConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentSSHConfig.ProtoReflect.Descriptor instead. func (*AgentSSHConfig) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{181} + return file_gateway_proto_rawDescGZIP(), []int{185} } func (x *AgentSSHConfig) GetEnabled() bool { @@ -13696,26 +13674,23 @@ func (x *AgentSSHConfig) GetGeneration() uint64 { } type UpdateAgentSSHStatusRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - AgentToken string `protobuf:"bytes,1,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` - Generation uint64 `protobuf:"varint,2,opt,name=generation,proto3" json:"generation,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - PublicIp string `protobuf:"bytes,4,opt,name=public_ip,json=publicIp,proto3" json:"public_ip,omitempty"` - HostKeyFingerprint string `protobuf:"bytes,5,opt,name=host_key_fingerprint,json=hostKeyFingerprint,proto3" json:"host_key_fingerprint,omitempty"` - Error string `protobuf:"bytes,6,opt,name=error,proto3" json:"error,omitempty"` - ListenPort uint32 `protobuf:"varint,7,opt,name=listen_port,json=listenPort,proto3" json:"listen_port,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + AgentToken string `protobuf:"bytes,1,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` + Generation uint64 `protobuf:"varint,2,opt,name=generation,proto3" json:"generation,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + PublicIp string `protobuf:"bytes,4,opt,name=public_ip,json=publicIp,proto3" json:"public_ip,omitempty"` + HostKeyFingerprint string `protobuf:"bytes,5,opt,name=host_key_fingerprint,json=hostKeyFingerprint,proto3" json:"host_key_fingerprint,omitempty"` + Error string `protobuf:"bytes,6,opt,name=error,proto3" json:"error,omitempty"` + ListenPort uint32 `protobuf:"varint,7,opt,name=listen_port,json=listenPort,proto3" json:"listen_port,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateAgentSSHStatusRequest) Reset() { *x = UpdateAgentSSHStatusRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[182] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[186] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateAgentSSHStatusRequest) String() string { @@ -13725,8 +13700,8 @@ func (x *UpdateAgentSSHStatusRequest) String() string { func (*UpdateAgentSSHStatusRequest) ProtoMessage() {} func (x *UpdateAgentSSHStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[182] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[186] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13738,7 +13713,7 @@ func (x *UpdateAgentSSHStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateAgentSSHStatusRequest.ProtoReflect.Descriptor instead. func (*UpdateAgentSSHStatusRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{182} + return file_gateway_proto_rawDescGZIP(), []int{186} } func (x *UpdateAgentSSHStatusRequest) GetAgentToken() string { @@ -13791,21 +13766,18 @@ func (x *UpdateAgentSSHStatusRequest) GetListenPort() uint32 { } type UpdateAgentSSHStatusResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` unknownFields protoimpl.UnknownFields - - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UpdateAgentSSHStatusResponse) Reset() { *x = UpdateAgentSSHStatusResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[183] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[187] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateAgentSSHStatusResponse) String() string { @@ -13815,8 +13787,8 @@ func (x *UpdateAgentSSHStatusResponse) String() string { func (*UpdateAgentSSHStatusResponse) ProtoMessage() {} func (x *UpdateAgentSSHStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[183] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[187] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13828,7 +13800,7 @@ func (x *UpdateAgentSSHStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateAgentSSHStatusResponse.ProtoReflect.Descriptor instead. func (*UpdateAgentSSHStatusResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{183} + return file_gateway_proto_rawDescGZIP(), []int{187} } func (x *UpdateAgentSSHStatusResponse) GetOk() bool { @@ -13846,10 +13818,7 @@ func (x *UpdateAgentSSHStatusResponse) GetErrMsg() string { } type MachineSSHAccess struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Supported bool `protobuf:"varint,1,opt,name=supported,proto3" json:"supported,omitempty"` Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` PublicIp string `protobuf:"bytes,3,opt,name=public_ip,json=publicIp,proto3" json:"public_ip,omitempty"` @@ -13868,15 +13837,15 @@ type MachineSSHAccess struct { PendingKeyDownloaded bool `protobuf:"varint,16,opt,name=pending_key_downloaded,json=pendingKeyDownloaded,proto3" json:"pending_key_downloaded,omitempty"` Error string `protobuf:"bytes,17,opt,name=error,proto3" json:"error,omitempty"` UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,18,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MachineSSHAccess) Reset() { *x = MachineSSHAccess{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[184] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[188] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MachineSSHAccess) String() string { @@ -13886,8 +13855,8 @@ func (x *MachineSSHAccess) String() string { func (*MachineSSHAccess) ProtoMessage() {} func (x *MachineSSHAccess) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[184] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[188] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -13899,7 +13868,7 @@ func (x *MachineSSHAccess) ProtoReflect() protoreflect.Message { // Deprecated: Use MachineSSHAccess.ProtoReflect.Descriptor instead. func (*MachineSSHAccess) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{184} + return file_gateway_proto_rawDescGZIP(), []int{188} } func (x *MachineSSHAccess) GetSupported() bool { @@ -14032,24 +14001,21 @@ func (x *MachineSSHAccess) GetUpdatedAt() *timestamppb.Timestamp { // means the managed pool configuration is authoritative; older gateways omit // it and agents retain their installer-level state/cache defaults. type AgentPoolCacheDiskConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + HostPath string `protobuf:"bytes,2,opt,name=host_path,json=hostPath,proto3" json:"host_path,omitempty"` + MountPath string `protobuf:"bytes,3,opt,name=mount_path,json=mountPath,proto3" json:"mount_path,omitempty"` + MaxUsagePct float64 `protobuf:"fixed64,4,opt,name=max_usage_pct,json=maxUsagePct,proto3" json:"max_usage_pct,omitempty"` + MinFreeBytes int64 `protobuf:"varint,5,opt,name=min_free_bytes,json=minFreeBytes,proto3" json:"min_free_bytes,omitempty"` unknownFields protoimpl.UnknownFields - - Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` - HostPath string `protobuf:"bytes,2,opt,name=host_path,json=hostPath,proto3" json:"host_path,omitempty"` - MountPath string `protobuf:"bytes,3,opt,name=mount_path,json=mountPath,proto3" json:"mount_path,omitempty"` - MaxUsagePct float64 `protobuf:"fixed64,4,opt,name=max_usage_pct,json=maxUsagePct,proto3" json:"max_usage_pct,omitempty"` - MinFreeBytes int64 `protobuf:"varint,5,opt,name=min_free_bytes,json=minFreeBytes,proto3" json:"min_free_bytes,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AgentPoolCacheDiskConfig) Reset() { *x = AgentPoolCacheDiskConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[185] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[189] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AgentPoolCacheDiskConfig) String() string { @@ -14059,8 +14025,8 @@ func (x *AgentPoolCacheDiskConfig) String() string { func (*AgentPoolCacheDiskConfig) ProtoMessage() {} func (x *AgentPoolCacheDiskConfig) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[185] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[189] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -14072,7 +14038,7 @@ func (x *AgentPoolCacheDiskConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentPoolCacheDiskConfig.ProtoReflect.Descriptor instead. func (*AgentPoolCacheDiskConfig) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{185} + return file_gateway_proto_rawDescGZIP(), []int{189} } func (x *AgentPoolCacheDiskConfig) GetEnabled() bool { @@ -14111,21 +14077,18 @@ func (x *AgentPoolCacheDiskConfig) GetMinFreeBytes() int64 { } type AgentPoolCacheConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + Disk *AgentPoolCacheDiskConfig `protobuf:"bytes,2,opt,name=disk,proto3" json:"disk,omitempty"` unknownFields protoimpl.UnknownFields - - Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` - Disk *AgentPoolCacheDiskConfig `protobuf:"bytes,2,opt,name=disk,proto3" json:"disk,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AgentPoolCacheConfig) Reset() { *x = AgentPoolCacheConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[186] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[190] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AgentPoolCacheConfig) String() string { @@ -14135,8 +14098,8 @@ func (x *AgentPoolCacheConfig) String() string { func (*AgentPoolCacheConfig) ProtoMessage() {} func (x *AgentPoolCacheConfig) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[186] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[190] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -14148,7 +14111,7 @@ func (x *AgentPoolCacheConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentPoolCacheConfig.ProtoReflect.Descriptor instead. func (*AgentPoolCacheConfig) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{186} + return file_gateway_proto_rawDescGZIP(), []int{190} } func (x *AgentPoolCacheConfig) GetEnabled() bool { @@ -14166,28 +14129,26 @@ func (x *AgentPoolCacheConfig) GetDisk() *AgentPoolCacheDiskConfig { } type AgentPoolRuntimeConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NetworkPreallocation bool `protobuf:"varint,1,opt,name=network_preallocation,json=networkPreallocation,proto3" json:"network_preallocation,omitempty"` - CriuEnabled bool `protobuf:"varint,2,opt,name=criu_enabled,json=criuEnabled,proto3" json:"criu_enabled,omitempty"` - TmpSizeLimit string `protobuf:"bytes,3,opt,name=tmp_size_limit,json=tmpSizeLimit,proto3" json:"tmp_size_limit,omitempty"` - StorageMode string `protobuf:"bytes,4,opt,name=storage_mode,json=storageMode,proto3" json:"storage_mode,omitempty"` - StoragePath string `protobuf:"bytes,5,opt,name=storage_path,json=storagePath,proto3" json:"storage_path,omitempty"` - ImagesPath string `protobuf:"bytes,6,opt,name=images_path,json=imagesPath,proto3" json:"images_path,omitempty"` - DurableDisksPath string `protobuf:"bytes,7,opt,name=durable_disks_path,json=durableDisksPath,proto3" json:"durable_disks_path,omitempty"` - Cache *AgentPoolCacheConfig `protobuf:"bytes,8,opt,name=cache,proto3" json:"cache,omitempty"` - ConfigGroup string `protobuf:"bytes,9,opt,name=config_group,json=configGroup,proto3" json:"config_group,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + NetworkPreallocation bool `protobuf:"varint,1,opt,name=network_preallocation,json=networkPreallocation,proto3" json:"network_preallocation,omitempty"` + CriuEnabled bool `protobuf:"varint,2,opt,name=criu_enabled,json=criuEnabled,proto3" json:"criu_enabled,omitempty"` + TmpSizeLimit string `protobuf:"bytes,3,opt,name=tmp_size_limit,json=tmpSizeLimit,proto3" json:"tmp_size_limit,omitempty"` + StorageMode string `protobuf:"bytes,4,opt,name=storage_mode,json=storageMode,proto3" json:"storage_mode,omitempty"` + StoragePath string `protobuf:"bytes,5,opt,name=storage_path,json=storagePath,proto3" json:"storage_path,omitempty"` + ImagesPath string `protobuf:"bytes,6,opt,name=images_path,json=imagesPath,proto3" json:"images_path,omitempty"` + DurableDisksPath string `protobuf:"bytes,7,opt,name=durable_disks_path,json=durableDisksPath,proto3" json:"durable_disks_path,omitempty"` + Cache *AgentPoolCacheConfig `protobuf:"bytes,8,opt,name=cache,proto3" json:"cache,omitempty"` + ConfigGroup string `protobuf:"bytes,9,opt,name=config_group,json=configGroup,proto3" json:"config_group,omitempty"` + GpuVirtualized bool `protobuf:"varint,10,opt,name=gpu_virtualized,json=gpuVirtualized,proto3" json:"gpu_virtualized,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AgentPoolRuntimeConfig) Reset() { *x = AgentPoolRuntimeConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[187] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gateway_proto_msgTypes[191] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AgentPoolRuntimeConfig) String() string { @@ -14197,8 +14158,8 @@ func (x *AgentPoolRuntimeConfig) String() string { func (*AgentPoolRuntimeConfig) ProtoMessage() {} func (x *AgentPoolRuntimeConfig) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[187] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gateway_proto_msgTypes[191] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -14210,7 +14171,7 @@ func (x *AgentPoolRuntimeConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentPoolRuntimeConfig.ProtoReflect.Descriptor instead. func (*AgentPoolRuntimeConfig) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{187} + return file_gateway_proto_rawDescGZIP(), []int{191} } func (x *AgentPoolRuntimeConfig) GetNetworkPreallocation() bool { @@ -14276,2734 +14237,1375 @@ func (x *AgentPoolRuntimeConfig) GetConfigGroup() string { return "" } +func (x *AgentPoolRuntimeConfig) GetGpuVirtualized() bool { + if x != nil { + return x.GpuVirtualized + } + return false +} + var File_gateway_proto protoreflect.FileDescriptor -var file_gateway_proto_rawDesc = []byte{ - 0x0a, 0x0d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x12, 0x0a, 0x10, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x80, 0x01, 0x0a, 0x11, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x21, - 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, - 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, - 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x2e, 0x0a, 0x12, 0x53, - 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x7e, 0x0a, 0x13, 0x53, - 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1b, - 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x38, 0x0a, 0x0e, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, - 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x30, - 0x0a, 0x14, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x70, 0x75, 0x74, 0x5f, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x75, - 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x50, 0x75, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x22, 0xec, 0x01, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x69, 0x73, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, - 0x1b, 0x0a, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x0f, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0e, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, - 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x32, 0x0a, 0x15, 0x75, - 0x73, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x75, 0x73, 0x65, 0x57, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x22, - 0xcf, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0e, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, - 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, - 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, - 0x30, 0x0a, 0x14, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x70, 0x75, 0x74, 0x5f, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, - 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x50, 0x75, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x73, 0x22, 0x94, 0x02, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x73, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x70, 0x72, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x4e, 0x0a, 0x0b, 0x70, 0x75, 0x74, - 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x75, - 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, - 0x75, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x75, 0x74, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 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, 0x22, 0xad, 0x01, 0x0a, 0x10, 0x50, 0x75, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, - 0x0e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x76, - 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, - 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x5d, 0x0a, 0x11, 0x50, 0x75, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x1b, 0x0a, - 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xd6, 0x01, 0x0a, 0x1d, 0x53, 0x79, 0x6e, 0x63, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, - 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x74, 0x68, 0x12, 0x15, 0x0a, 0x06, 0x69, - 0x73, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x44, - 0x69, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x79, 0x6e, - 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x02, 0x6f, 0x70, - 0x22, 0x30, 0x0a, 0x1e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x22, 0x17, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x77, 0x0a, 0x16, 0x4c, - 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x0a, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x4d, 0x73, 0x67, 0x22, 0x39, 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x22, - 0x44, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x3f, 0x0a, 0x1a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x22, 0x6f, 0x0a, 0x1b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xd3, 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x4a, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x5f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x54, 0x6f, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, - 0x0d, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x62, - 0x0a, 0x18, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x73, 0x79, 0x6e, 0x63, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x3d, 0x0a, - 0x18, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x54, 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x22, 0x64, 0x0a, 0x19, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x54, 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, - 0x64, 0x65, 0x22, 0x4e, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, - 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x49, 0x64, 0x22, 0x23, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x22, 0x85, 0x02, 0x0a, 0x0e, 0x45, 0x6e, 0x64, 0x54, - 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, - 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x64, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x74, 0x61, 0x73, 0x6b, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x73, 0x6b, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, - 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x12, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x6b, - 0x65, 0x65, 0x70, 0x5f, 0x77, 0x61, 0x72, 0x6d, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6b, 0x65, 0x65, 0x70, 0x57, 0x61, 0x72, 0x6d, - 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, - 0x21, 0x0a, 0x0f, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x22, 0x24, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xbb, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, - 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb9, 0x03, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 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, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x18, 0x06, 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, 0x07, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x74, 0x12, 0x17, 0x0a, 0x07, - 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x75, 0x62, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 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, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x22, 0x77, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, - 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, - 0x12, 0x23, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x2d, 0x0a, 0x10, 0x53, - 0x74, 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x19, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x3c, 0x0a, 0x11, 0x53, 0x74, - 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, - 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x78, 0x0a, 0x06, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x50, - 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x06, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x22, 0x1f, 0x0a, 0x09, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x56, 0x61, 0x72, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x0a, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, - 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, - 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x2e, 0x0a, - 0x13, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x74, 0x61, 0x73, 0x6b, - 0x73, 0x50, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x25, 0x0a, - 0x0e, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x09, 0x4c, 0x4c, 0x4d, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x6c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x69, 0x7a, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x6c, 0x6f, - 0x5f, 0x74, 0x69, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x6c, 0x6f, - 0x54, 0x69, 0x65, 0x72, 0x22, 0xcc, 0x03, 0x0a, 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, - 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x12, - 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, - 0x76, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x76, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x36, 0x0a, 0x17, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x15, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x75, 0x72, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x30, 0x0a, 0x14, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x73, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x12, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x12, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6b, 0x69, 0x6e, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4b, 0x69, 0x6e, 0x64, - 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x24, 0x0a, 0x03, 0x6c, - 0x6c, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4c, 0x4c, 0x4d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x6c, 0x6c, - 0x6d, 0x12, 0x3a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0xa9, 0x01, - 0x0a, 0x0b, 0x44, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x6b, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, - 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x59, 0x0a, 0x0a, 0x54, 0x61, 0x73, - 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x03, 0x74, 0x74, 0x6c, 0x22, 0x8e, 0x01, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, - 0x33, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x4f, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 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, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4a, 0x0a, 0x0b, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x73, 0x22, 0xc4, 0x0c, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x75, 0x62, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, - 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, - 0x63, 0x70, 0x75, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, - 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x61, 0x6e, 0x64, 0x6c, - 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x77, - 0x61, 0x72, 0x6d, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x0f, 0x6b, 0x65, 0x65, 0x70, 0x57, 0x61, 0x72, 0x6d, 0x53, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x2a, 0x0a, 0x11, - 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x73, 0x6b, - 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x07, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, - 0x6b, 0x55, 0x72, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x65, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x65, 0x64, 0x12, 0x2c, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, - 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x56, 0x61, 0x72, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, - 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x52, 0x0a, 0x61, 0x75, 0x74, - 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x0b, 0x74, 0x61, 0x73, 0x6b, 0x5f, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2f, 0x0a, - 0x13, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x78, 0x74, 0x72, 0x61, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x11, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x18, 0x1c, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x6e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x29, 0x0a, - 0x11, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x73, 0x74, 0x75, 0x62, 0x5f, - 0x69, 0x64, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x6e, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x1e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, - 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x10, - 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x20, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, - 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x21, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x70, - 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x52, 0x07, 0x70, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x27, 0x0a, 0x06, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, - 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, - 0x10, 0x0a, 0x03, 0x74, 0x63, 0x70, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x63, - 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, - 0x6c, 0x69, 0x73, 0x74, 0x18, 0x27, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x64, - 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x04, - 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, - 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x2a, 0x0a, 0x05, 0x64, 0x69, 0x73, 0x6b, 0x73, 0x18, - 0x2c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x05, 0x64, 0x69, 0x73, - 0x6b, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x12, - 0x47, 0x0a, 0x12, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x74, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x54, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x22, 0xfc, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, - 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x17, 0x0a, - 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x6d, - 0x73, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x4d, 0x73, - 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x75, 0x6e, - 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x67, 0x70, 0x75, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x75, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x64, 0x47, 0x70, 0x75, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, - 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0x5a, 0x0a, 0x11, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, - 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x6f, 0x6c, - 0x6c, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x6c, - 0x6f, 0x75, 0x74, 0x22, 0xdd, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, - 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x76, - 0x6f, 0x6b, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, - 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, - 0x6d, 0x73, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, - 0x67, 0x12, 0x19, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x4d, 0x73, 0x67, 0x12, 0x25, 0x0a, 0x0e, - 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x9b, 0x04, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x17, - 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x75, 0x62, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x75, 0x62, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x75, 0x62, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x25, - 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, - 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x61, - 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, - 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6b, - 0x69, 0x6e, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x65, 0x6e, 0x76, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x76, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x07, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 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, 0x29, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x79, 0x0a, 0x17, 0x4c, - 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, - 0x35, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x27, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, - 0x41, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, - 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, - 0x73, 0x67, 0x22, 0x28, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x42, 0x0a, 0x17, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, - 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, - 0x22, 0x48, 0x0a, 0x16, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x42, 0x0a, 0x17, 0x53, 0x63, - 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x29, - 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x43, 0x0a, 0x18, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xec, - 0x02, 0x0a, 0x04, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, - 0x47, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, - 0x65, 0x65, 0x47, 0x70, 0x75, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, - 0x43, 0x70, 0x75, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x46, 0x72, - 0x65, 0x65, 0x43, 0x70, 0x75, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x69, - 0x6e, 0x46, 0x72, 0x65, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x43, 0x70, 0x75, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x65, 0x72, 0x43, 0x70, 0x75, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x34, 0x0a, 0x15, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x2c, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x50, 0x6f, 0x6f, - 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xbb, 0x01, - 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 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, 0x29, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x61, 0x0a, 0x11, 0x4c, - 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, - 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x23, 0x0a, 0x05, 0x70, 0x6f, 0x6f, - 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x22, 0xf9, - 0x02, 0x0a, 0x0a, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, - 0x67, 0x70, 0x75, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x6d, - 0x61, 0x78, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, - 0x6d, 0x61, 0x78, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x6d, 0x69, 0x6e, 0x52, 0x65, - 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, - 0x61, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, - 0x61, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, - 0x19, 0x0a, 0x08, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x22, 0xd2, 0x04, 0x0a, 0x09, 0x50, - 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, - 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, - 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x4d, 0x69, 0x6c, - 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x5f, 0x6d, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x4d, 0x62, 0x12, 0x2c, 0x0a, 0x12, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, - 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x10, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, 0x63, 0x72, - 0x6f, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, - 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x62, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4d, - 0x62, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x6f, 0x64, - 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, - 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, - 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, - 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5f, - 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, - 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x13, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x22, - 0xfb, 0x05, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x19, 0x0a, - 0x08, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, - 0x12, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, - 0x72, 0x6f, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x68, 0x6f, 0x75, 0x72, 0x6c, - 0x79, 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x18, 0x09, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, - 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x48, 0x0a, 0x12, 0x62, 0x69, 0x6c, - 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x5f, 0x61, 0x74, 0x18, - 0x0b, 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, 0x10, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, - 0x6c, 0x41, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x74, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, - 0x75, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x13, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, - 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, 0x18, 0x14, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, 0x12, 0x1d, - 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x15, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4d, 0x62, 0x22, 0xad, 0x04, - 0x0a, 0x0b, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x2b, 0x0a, - 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3d, 0x0a, 0x0c, 0x72, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x69, 0x63, - 0x72, 0x6f, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, - 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, 0x65, 0x78, 0x70, 0x69, - 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, - 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, - 0x73, 0x12, 0x2a, 0x0a, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, - 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x22, 0x40, 0x0a, - 0x15, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, - 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x22, - 0x6d, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, - 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, - 0x73, 0x67, 0x12, 0x2a, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, - 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x22, 0x5a, - 0x0a, 0x19, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x70, - 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, - 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0xde, 0x01, 0x0a, 0x1a, 0x4c, - 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, - 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, - 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x43, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x17, - 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, - 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6f, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2a, 0x0a, 0x05, - 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, - 0x6c, 0x52, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x22, 0x9d, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1b, - 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, - 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x73, 0x69, - 0x72, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1b, 0x0a, - 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x08, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, - 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xfc, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, - 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, - 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x74, 0x75, 0x70, - 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x2a, 0x0a, 0x04, 0x62, - 0x79, 0x6f, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x22, 0xd8, 0x05, 0x0a, 0x0d, 0x42, 0x59, 0x4f, 0x43, - 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x55, 0x72, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x73, 0x74, 0x72, - 0x6f, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, - 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, - 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x29, 0x0a, - 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, - 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, - 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x61, 0x6e, 0x64, - 0x62, 0x6f, 0x78, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x50, - 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, - 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x68, 0x6f, - 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x43, 0x6f, - 0x73, 0x74, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x69, - 0x63, 0x72, 0x6f, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x48, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x4d, 0x69, 0x63, 0x72, 0x6f, - 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x63, 0x61, 0x6c, - 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x12, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x22, 0x31, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xff, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x59, 0x4f, - 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, - 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, - 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, - 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x62, - 0x79, 0x6f, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x22, 0x75, 0x0a, 0x14, 0x53, 0x63, 0x61, 0x6c, 0x65, - 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, - 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x96, - 0x01, 0x0a, 0x15, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, - 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, - 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x2a, 0x0a, 0x04, 0x62, - 0x79, 0x6f, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x04, 0x62, 0x79, 0x6f, 0x63, 0x22, 0xe2, 0x04, 0x0a, 0x12, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, - 0x0a, 0x13, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x6c, - 0x6c, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, - 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, - 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, - 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x0c, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x23, 0x0a, - 0x0d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, - 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, - 0x47, 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9a, 0x05, 0x0a, - 0x10, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, - 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, - 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, - 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, - 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, - 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, - 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, - 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x72, 0x65, 0x73, - 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, 0x12, 0x17, 0x0a, - 0x07, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x67, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, - 0x64, 0x69, 0x73, 0x6b, 0x47, 0x62, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, - 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, - 0x66, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, - 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x39, - 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x11, 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, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x12, 0x36, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, - 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x13, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, - 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xb2, 0x02, 0x0a, 0x1f, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, - 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, - 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, - 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, - 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, - 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, - 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, - 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, - 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x82, - 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x35, 0x0a, 0x07, - 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x6c, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x22, 0x93, 0x03, 0x0a, 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, - 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, - 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, - 0x69, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, - 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, - 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, - 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, 0x88, 0x01, - 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x62, 0x6c, - 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x42, 0x1b, 0x0a, 0x19, - 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, - 0x6f, 0x75, 0x72, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x20, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, - 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x35, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x40, - 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, - 0x22, 0x4b, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x36, 0x0a, - 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, - 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, - 0x73, 0x67, 0x12, 0x37, 0x0a, 0x08, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x08, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x53, 0x0a, 0x20, 0x47, - 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, - 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x10, - 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, - 0x22, 0xb7, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, - 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x05, 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0x46, 0x0a, 0x1c, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, - 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x22, 0x7b, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x31, 0x0a, 0x06, - 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x22, - 0x3b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x22, 0x77, 0x0a, 0x1b, - 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, - 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, - 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, - 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2f, 0x0a, 0x05, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x05, - 0x6f, 0x66, 0x66, 0x65, 0x72, 0x22, 0x88, 0x03, 0x0a, 0x11, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, - 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, - 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, - 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, - 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x36, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, - 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x63, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x70, 0x72, 0x69, 0x63, - 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x48, 0x6f, 0x75, 0x72, 0x43, 0x65, 0x6e, 0x74, 0x73, - 0x22, 0x7b, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, - 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x7e, 0x0a, - 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, - 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x32, 0x0a, 0x06, 0x72, 0x65, 0x6e, - 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x06, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x22, 0x1f, 0x0a, - 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7f, - 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, - 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x72, 0x65, 0x6e, - 0x74, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x22, - 0x3d, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x49, 0x64, 0x22, 0x4a, - 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, - 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xc8, 0x01, 0x0a, 0x1b, 0x4c, - 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0d, 0x52, - 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x03, 0x65, 0x6e, 0x76, 0x22, 0xf2, 0x01, 0x0a, 0x1c, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, - 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, - 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, - 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x23, 0x0a, - 0x0d, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x55, 0x0a, 0x1e, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x22, 0x78, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2c, 0x0a, - 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x5a, 0x0a, 0x1c, 0x4c, - 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, - 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x83, - 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, - 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x73, 0x22, 0x3c, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, - 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x70, 0x6f, 0x6f, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x70, 0x6f, - 0x6f, 0x6c, 0x22, 0x67, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, - 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, - 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x27, 0x0a, 0x11, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3d, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, - 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, - 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, - 0x4d, 0x73, 0x67, 0x22, 0x5e, 0x0a, 0x19, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, - 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x70, - 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x70, - 0x65, 0x6e, 0x64, 0x22, 0x6f, 0x0a, 0x1a, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, - 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, - 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x6f, - 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, - 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x4b, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, - 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, - 0x6c, 0x22, 0x97, 0x01, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, - 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, - 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x04, - 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, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0x32, 0x0a, 0x1a, 0x52, - 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, - 0x46, 0x0a, 0x1b, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, - 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, - 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x4a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x50, 0x6f, - 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x74, 0x74, 0x6c, 0x22, 0xb0, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, - 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x05, 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, 0x65, 0x78, 0x70, - 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0x4c, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, - 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x22, 0x71, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, - 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, - 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x08, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x94, 0x05, 0x0a, 0x14, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, 0x74, 0x70, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, 0x55, 0x72, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, - 0x70, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, - 0x70, 0x63, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x54, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, - 0x63, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, - 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, - 0x30, 0x0a, 0x14, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, - 0x79, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, - 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x69, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x39, 0x0a, 0x19, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x63, - 0x61, 0x63, 0x68, 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x16, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x74, 0x65, - 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, - 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, 0x74, 0x65, - 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x12, 0x35, 0x0a, 0x07, 0x62, 0x69, 0x6c, 0x6c, 0x69, - 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0xe2, - 0x01, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x75, - 0x73, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, - 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x75, 0x73, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, 0x0a, - 0x12, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x48, - 0x6f, 0x6f, 0x6b, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x63, - 0x6f, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x73, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x62, 0x69, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x11, 0x62, 0x69, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, - 0x50, 0x63, 0x74, 0x22, 0xc7, 0x01, 0x0a, 0x14, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, - 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x35, 0x0a, 0x04, 0x6c, - 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, - 0x72, 0x79, 0x53, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x6c, 0x6f, - 0x67, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x53, 0x69, 0x6e, 0x6b, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x81, 0x01, - 0x0a, 0x18, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, - 0x53, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, - 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x23, 0x0a, 0x0d, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x22, 0x81, 0x05, 0x0a, 0x10, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2f, 0x0a, 0x13, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x12, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x46, 0x69, 0x6e, 0x67, 0x65, - 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x6f, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x61, 0x72, 0x63, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x63, 0x70, 0x75, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x62, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x62, - 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x67, - 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x3a, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x18, 0x0a, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x52, 0x09, 0x70, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, - 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, - 0x12, 0x17, 0x0a, 0x07, 0x67, 0x70, 0x75, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x06, 0x67, 0x70, 0x75, 0x49, 0x64, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x53, 0x6c, 0x6f, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3e, - 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x21, - 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, - 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0xf9, 0x01, 0x0a, 0x11, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, - 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, - 0x72, 0x4d, 0x73, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x3b, 0x0a, 0x09, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, - 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, - 0x70, 0x22, 0x6f, 0x0a, 0x13, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x66, 0x6c, 0x69, - 0x67, 0x68, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x6f, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x18, 0x0a, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, - 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, - 0x74, 0x79, 0x22, 0xb9, 0x03, 0x0a, 0x0a, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, - 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x77, - 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6b, - 0x69, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, - 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, - 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x21, 0x0a, - 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, - 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x67, - 0x0a, 0x26, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xc8, 0x01, 0x0a, 0x27, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, - 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x19, 0x0a, 0x08, - 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x61, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, - 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, - 0x61, 0x6c, 0x22, 0x39, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, - 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6f, 0x0a, - 0x17, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, - 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, - 0x67, 0x12, 0x2b, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x22, 0xad, - 0x02, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x47, 0x0a, 0x05, 0x61, - 0x74, 0x74, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x61, - 0x74, 0x74, 0x72, 0x73, 0x1a, 0x38, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x72, 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, 0x22, 0x49, - 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, - 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x96, 0x08, 0x0a, 0x0f, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x1b, 0x0a, - 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, - 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, - 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x70, 0x75, 0x41, - 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6d, - 0x61, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, - 0x6c, 0x6f, 0x74, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6c, 0x6f, 0x74, - 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3e, 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x19, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x2b, 0x0a, 0x11, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x5f, 0x69, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, - 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, - 0x6c, 0x6c, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x34, 0x0a, 0x16, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, - 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x14, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, - 0x73, 0x65, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6f, 0x72, - 0x69, 0x74, 0x79, 0x53, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x67, 0x76, 0x69, 0x73, 0x6f, 0x72, - 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x67, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, - 0x1f, 0x0a, 0x0b, 0x67, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x17, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x67, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x52, 0x6f, 0x6f, 0x74, - 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, - 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x18, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x76, 0x69, - 0x73, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x72, 0x61, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1e, 0x0a, 0x0a, - 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, - 0x63, 0x70, 0x75, 0x5f, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x65, 0x6e, 0x66, - 0x6f, 0x72, 0x63, 0x65, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x63, 0x70, 0x75, - 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, - 0x12, 0x40, 0x0a, 0x0b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x70, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x22, 0x35, 0x0a, 0x12, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xc6, 0x01, 0x0a, 0x13, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, - 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2b, 0x0a, 0x06, 0x72, 0x6f, - 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, - 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6c, 0x6f, 0x74, - 0x52, 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x03, 0x73, 0x73, 0x68, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x73, - 0x73, 0x68, 0x22, 0xb7, 0x01, 0x0a, 0x0e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x52, - 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x2e, 0x0a, 0x13, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, - 0x61, 0x6e, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x22, 0xb4, 0x04, 0x0a, - 0x13, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x55, 0x6e, 0x69, 0x78, - 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x11, 0x63, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x63, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, - 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, - 0x4d, 0x62, 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, - 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x6b, - 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, - 0x64, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x22, 0x0a, 0x0d, 0x64, 0x69, - 0x73, 0x6b, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x24, - 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x63, 0x74, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, - 0x65, 0x50, 0x63, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, - 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x0c, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x61, 0x74, 0x68, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x22, 0xa1, 0x02, 0x0a, 0x10, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x41, 0x74, 0x74, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x12, 0x2e, - 0x0a, 0x13, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x75, 0x6e, 0x69, 0x78, - 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x1d, - 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x38, 0x0a, - 0x0a, 0x41, 0x74, 0x74, 0x72, 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, 0x22, 0xd0, 0x01, 0x0a, 0x15, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x2b, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, - 0x36, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x07, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x41, 0x0a, 0x16, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xb9, 0x04, - 0x0a, 0x07, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, - 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x72, 0x6c, - 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x61, 0x75, - 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x63, - 0x61, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x4b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, - 0x0f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, - 0x0e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, - 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x03, - 0x73, 0x73, 0x68, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x53, 0x48, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x52, 0x03, 0x73, 0x73, 0x68, 0x22, 0xed, 0x05, 0x0a, 0x0e, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2e, 0x0a, 0x13, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x43, 0x70, 0x75, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x16, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x11, 0x63, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x63, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, - 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, 0x70, 0x75, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x66, 0x72, - 0x65, 0x65, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x61, - 0x63, 0x68, 0x65, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x55, 0x73, 0x61, 0x67, 0x65, 0x50, - 0x63, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x63, 0x61, 0x63, 0x68, - 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x61, 0x63, - 0x68, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x61, 0x63, 0x68, 0x65, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x61, 0x63, 0x68, 0x65, - 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, - 0x52, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x24, 0x0a, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, - 0x62, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, - 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x20, 0x0a, - 0x0c, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x65, 0x64, 0x4d, 0x62, 0x12, - 0x22, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x6f, 0x74, 0x61, - 0x6c, 0x4d, 0x62, 0x12, 0x24, 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x75, 0x73, 0x61, 0x67, - 0x65, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x64, 0x69, 0x73, - 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, 0x12, 0x3e, 0x0a, 0x0c, 0x70, 0x61, 0x74, - 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0b, 0x70, 0x61, - 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xb2, 0x01, 0x0a, 0x12, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, - 0x65, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, - 0x64, 0x4d, 0x62, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x62, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x62, 0x12, 0x21, - 0x0a, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, - 0x62, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x75, 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, 0x22, 0x48, - 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xfe, 0x02, 0x0a, 0x14, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, - 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x08, - 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x04, 0x67, 0x70, 0x75, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x47, 0x70, 0x75, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x67, 0x70, 0x75, 0x73, 0x12, 0x57, 0x0a, 0x0e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x64, 0x5f, 0x67, 0x70, 0x75, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x75, 0x70, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x47, 0x70, 0x75, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0d, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x47, 0x70, 0x75, 0x73, 0x1a, 0x37, - 0x0a, 0x09, 0x47, 0x70, 0x75, 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, 0x08, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x40, 0x0a, 0x12, 0x53, 0x75, 0x70, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x64, 0x47, 0x70, 0x75, 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, 0x08, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x33, 0x0a, 0x14, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xa9, - 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, - 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, - 0x67, 0x12, 0x2a, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x2c, 0x0a, - 0x12, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x55, 0x72, 0x6c, 0x12, 0x32, 0x0a, 0x15, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x62, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, - 0x30, 0x0a, 0x14, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x52, 0x0a, 0x14, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, - 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x40, - 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, - 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, - 0x22, 0xb6, 0x02, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x72, 0x65, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0d, 0x48, 0x00, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, - 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x07, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, - 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 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, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x65, - 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x26, 0x0a, - 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x06, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x33, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x64, 0x0a, 0x13, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, - 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x24, 0x0a, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x22, 0x2f, 0x0a, 0x12, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, - 0x64, 0x22, 0x64, 0x0a, 0x13, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, - 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, - 0x67, 0x12, 0x24, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, - 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, - 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x83, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, - 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, - 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, - 0x62, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x72, 0x6c, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x72, 0x6c, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x22, 0x4b, - 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, - 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x14, 0x0a, 0x12, 0x4c, - 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x67, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, - 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, - 0x67, 0x12, 0x27, 0x0a, 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x52, 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x22, 0x32, 0x0a, 0x13, 0x43, 0x6f, - 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3f, - 0x0a, 0x14, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, - 0x34, 0x0a, 0x15, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x49, 0x64, 0x22, 0x41, 0x0a, 0x16, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, - 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, - 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x31, 0x0a, 0x12, 0x44, 0x72, 0x61, 0x69, - 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x13, 0x44, - 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, - 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x1e, 0x0a, 0x1c, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc6, 0x02, 0x0a, 0x1d, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, - 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x68, 0x6f, - 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x48, 0x74, 0x74, 0x70, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, - 0x70, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x74, 0x74, 0x70, 0x54, 0x6c, 0x73, 0x12, - 0x2a, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, - 0x68, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, - 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x54, 0x6c, - 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x49, 0x64, 0x22, 0xae, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x15, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x12, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x41, 0x74, 0x55, 0x6e, 0x69, - 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x22, 0x4a, 0x0a, 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, - 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, - 0x67, 0x22, 0x5a, 0x0a, 0x1c, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, - 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x22, 0xf8, 0x01, - 0x0a, 0x1d, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, - 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, - 0x72, 0x69, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x67, - 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x13, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x58, 0x0a, 0x1a, 0x52, 0x6f, 0x74, 0x61, - 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x49, 0x64, 0x22, 0x73, 0x0a, 0x1b, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, - 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2b, 0x0a, 0x03, 0x73, 0x73, - 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x53, 0x48, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x52, 0x03, 0x73, 0x73, 0x68, 0x22, 0x7a, 0x0a, 0x1c, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x75, 0x0a, 0x1d, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x2b, 0x0a, - 0x03, 0x73, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x53, 0x48, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x03, 0x73, 0x73, 0x68, 0x22, 0xae, 0x01, 0x0a, 0x0e, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, - 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, - 0x65, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6b, 0x65, 0x79, - 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xfc, 0x01, 0x0a, 0x1b, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x53, 0x48, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, - 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x69, - 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, - 0x70, 0x12, 0x30, 0x0a, 0x14, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, - 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x12, 0x68, 0x6f, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, - 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, - 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x22, 0x47, 0x0a, 0x1c, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x53, 0x48, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, - 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, - 0x4d, 0x73, 0x67, 0x22, 0xda, 0x05, 0x0a, 0x10, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, - 0x53, 0x48, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x70, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x75, 0x70, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, - 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x68, - 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, - 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x2b, 0x0a, 0x11, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x12, - 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, - 0x64, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x6b, - 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6b, 0x65, 0x79, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, - 0x72, 0x69, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, - 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x12, 0x68, 0x6f, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6e, 0x67, 0x65, - 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, - 0x79, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x6f, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x11, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x13, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, - 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x12, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x65, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x70, 0x65, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x12, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x22, 0xba, 0x01, 0x0a, 0x18, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, - 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x6f, 0x73, 0x74, 0x5f, - 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, - 0x61, 0x74, 0x68, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, - 0x5f, 0x70, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x55, - 0x73, 0x61, 0x67, 0x65, 0x50, 0x63, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x69, 0x6e, 0x5f, 0x66, - 0x72, 0x65, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0c, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x67, 0x0a, - 0x14, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x35, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x6f, 0x6f, - 0x6c, 0x43, 0x61, 0x63, 0x68, 0x65, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x04, 0x64, 0x69, 0x73, 0x6b, 0x22, 0x83, 0x03, 0x0a, 0x16, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x33, 0x0a, 0x15, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x65, - 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x14, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x72, 0x69, 0x75, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x63, 0x72, - 0x69, 0x75, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x74, 0x6d, 0x70, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x74, 0x6d, 0x70, 0x53, 0x69, 0x7a, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4d, 0x6f, - 0x64, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x5f, - 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x2c, 0x0a, 0x12, 0x64, 0x75, 0x72, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x64, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x6b, 0x73, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x33, 0x0a, 0x05, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x05, 0x63, 0x61, 0x63, 0x68, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2a, 0x43, 0x0a, 0x1f, - 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x09, 0x0a, 0x05, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, - 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, - 0x02, 0x32, 0x9e, 0x42, 0x0a, 0x0e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x65, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, - 0x22, 0x0f, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x65, 0x12, 0x5f, 0x0a, 0x0b, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x50, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x73, 0x69, - 0x67, 0x6e, 0x12, 0x5e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x11, 0x12, 0x0f, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x68, 0x61, 0x73, - 0x68, 0x7d, 0x12, 0x60, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x12, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x12, 0x4c, 0x0a, 0x0f, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x75, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x28, 0x01, 0x12, 0x62, 0x0a, 0x13, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0d, 0x12, 0x0b, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x77, - 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, - 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x22, 0x1f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x54, 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x22, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x54, 0x6f, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2f, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x12, 0x53, 0x0a, 0x07, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x12, - 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2f, 0x65, 0x6e, 0x64, 0x12, 0x5a, 0x0a, 0x09, 0x53, 0x74, 0x6f, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, - 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x52, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x08, 0x12, 0x06, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x67, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x12, 0x1f, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, 0x2f, 0x73, 0x74, 0x75, - 0x62, 0x73, 0x12, 0x5f, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, - 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, - 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x73, 0x74, 0x75, 0x62, 0x73, 0x2f, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x12, 0x57, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x12, 0x16, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x73, 0x74, 0x75, 0x62, 0x73, 0x2f, 0x7b, - 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x72, 0x6c, 0x12, 0x6a, 0x0a, 0x0f, - 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x18, 0x22, 0x16, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x75, 0x0a, 0x0f, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1f, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x22, 0x17, 0x2f, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x12, 0x78, 0x0a, 0x0f, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, - 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x72, 0x0a, 0x10, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x2a, 0x11, 0x2f, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, - 0x12, 0x52, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x19, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x70, - 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x6b, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, - 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, - 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x3a, 0x6f, 0x66, 0x66, 0x65, 0x72, - 0x73, 0x12, 0x77, 0x0a, 0x12, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, - 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x70, 0x6f, - 0x6f, 0x6c, 0x73, 0x3a, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x12, 0x6f, 0x0a, 0x10, 0x4c, 0x69, - 0x73, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x20, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x70, 0x6f, - 0x6f, 0x6c, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x69, 0x0a, 0x0e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1e, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, - 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x59, - 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, - 0x73, 0x2f, 0x62, 0x79, 0x6f, 0x63, 0x12, 0x69, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x42, 0x59, 0x4f, - 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x47, 0x65, 0x74, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, - 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, - 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x62, 0x79, 0x6f, - 0x63, 0x12, 0x78, 0x0a, 0x0d, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, - 0x6f, 0x6c, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, 0x61, - 0x6c, 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x63, 0x61, 0x6c, - 0x65, 0x42, 0x59, 0x4f, 0x43, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, 0x70, - 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, - 0x2f, 0x62, 0x79, 0x6f, 0x63, 0x2f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x18, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x9e, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, 0x2f, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, - 0x12, 0x9b, 0x01, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x2a, 0x22, 0x2f, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x8b, - 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0xae, 0x01, 0x0a, - 0x19, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, - 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x29, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4a, 0x6f, - 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x3a, 0x01, 0x2a, 0x22, 0x2f, 0x2f, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x83, 0x01, - 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, - 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6f, 0x66, 0x66, - 0x65, 0x72, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, - 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x6f, 0x66, 0x66, - 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, - 0x12, 0x8d, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, - 0x12, 0x87, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x12, 0x26, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, - 0x74, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x17, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6e, 0x74, 0x61, - 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x22, 0x2a, 0x20, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2f, - 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x2f, 0x7b, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, - 0x69, 0x64, 0x7d, 0x12, 0x97, 0x01, 0x0a, 0x14, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x24, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6e, - 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x61, 0x75, - 0x6e, 0x63, 0x68, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x2f, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x2f, 0x7b, 0x72, 0x65, 0x6e, 0x74, - 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x12, 0xa1, 0x01, - 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x2d, 0x12, 0x2b, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x35, 0x12, 0x33, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x2f, - 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, - 0x73, 0x12, 0x5c, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, - 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, - 0x2a, 0x0d, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, - 0x7e, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, - 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x12, - 0x8b, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, - 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6f, - 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, 0x2f, - 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x7d, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x86, 0x01, - 0x0a, 0x13, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, - 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x70, 0x6f, - 0x6f, 0x6c, 0x73, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, - 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x12, 0x89, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x50, 0x6f, - 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x22, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4a, - 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x50, - 0x6f, 0x6f, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, - 0x2a, 0x22, 0x1f, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6a, 0x6f, 0x69, 0x6e, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x12, 0x7c, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, - 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, - 0x12, 0xac, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x6f, 0x77, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x53, 0x48, 0x4b, 0x65, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x3e, 0x3a, 0x01, 0x2a, 0x22, 0x39, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, - 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x73, 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, - 0x73, 0x68, 0x2f, 0x6b, 0x65, 0x79, 0x3a, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0xa4, 0x01, 0x0a, 0x13, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, - 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x42, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x3a, 0x01, 0x2a, 0x22, 0x37, 0x2f, - 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x73, 0x68, 0x2f, 0x6b, 0x65, 0x79, 0x3a, - 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x12, 0xac, 0x01, 0x0a, 0x15, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, - 0x12, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x53, 0x53, 0x48, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x3a, 0x01, 0x2a, 0x22, 0x39, 0x2f, 0x70, 0x6f, 0x6f, - 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x73, 0x68, 0x2f, 0x6b, 0x65, 0x79, 0x3a, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x5a, 0x0a, 0x09, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4a, 0x6f, 0x69, - 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x6a, 0x6f, 0x69, - 0x6e, 0x12, 0xac, 0x01, 0x0a, 0x1f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x2f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, - 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x12, 0x73, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, - 0x2a, 0x22, 0x12, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, - 0x3a, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x8a, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x53, 0x53, 0x48, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x53, 0x53, 0x48, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x53, 0x48, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, - 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x73, 0x68, 0x2f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, - 0x22, 0x13, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x4a, 0x0a, 0x0b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, - 0x01, 0x12, 0x59, 0x0a, 0x14, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x0c, - 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0b, 0x12, 0x09, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x64, 0x0a, 0x0d, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x1d, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0e, 0x3a, 0x01, 0x2a, 0x22, 0x09, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x73, 0x12, 0x6e, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, - 0x64, 0x7d, 0x12, 0x56, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x09, 0x12, 0x07, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x0b, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x22, 0x07, 0x2f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x6b, 0x0a, 0x0b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, - 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x67, 0x67, - 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x19, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x2f, 0x7b, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x74, 0x6f, 0x67, 0x67, - 0x6c, 0x65, 0x12, 0x64, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, 0x7b, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x5a, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x73, 0x12, 0x70, 0x0a, 0x0c, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, - 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, - 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, - 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x1b, 0x2f, 0x77, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, - 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x12, 0x78, 0x0a, 0x0e, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, - 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1f, 0x22, 0x1d, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, - 0x12, 0x6c, 0x0a, 0x0b, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, - 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, - 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1c, 0x22, 0x1a, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x77, 0x6f, - 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x12, 0x81, - 0x01, 0x0a, 0x15, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, - 0x11, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x42, 0x23, 0x5a, 0x21, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x62, 0x65, 0x61, 0x6d, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x62, 0x65, 0x74, 0x61, - 0x39, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_gateway_proto_rawDesc = "" + + "\n" + + "\rgateway.proto\x12\agateway\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/api/annotations.proto\x1a\vtypes.proto\"\x12\n" + + "\x10AuthorizeRequest\"\x80\x01\n" + + "\x11AuthorizeResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12!\n" + + "\fworkspace_id\x18\x02 \x01(\tR\vworkspaceId\x12\x1b\n" + + "\tnew_token\x18\x03 \x01(\tR\bnewToken\x12\x1b\n" + + "\terror_msg\x18\x04 \x01(\tR\berrorMsg\".\n" + + "\x12SignPayloadRequest\x12\x18\n" + + "\apayload\x18\x01 \x01(\fR\apayload\"~\n" + + "\x13SignPayloadResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x1c\n" + + "\tsignature\x18\x02 \x01(\tR\tsignature\x12\x1c\n" + + "\ttimestamp\x18\x03 \x01(\x03R\ttimestamp\x12\x1b\n" + + "\terror_msg\x18\x04 \x01(\tR\berrorMsg\"8\n" + + "\x0eObjectMetadata\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n" + + "\x04size\x18\x02 \x01(\x03R\x04size\"Y\n" + + "\x11HeadObjectRequest\x12\x12\n" + + "\x04hash\x18\x01 \x01(\tR\x04hash\x120\n" + + "\x14supports_put_headers\x18\x02 \x01(\bR\x12supportsPutHeaders\"\xec\x01\n" + + "\x12HeadObjectResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x16\n" + + "\x06exists\x18\x02 \x01(\bR\x06exists\x12\x1b\n" + + "\tobject_id\x18\x03 \x01(\tR\bobjectId\x12@\n" + + "\x0fobject_metadata\x18\x04 \x01(\v2\x17.gateway.ObjectMetadataR\x0eobjectMetadata\x12\x1b\n" + + "\terror_msg\x18\x05 \x01(\tR\berrorMsg\x122\n" + + "\x15use_workspace_storage\x18\x06 \x01(\bR\x13useWorkspaceStorage\"\xcf\x01\n" + + "\x13CreateObjectRequest\x12@\n" + + "\x0fobject_metadata\x18\x01 \x01(\v2\x17.gateway.ObjectMetadataR\x0eobjectMetadata\x12\x12\n" + + "\x04hash\x18\x02 \x01(\tR\x04hash\x12\x12\n" + + "\x04size\x18\x03 \x01(\x03R\x04size\x12\x1c\n" + + "\toverwrite\x18\x04 \x01(\bR\toverwrite\x120\n" + + "\x14supports_put_headers\x18\x05 \x01(\bR\x12supportsPutHeaders\"\x94\x02\n" + + "\x14CreateObjectResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x1b\n" + + "\tobject_id\x18\x02 \x01(\tR\bobjectId\x12#\n" + + "\rpresigned_url\x18\x03 \x01(\tR\fpresignedUrl\x12\x1b\n" + + "\terror_msg\x18\x04 \x01(\tR\berrorMsg\x12N\n" + + "\vput_headers\x18\x05 \x03(\v2-.gateway.CreateObjectResponse.PutHeadersEntryR\n" + + "putHeaders\x1a=\n" + + "\x0fPutHeadersEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xad\x01\n" + + "\x10PutObjectRequest\x12%\n" + + "\x0eobject_content\x18\x01 \x01(\fR\robjectContent\x12@\n" + + "\x0fobject_metadata\x18\x02 \x01(\v2\x17.gateway.ObjectMetadataR\x0eobjectMetadata\x12\x12\n" + + "\x04hash\x18\x03 \x01(\tR\x04hash\x12\x1c\n" + + "\toverwrite\x18\x04 \x01(\bR\toverwrite\"]\n" + + "\x11PutObjectResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x1b\n" + + "\tobject_id\x18\x02 \x01(\tR\bobjectId\x12\x1b\n" + + "\terror_msg\x18\x03 \x01(\tR\berrorMsg\"\xd6\x01\n" + + "\x1dSyncContainerWorkspaceRequest\x12!\n" + + "\fcontainer_id\x18\x01 \x01(\tR\vcontainerId\x12\x12\n" + + "\x04path\x18\x02 \x01(\tR\x04path\x12\x19\n" + + "\bnew_path\x18\x03 \x01(\tR\anewPath\x12\x15\n" + + "\x06is_dir\x18\x04 \x01(\bR\x05isDir\x12\x12\n" + + "\x04data\x18\x05 \x01(\fR\x04data\x128\n" + + "\x02op\x18\x06 \x01(\x0e2(.gateway.SyncContainerWorkspaceOperationR\x02op\"0\n" + + "\x1eSyncContainerWorkspaceResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\"\x17\n" + + "\x15ListContainersRequest\"w\n" + + "\x16ListContainersResponse\x120\n" + + "\n" + + "containers\x18\x01 \x03(\v2\x10.types.ContainerR\n" + + "containers\x12\x0e\n" + + "\x02ok\x18\x02 \x01(\bR\x02ok\x12\x1b\n" + + "\terror_msg\x18\x03 \x01(\tR\berrorMsg\"9\n" + + "\x14StopContainerRequest\x12!\n" + + "\fcontainer_id\x18\x01 \x01(\tR\vcontainerId\"D\n" + + "\x15StopContainerResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x1b\n" + + "\terror_msg\x18\x02 \x01(\tR\berrorMsg\"?\n" + + "\x1aCheckpointContainerRequest\x12!\n" + + "\fcontainer_id\x18\x01 \x01(\tR\vcontainerId\"o\n" + + "\x1bCheckpointContainerResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12#\n" + + "\rcheckpoint_id\x18\x02 \x01(\tR\fcheckpointId\x12\x1b\n" + + "\terror_msg\x18\x03 \x01(\tR\berrorMsg\"\xd3\x01\n" + + "\x16ContainerStreamMessage\x12J\n" + + "\x0eattach_request\x18\x01 \x01(\v2!.gateway.AttachToContainerRequestH\x00R\rattachRequest\x12b\n" + + "\x18sync_container_workspace\x18\x02 \x01(\v2&.gateway.SyncContainerWorkspaceRequestH\x00R\x16syncContainerWorkspaceB\t\n" + + "\apayload\"=\n" + + "\x18AttachToContainerRequest\x12!\n" + + "\fcontainer_id\x18\x01 \x01(\tR\vcontainerId\"d\n" + + "\x19AttachToContainerResponse\x12\x16\n" + + "\x06output\x18\x01 \x01(\tR\x06output\x12\x12\n" + + "\x04done\x18\x02 \x01(\bR\x04done\x12\x1b\n" + + "\texit_code\x18\x03 \x01(\x05R\bexitCode\"N\n" + + "\x10StartTaskRequest\x12\x17\n" + + "\atask_id\x18\x01 \x01(\tR\x06taskId\x12!\n" + + "\fcontainer_id\x18\x02 \x01(\tR\vcontainerId\"#\n" + + "\x11StartTaskResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\"\x85\x02\n" + + "\x0eEndTaskRequest\x12\x17\n" + + "\atask_id\x18\x01 \x01(\tR\x06taskId\x12#\n" + + "\rtask_duration\x18\x02 \x01(\x02R\ftaskDuration\x12\x1f\n" + + "\vtask_status\x18\x03 \x01(\tR\n" + + "taskStatus\x12!\n" + + "\fcontainer_id\x18\x04 \x01(\tR\vcontainerId\x12-\n" + + "\x12container_hostname\x18\x05 \x01(\tR\x11containerHostname\x12*\n" + + "\x11keep_warm_seconds\x18\x06 \x01(\x02R\x0fkeepWarmSeconds\x12\x16\n" + + "\x06result\x18\a \x01(\fR\x06result\"!\n" + + "\x0fEndTaskResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\"$\n" + + "\n" + + "StringList\x12\x16\n" + + "\x06values\x18\x01 \x03(\tR\x06values\"\xbb\x01\n" + + "\x10ListTasksRequest\x12@\n" + + "\afilters\x18\x01 \x03(\v2&.gateway.ListTasksRequest.FiltersEntryR\afilters\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\x1aO\n" + + "\fFiltersEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12)\n" + + "\x05value\x18\x02 \x01(\v2\x13.gateway.StringListR\x05value:\x028\x01\"\xb9\x03\n" + + "\x04Task\x12\x0e\n" + + "\x02id\x18\x02 \x01(\tR\x02id\x12\x16\n" + + "\x06status\x18\x03 \x01(\tR\x06status\x12!\n" + + "\fcontainer_id\x18\x04 \x01(\tR\vcontainerId\x129\n" + + "\n" + + "started_at\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\tstartedAt\x125\n" + + "\bended_at\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\aendedAt\x12\x17\n" + + "\astub_id\x18\a \x01(\tR\x06stubId\x12\x1b\n" + + "\tstub_name\x18\b \x01(\tR\bstubName\x12!\n" + + "\fworkspace_id\x18\t \x01(\tR\vworkspaceId\x12%\n" + + "\x0eworkspace_name\x18\n" + + " \x01(\tR\rworkspaceName\x129\n" + + "\n" + + "created_at\x18\v \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x129\n" + + "\n" + + "updated_at\x18\f \x01(\v2\x1a.google.protobuf.TimestampR\tupdatedAt\"w\n" + + "\x11ListTasksResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12#\n" + + "\x05tasks\x18\x03 \x03(\v2\r.gateway.TaskR\x05tasks\x12\x14\n" + + "\x05total\x18\x04 \x01(\x05R\x05total\"-\n" + + "\x10StopTasksRequest\x12\x19\n" + + "\btask_ids\x18\x01 \x03(\tR\ataskIds\"<\n" + + "\x11StopTasksResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"x\n" + + "\x06Volume\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1d\n" + + "\n" + + "mount_path\x18\x02 \x01(\tR\tmountPath\x124\n" + + "\x06config\x18\x03 \x01(\v2\x17.types.MountPointConfigH\x00R\x06config\x88\x01\x01B\t\n" + + "\a_config\"\x1f\n" + + "\tSecretVar\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"\x9e\x01\n" + + "\n" + + "Autoscaler\x12\x12\n" + + "\x04type\x18\x01 \x01(\tR\x04type\x12%\n" + + "\x0emax_containers\x18\x02 \x01(\rR\rmaxContainers\x12.\n" + + "\x13tasks_per_container\x18\x03 \x01(\rR\x11tasksPerContainer\x12%\n" + + "\x0emin_containers\x18\x04 \x01(\rR\rminContainers\"\xed\x01\n" + + "\tLLMConfig\x12\x19\n" + + "\bmodel_id\x18\x01 \x01(\tR\amodelId\x12\x16\n" + + "\x06engine\x18\x02 \x01(\tR\x06engine\x12*\n" + + "\x11served_model_name\x18\x03 \x01(\tR\x0fservedModelName\x12%\n" + + "\x0econtext_length\x18\x04 \x01(\x03R\rcontextLength\x12\x1c\n" + + "\ttokenizer\x18\x05 \x01(\tR\ttokenizer\x12!\n" + + "\fmetrics_path\x18\x06 \x01(\tR\vmetricsPath\x12\x19\n" + + "\bslo_tier\x18\a \x01(\tR\asloTier\"\xcc\x03\n" + + "\x15DatabaseServingConfig\x12\x12\n" + + "\x04kind\x18\x01 \x01(\tR\x04kind\x12\x12\n" + + "\x04port\x18\x02 \x01(\rR\x04port\x12'\n" + + "\x0freadiness_probe\x18\x03 \x01(\tR\x0ereadinessProbe\x12.\n" + + "\x13connection_env_name\x18\x04 \x01(\tR\x11connectionEnvName\x126\n" + + "\x17credential_secret_names\x18\x05 \x03(\tR\x15credentialSecretNames\x12'\n" + + "\x0fdurability_mode\x18\x06 \x01(\tR\x0edurabilityMode\x120\n" + + "\x14username_secret_name\x18\a \x01(\tR\x12usernameSecretName\x120\n" + + "\x14password_secret_name\x18\b \x01(\tR\x12passwordSecretName\x120\n" + + "\x14database_secret_name\x18\t \x01(\tR\x12databaseSecretName\x12;\n" + + "\x1aconnection_url_secret_name\x18\n" + + " \x01(\tR\x17connectionUrlSecretName\"\xb7\x01\n" + + "\rServingConfig\x12\x19\n" + + "\bapp_kind\x18\x01 \x01(\tR\aappKind\x12)\n" + + "\x10serving_protocol\x18\x02 \x01(\tR\x0fservingProtocol\x12$\n" + + "\x03llm\x18\x03 \x01(\v2\x12.gateway.LLMConfigR\x03llm\x12:\n" + + "\bdatabase\x18\x04 \x01(\v2\x1e.gateway.DatabaseServingConfigR\bdatabase\"\xa9\x01\n" + + "\vDurableDisk\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n" + + "\x04size\x18\x02 \x01(\tR\x04size\x12\x1d\n" + + "\n" + + "mount_path\x18\x03 \x01(\tR\tmountPath\x12\x1e\n" + + "\n" + + "filesystem\x18\x04 \x01(\tR\n" + + "filesystem\x12\x16\n" + + "\x06driver\x18\x05 \x01(\tR\x06driver\x12\x1b\n" + + "\tread_only\x18\x06 \x01(\bR\breadOnly\"Y\n" + + "\n" + + "TaskPolicy\x12\x18\n" + + "\atimeout\x18\x01 \x01(\x03R\atimeout\x12\x1f\n" + + "\vmax_retries\x18\x02 \x01(\rR\n" + + "maxRetries\x12\x10\n" + + "\x03ttl\x18\x03 \x01(\rR\x03ttl\"\x8e\x01\n" + + "\x06Schema\x123\n" + + "\x06fields\x18\x01 \x03(\v2\x1b.gateway.Schema.FieldsEntryR\x06fields\x1aO\n" + + "\vFieldsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12*\n" + + "\x05value\x18\x02 \x01(\v2\x14.gateway.SchemaFieldR\x05value:\x028\x01\"J\n" + + "\vSchemaField\x12\x12\n" + + "\x04type\x18\x01 \x01(\tR\x04type\x12'\n" + + "\x06fields\x18\x02 \x01(\v2\x0f.gateway.SchemaR\x06fields\"\xed\f\n" + + "\x16GetOrCreateStubRequest\x12\x1b\n" + + "\tobject_id\x18\x01 \x01(\tR\bobjectId\x12\x19\n" + + "\bimage_id\x18\x02 \x01(\tR\aimageId\x12\x1b\n" + + "\tstub_type\x18\x03 \x01(\tR\bstubType\x12\x12\n" + + "\x04name\x18\x04 \x01(\tR\x04name\x12%\n" + + "\x0epython_version\x18\x05 \x01(\tR\rpythonVersion\x12\x10\n" + + "\x03cpu\x18\x06 \x01(\x03R\x03cpu\x12\x16\n" + + "\x06memory\x18\a \x01(\x03R\x06memory\x12\x10\n" + + "\x03gpu\x18\b \x01(\tR\x03gpu\x12\x18\n" + + "\ahandler\x18\t \x01(\tR\ahandler\x12\x18\n" + + "\aretries\x18\n" + + " \x01(\rR\aretries\x12\x18\n" + + "\atimeout\x18\v \x01(\x03R\atimeout\x12*\n" + + "\x11keep_warm_seconds\x18\f \x01(\x02R\x0fkeepWarmSeconds\x12\x18\n" + + "\aworkers\x18\r \x01(\rR\aworkers\x12*\n" + + "\x11max_pending_tasks\x18\x0f \x01(\rR\x0fmaxPendingTasks\x12)\n" + + "\avolumes\x18\x10 \x03(\v2\x0f.gateway.VolumeR\avolumes\x12!\n" + + "\fforce_create\x18\x11 \x01(\bR\vforceCreate\x12\x19\n" + + "\bon_start\x18\x12 \x01(\tR\aonStart\x12!\n" + + "\fcallback_url\x18\x13 \x01(\tR\vcallbackUrl\x12\x1e\n" + + "\n" + + "authorized\x18\x14 \x01(\bR\n" + + "authorized\x12,\n" + + "\asecrets\x18\x15 \x03(\v2\x12.gateway.SecretVarR\asecrets\x123\n" + + "\n" + + "autoscaler\x18\x16 \x01(\v2\x13.gateway.AutoscalerR\n" + + "autoscaler\x124\n" + + "\vtask_policy\x18\x17 \x01(\v2\x13.gateway.TaskPolicyR\n" + + "taskPolicy\x12/\n" + + "\x13concurrent_requests\x18\x18 \x01(\rR\x12concurrentRequests\x12\x14\n" + + "\x05extra\x18\x19 \x01(\tR\x05extra\x12-\n" + + "\x12checkpoint_enabled\x18\x1a \x01(\bR\x11checkpointEnabled\x12\x1b\n" + + "\tgpu_count\x18\x1b \x01(\rR\bgpuCount\x12\x1b\n" + + "\ton_deploy\x18\x1c \x01(\tR\bonDeploy\x12)\n" + + "\x11on_deploy_stub_id\x18\x1d \x01(\tR\x0eonDeployStubId\x12\x1e\n" + + "\n" + + "entrypoint\x18\x1e \x03(\tR\n" + + "entrypoint\x12\x14\n" + + "\x05ports\x18\x1f \x03(\rR\x05ports\x12\x10\n" + + "\x03env\x18 \x03(\tR\x03env\x12\x19\n" + + "\bapp_name\x18! \x01(\tR\aappName\x12.\n" + + "\apricing\x18\" \x01(\v2\x14.types.PricingPolicyR\apricing\x12'\n" + + "\x06inputs\x18# \x01(\v2\x0f.gateway.SchemaR\x06inputs\x12)\n" + + "\aoutputs\x18$ \x01(\v2\x0f.gateway.SchemaR\aoutputs\x12\x10\n" + + "\x03tcp\x18% \x01(\bR\x03tcp\x12#\n" + + "\rblock_network\x18& \x01(\bR\fblockNetwork\x12\x1d\n" + + "\n" + + "allow_list\x18' \x03(\tR\tallowList\x12%\n" + + "\x0edocker_enabled\x18( \x01(\bR\rdockerEnabled\x12'\n" + + "\x04pool\x18) \x01(\v2\x13.gateway.PoolConfigR\x04pool\x12\x1d\n" + + "\n" + + "is_service\x18* \x01(\bR\tisService\x120\n" + + "\aserving\x18+ \x01(\v2\x16.gateway.ServingConfigR\aserving\x12*\n" + + "\x05disks\x18, \x03(\v2\x14.gateway.DurableDiskR\x05disks\x12+\n" + + "\x11allow_marketplace\x18- \x01(\bR\x10allowMarketplace\x12G\n" + + "\x12checkpoint_trigger\x18. \x01(\v2\x18.types.CheckpointTriggerR\x11checkpointTrigger\x12'\n" + + "\x0fgpu_virtualized\x18/ \x01(\bR\x0egpuVirtualized\"\xfc\x01\n" + + "\x17GetOrCreateStubResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\astub_id\x18\x02 \x01(\tR\x06stubId\x12\x17\n" + + "\aerr_msg\x18\x03 \x01(\tR\x06errMsg\x12\x19\n" + + "\bwarn_msg\x18\x04 \x01(\tR\awarnMsg\x12'\n" + + "\x0fcapacity_status\x18\x05 \x01(\tR\x0ecapacityStatus\x12)\n" + + "\x10unsupported_gpus\x18\x06 \x03(\tR\x0funsupportedGpus\x120\n" + + "\x14matched_private_pool\x18\a \x01(\tR\x12matchedPrivatePool\"Z\n" + + "\x11DeployStubRequest\x12\x17\n" + + "\astub_id\x18\x01 \x01(\tR\x06stubId\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x18\n" + + "\arollout\x18\x03 \x01(\tR\arollout\"\xdd\x01\n" + + "\x12DeployStubResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12#\n" + + "\rdeployment_id\x18\x02 \x01(\tR\fdeploymentId\x12\x18\n" + + "\aversion\x18\x03 \x01(\rR\aversion\x12\x1d\n" + + "\n" + + "invoke_url\x18\x04 \x01(\tR\tinvokeUrl\x12\x17\n" + + "\aerr_msg\x18\x05 \x01(\tR\x06errMsg\x12\x19\n" + + "\bwarn_msg\x18\x06 \x01(\tR\awarnMsg\x12%\n" + + "\x0erollout_action\x18\a \x01(\tR\rrolloutAction\"\x9b\x04\n" + + "\n" + + "Deployment\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x16\n" + + "\x06active\x18\x03 \x01(\bR\x06active\x12\x17\n" + + "\astub_id\x18\x04 \x01(\tR\x06stubId\x12\x1b\n" + + "\tstub_type\x18\x05 \x01(\tR\bstubType\x12\x1b\n" + + "\tstub_name\x18\x06 \x01(\tR\bstubName\x12\x18\n" + + "\aversion\x18\a \x01(\rR\aversion\x12!\n" + + "\fworkspace_id\x18\b \x01(\tR\vworkspaceId\x12%\n" + + "\x0eworkspace_name\x18\t \x01(\tR\rworkspaceName\x129\n" + + "\n" + + "created_at\x18\n" + + " \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x129\n" + + "\n" + + "updated_at\x18\v \x01(\v2\x1a.google.protobuf.TimestampR\tupdatedAt\x12\x15\n" + + "\x06app_id\x18\f \x01(\tR\x05appId\x12#\n" + + "\rdatabase_kind\x18\r \x01(\tR\fdatabaseKind\x128\n" + + "\x18connection_string_secret\x18\x0e \x01(\tR\x16connectionStringSecret\x12.\n" + + "\x13connection_env_name\x18\x0f \x01(\tR\x11connectionEnvName\"\xc7\x01\n" + + "\x16ListDeploymentsRequest\x12F\n" + + "\afilters\x18\x01 \x03(\v2,.gateway.ListDeploymentsRequest.FiltersEntryR\afilters\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\x1aO\n" + + "\fFiltersEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12)\n" + + "\x05value\x18\x02 \x01(\v2\x13.gateway.StringListR\x05value:\x028\x01\"y\n" + + "\x17ListDeploymentsResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x125\n" + + "\vdeployments\x18\x03 \x03(\v2\x13.gateway.DeploymentR\vdeployments\"'\n" + + "\x15StopDeploymentRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\"A\n" + + "\x16StopDeploymentResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"(\n" + + "\x16StartDeploymentRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\"B\n" + + "\x17StartDeploymentResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"H\n" + + "\x16ScaleDeploymentRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1e\n" + + "\n" + + "containers\x18\x02 \x01(\rR\n" + + "containers\"B\n" + + "\x17ScaleDeploymentResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\")\n" + + "\x17DeleteDeploymentRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\"C\n" + + "\x18DeleteDeploymentResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"\xec\x02\n" + + "\x04Pool\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x16\n" + + "\x06active\x18\x03 \x01(\bR\x06active\x12\x10\n" + + "\x03gpu\x18\x04 \x01(\tR\x03gpu\x12\x1e\n" + + "\n" + + "minFreeGpu\x18\x05 \x01(\tR\n" + + "minFreeGpu\x12\x1e\n" + + "\n" + + "minFreeCpu\x18\x06 \x01(\tR\n" + + "minFreeCpu\x12$\n" + + "\rminFreeMemory\x18\a \x01(\tR\rminFreeMemory\x12*\n" + + "\x10defaultWorkerCpu\x18\b \x01(\tR\x10defaultWorkerCpu\x120\n" + + "\x13defaultWorkerMemory\x18\t \x01(\tR\x13defaultWorkerMemory\x124\n" + + "\x15defaultWorkerGpuCount\x18\n" + + " \x01(\tR\x15defaultWorkerGpuCount\x12,\n" + + "\x05state\x18\v \x01(\v2\x16.types.WorkerPoolStateR\x05state\"\xbb\x01\n" + + "\x10ListPoolsRequest\x12@\n" + + "\afilters\x18\x01 \x03(\v2&.gateway.ListPoolsRequest.FiltersEntryR\afilters\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\x1aO\n" + + "\fFiltersEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12)\n" + + "\x05value\x18\x02 \x01(\v2\x13.gateway.StringListR\x05value:\x028\x01\"a\n" + + "\x11ListPoolsResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12#\n" + + "\x05pools\x18\x03 \x03(\v2\r.gateway.PoolR\x05pools\"\xf9\x02\n" + + "\n" + + "PoolConfig\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x10\n" + + "\x03gpu\x18\x02 \x03(\tR\x03gpu\x12\x14\n" + + "\x05nodes\x18\x03 \x01(\rR\x05nodes\x12\x10\n" + + "\x03ttl\x18\x04 \x01(\tR\x03ttl\x12\x1b\n" + + "\tmax_spend\x18\x05 \x01(\x01R\bmaxSpend\x12\x1c\n" + + "\tproviders\x18\x06 \x03(\tR\tproviders\x12\x18\n" + + "\aregions\x18\a \x03(\tR\aregions\x12'\n" + + "\x0fmin_reliability\x18\b \x01(\x01R\x0eminReliability\x12\x1a\n" + + "\bselector\x18\t \x01(\tR\bselector\x12\x12\n" + + "\x04mode\x18\n" + + " \x01(\tR\x04mode\x12\x1c\n" + + "\ttransport\x18\v \x01(\tR\ttransport\x12\x1a\n" + + "\bfallback\x18\f \x01(\tR\bfallback\x12\x1a\n" + + "\bpriority\x18\r \x01(\x05R\bpriority\x12\x19\n" + + "\boffer_id\x18\x0e \x01(\tR\aofferId\"\xd2\x04\n" + + "\tPoolOffer\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1a\n" + + "\bprovider\x18\x02 \x01(\tR\bprovider\x12#\n" + + "\rinstance_type\x18\x03 \x01(\tR\finstanceType\x12\x16\n" + + "\x06region\x18\x04 \x01(\tR\x06region\x12\x10\n" + + "\x03gpu\x18\x05 \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\x06 \x01(\rR\bgpuCount\x12%\n" + + "\x0ecpu_millicores\x18\a \x01(\x03R\rcpuMillicores\x12\x1b\n" + + "\tmemory_mb\x18\b \x01(\x03R\bmemoryMb\x12,\n" + + "\x12hourly_cost_micros\x18\t \x01(\x03R\x10hourlyCostMicros\x12 \n" + + "\vreliability\x18\n" + + " \x01(\x01R\vreliability\x12\x1c\n" + + "\tavailable\x18\v \x01(\rR\tavailable\x12\x1d\n" + + "\n" + + "storage_mb\x18\f \x01(\x03R\tstorageMb\x12\x14\n" + + "\x05cloud\x18\r \x01(\tR\x05cloud\x12\x1d\n" + + "\n" + + "node_count\x18\x0e \x01(\rR\tnodeCount\x12!\n" + + "\fdisplay_name\x18\x0f \x01(\tR\vdisplayName\x12\x1a\n" + + "\bcategory\x18\x10 \x01(\tR\bcategory\x12.\n" + + "\x13region_display_name\x18\x11 \x01(\tR\x11regionDisplayName\x12\x1a\n" + + "\blatitude\x18\x12 \x01(\x01R\blatitude\x12\x1c\n" + + "\tlongitude\x18\x13 \x01(\x01R\tlongitude\"\xfb\x05\n" + + "\x10ProviderInstance\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1b\n" + + "\tpool_name\x18\x02 \x01(\tR\bpoolName\x12\x1a\n" + + "\bprovider\x18\x03 \x01(\tR\bprovider\x12\x19\n" + + "\boffer_id\x18\x04 \x01(\tR\aofferId\x12\x16\n" + + "\x06status\x18\x05 \x01(\tR\x06status\x12\x1b\n" + + "\tgpu_count\x18\x06 \x01(\rR\bgpuCount\x12,\n" + + "\x12hourly_cost_micros\x18\a \x01(\x03R\x10hourlyCostMicros\x12\x16\n" + + "\x06source\x18\b \x01(\tR\x06source\x129\n" + + "\n" + + "created_at\x18\t \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x129\n" + + "\n" + + "expires_at\x18\n" + + " \x01(\v2\x1a.google.protobuf.TimestampR\texpiresAt\x12H\n" + + "\x12billing_renewal_at\x18\v \x01(\v2\x1a.google.protobuf.TimestampR\x10billingRenewalAt\x12%\n" + + "\x0estatus_message\x18\f \x01(\tR\rstatusMessage\x12-\n" + + "\x12terminating_reason\x18\r \x01(\tR\x11terminatingReason\x12\x1d\n" + + "\n" + + "machine_id\x18\x0e \x01(\tR\tmachineId\x12\x14\n" + + "\x05cloud\x18\x0f \x01(\tR\x05cloud\x12\x16\n" + + "\x06region\x18\x10 \x01(\tR\x06region\x12\x1d\n" + + "\n" + + "node_count\x18\x11 \x01(\rR\tnodeCount\x12#\n" + + "\rinstance_type\x18\x12 \x01(\tR\finstanceType\x12%\n" + + "\x0ecpu_millicores\x18\x13 \x01(\x03R\rcpuMillicores\x12\x1b\n" + + "\tmemory_mb\x18\x14 \x01(\x03R\bmemoryMb\x12\x1d\n" + + "\n" + + "storage_mb\x18\x15 \x01(\x03R\tstorageMb\"\xad\x04\n" + + "\vPrivatePool\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x1a\n" + + "\bselector\x18\x02 \x01(\tR\bselector\x12+\n" + + "\x06config\x18\x03 \x01(\v2\x13.gateway.PoolConfigR\x06config\x12=\n" + + "\freservations\x18\x04 \x03(\v2\x19.gateway.ProviderInstanceR\freservations\x124\n" + + "\x16committed_spend_micros\x18\x06 \x01(\x03R\x14committedSpendMicros\x12\x16\n" + + "\x06status\x18\a \x01(\tR\x06status\x12\x16\n" + + "\x06source\x18\b \x01(\tR\x06source\x129\n" + + "\n" + + "created_at\x18\t \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x129\n" + + "\n" + + "expires_at\x18\n" + + " \x01(\v2\x1a.google.protobuf.TimestampR\texpiresAt\x12#\n" + + "\rmachine_count\x18\v \x01(\rR\fmachineCount\x12.\n" + + "\x13ready_machine_count\x18\f \x01(\rR\x11readyMachineCount\x12%\n" + + "\x0ereserved_nodes\x18\r \x01(\rR\rreservedNodes\x12*\n" + + "\x04byoc\x18\x0e \x01(\v2\x16.gateway.BYOCPoolStateR\x04byoc\"@\n" + + "\x15ListPoolOffersRequest\x12'\n" + + "\x04pool\x18\x01 \x01(\v2\x13.gateway.PoolConfigR\x04pool\"m\n" + + "\x16ListPoolOffersResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12*\n" + + "\x06offers\x18\x03 \x03(\v2\x12.gateway.PoolOfferR\x06offers\"Z\n" + + "\x19LaunchPoolCapacityRequest\x12'\n" + + "\x04pool\x18\x01 \x01(\v2\x13.gateway.PoolConfigR\x04pool\x12\x14\n" + + "\x05nodes\x18\x02 \x01(\rR\x05nodes\"\xde\x01\n" + + "\x1aLaunchPoolCapacityResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12(\n" + + "\x04pool\x18\x03 \x01(\v2\x14.gateway.PrivatePoolR\x04pool\x12\x1d\n" + + "\n" + + "error_code\x18\x04 \x01(\tR\terrorCode\x12%\n" + + "\x0erequired_cents\x18\x05 \x01(\x03R\rrequiredCents\x12'\n" + + "\x0favailable_cents\x18\x06 \x01(\x03R\x0eavailableCents\"\xc9\x01\n" + + "\x17ListPrivatePoolsRequest\x12G\n" + + "\afilters\x18\x01 \x03(\v2-.gateway.ListPrivatePoolsRequest.FiltersEntryR\afilters\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\x1aO\n" + + "\fFiltersEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12)\n" + + "\x05value\x18\x02 \x01(\v2\x13.gateway.StringListR\x05value:\x028\x01\"o\n" + + "\x18ListPrivatePoolsResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12*\n" + + "\x05pools\x18\x03 \x03(\v2\x14.gateway.PrivatePoolR\x05pools\"\x9d\x02\n" + + "\x15CreateBYOCPoolRequest\x12\x1a\n" + + "\bprovider\x18\x01 \x01(\tR\bprovider\x12\x1b\n" + + "\tpool_name\x18\x02 \x01(\tR\bpoolName\x12\x16\n" + + "\x06region\x18\x03 \x01(\tR\x06region\x12#\n" + + "\rinstance_type\x18\x04 \x01(\tR\finstanceType\x12#\n" + + "\rdesired_nodes\x18\x05 \x01(\rR\fdesiredNodes\x12\x1b\n" + + "\tmax_nodes\x18\x06 \x01(\rR\bmaxNodes\x12\x1d\n" + + "\n" + + "account_id\x18\a \x01(\tR\taccountId\x12\x10\n" + + "\x03gpu\x18\b \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\t \x01(\rR\bgpuCount\"\xfc\x01\n" + + "\x16CreateBYOCPoolResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12(\n" + + "\x04pool\x18\x03 \x01(\v2\x14.gateway.PrivatePoolR\x04pool\x12\x1b\n" + + "\tsetup_url\x18\x04 \x01(\tR\bsetupUrl\x12#\n" + + "\rresource_name\x18\x05 \x01(\tR\fresourceName\x12!\n" + + "\fresource_url\x18\x06 \x01(\tR\vresourceUrl\x12*\n" + + "\x04byoc\x18\a \x01(\v2\x16.gateway.BYOCPoolStateR\x04byoc\"\xd8\x05\n" + + "\rBYOCPoolState\x12\x1a\n" + + "\bprovider\x18\x01 \x01(\tR\bprovider\x12\x1d\n" + + "\n" + + "account_id\x18\x02 \x01(\tR\taccountId\x12\x16\n" + + "\x06region\x18\x03 \x01(\tR\x06region\x12#\n" + + "\rresource_name\x18\x04 \x01(\tR\fresourceName\x12!\n" + + "\fresource_url\x18\x05 \x01(\tR\vresourceUrl\x12\x1f\n" + + "\vdestroy_url\x18\x06 \x01(\tR\n" + + "destroyUrl\x12\x14\n" + + "\x05phase\x18\a \x01(\tR\x05phase\x12#\n" + + "\rdesired_nodes\x18\b \x01(\rR\fdesiredNodes\x12\x1b\n" + + "\tmax_nodes\x18\t \x01(\rR\bmaxNodes\x12)\n" + + "\x10target_sandboxes\x18\n" + + " \x01(\rR\x0ftargetSandboxes\x12,\n" + + "\x12sandboxes_per_node\x18\v \x01(\rR\x10sandboxesPerNode\x12#\n" + + "\rinstance_type\x18\f \x01(\tR\finstanceType\x12#\n" + + "\rmachine_count\x18\r \x01(\rR\fmachineCount\x12.\n" + + "\x13ready_machine_count\x18\x0e \x01(\rR\x11readyMachineCount\x12\x18\n" + + "\amessage\x18\x0f \x01(\tR\amessage\x12,\n" + + "\x12hourly_cost_micros\x18\x10 \x01(\x03R\x10hourlyCostMicros\x127\n" + + "\x18total_hourly_cost_micros\x18\x11 \x01(\x03R\x15totalHourlyCostMicros\x120\n" + + "\x14direct_scale_enabled\x18\x12 \x01(\bR\x12directScaleEnabled\x12\x10\n" + + "\x03gpu\x18\x13 \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\x14 \x01(\rR\bgpuCount\"1\n" + + "\x12GetBYOCPoolRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\"\xff\x01\n" + + "\x13GetBYOCPoolResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12(\n" + + "\x04pool\x18\x03 \x01(\v2\x14.gateway.PrivatePoolR\x04pool\x12\x14\n" + + "\x05ready\x18\x04 \x01(\bR\x05ready\x12.\n" + + "\x13ready_machine_count\x18\x05 \x01(\rR\x11readyMachineCount\x12#\n" + + "\rmachine_count\x18\x06 \x01(\rR\fmachineCount\x12*\n" + + "\x04byoc\x18\a \x01(\v2\x16.gateway.BYOCPoolStateR\x04byoc\"u\n" + + "\x14ScaleBYOCPoolRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\x12#\n" + + "\rdesired_nodes\x18\x02 \x01(\rR\fdesiredNodes\x12\x1b\n" + + "\tmax_nodes\x18\x03 \x01(\rR\bmaxNodes\"\x96\x01\n" + + "\x15ScaleBYOCPoolResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12(\n" + + "\x04pool\x18\x03 \x01(\v2\x14.gateway.PrivatePoolR\x04pool\x12*\n" + + "\x04byoc\x18\x04 \x01(\v2\x16.gateway.BYOCPoolStateR\x04byoc\"\xe2\x04\n" + + "\x12MarketplaceListing\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12.\n" + + "\x13seller_workspace_id\x18\x02 \x01(\tR\x11sellerWorkspaceId\x12!\n" + + "\fdisplay_name\x18\x03 \x01(\tR\vdisplayName\x12\x10\n" + + "\x03gpu\x18\x04 \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\x05 \x01(\rR\bgpuCount\x12\x16\n" + + "\x06source\x18\x06 \x01(\tR\x06source\x12 \n" + + "\vpreemptible\x18\a \x01(\bR\vpreemptible\x12\x16\n" + + "\x06public\x18\b \x01(\bR\x06public\x12\x16\n" + + "\x06status\x18\t \x01(\tR\x06status\x12\x1b\n" + + "\tpool_name\x18\n" + + " \x01(\tR\bpoolName\x129\n" + + "\n" + + "created_at\x18\v \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x129\n" + + "\n" + + "updated_at\x18\f \x01(\v2\x1a.google.protobuf.TimestampR\tupdatedAt\x12#\n" + + "\rmachine_count\x18\r \x01(\rR\fmachineCount\x12.\n" + + "\x13ready_machine_count\x18\x0e \x01(\rR\x11readyMachineCount\x12\x16\n" + + "\x06region\x18\x0f \x01(\tR\x06region\x12\x18\n" + + "\aruntime\x18\x10 \x01(\tR\aruntime\x126\n" + + "\x18price_per_gpu_hour_cents\x18\x11 \x01(\rR\x14pricePerGpuHourCents\"\x9a\x05\n" + + "\x10MarketplaceOffer\x12\x1d\n" + + "\n" + + "listing_id\x18\x01 \x01(\tR\tlistingId\x12.\n" + + "\x13seller_workspace_id\x18\x02 \x01(\tR\x11sellerWorkspaceId\x12!\n" + + "\fdisplay_name\x18\x03 \x01(\tR\vdisplayName\x12\x10\n" + + "\x03gpu\x18\x04 \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\x05 \x01(\rR\bgpuCount\x12\x16\n" + + "\x06source\x18\x06 \x01(\tR\x06source\x12 \n" + + "\vpreemptible\x18\a \x01(\bR\vpreemptible\x12#\n" + + "\rmachine_count\x18\b \x01(\rR\fmachineCount\x12.\n" + + "\x13ready_machine_count\x18\t \x01(\rR\x11readyMachineCount\x12\x18\n" + + "\aruntime\x18\n" + + " \x01(\tR\aruntime\x12\x16\n" + + "\x06region\x18\v \x01(\tR\x06region\x12\x1b\n" + + "\tcpu_cores\x18\f \x01(\rR\bcpuCores\x12\x1b\n" + + "\tmemory_mb\x18\r \x01(\x04R\bmemoryMb\x12\x17\n" + + "\adisk_gb\x18\x0e \x01(\x04R\x06diskGb\x12$\n" + + "\x0efree_gpu_count\x18\x0f \x01(\rR\ffreeGpuCount\x12 \n" + + "\vreliability\x18\x10 \x01(\x02R\vreliability\x129\n" + + "\n" + + "created_at\x18\x11 \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x12\x16\n" + + "\x06public\x18\x12 \x01(\bR\x06public\x126\n" + + "\x18price_per_gpu_hour_cents\x18\x13 \x01(\rR\x14pricePerGpuHourCents\"\xb2\x02\n" + + "\x1fCreateMarketplaceListingRequest\x12!\n" + + "\fdisplay_name\x18\x01 \x01(\tR\vdisplayName\x12\x10\n" + + "\x03gpu\x18\x02 \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\x03 \x01(\rR\bgpuCount\x12\x16\n" + + "\x06source\x18\x04 \x01(\tR\x06source\x12 \n" + + "\vpreemptible\x18\x05 \x01(\bR\vpreemptible\x12\x16\n" + + "\x06public\x18\x06 \x01(\bR\x06public\x12\x16\n" + + "\x06region\x18\a \x01(\tR\x06region\x12\x1b\n" + + "\tpool_name\x18\b \x01(\tR\bpoolName\x126\n" + + "\x18price_per_gpu_hour_cents\x18\t \x01(\rR\x14pricePerGpuHourCents\"\x82\x01\n" + + " CreateMarketplaceListingResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x125\n" + + "\alisting\x18\x03 \x01(\v2\x1b.gateway.MarketplaceListingR\alisting\"\x93\x03\n" + + "\x1fUpdateMarketplaceListingRequest\x12\x1d\n" + + "\n" + + "listing_id\x18\x01 \x01(\tR\tlistingId\x12!\n" + + "\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\x12\x10\n" + + "\x03gpu\x18\x03 \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\x04 \x01(\rR\bgpuCount\x12\x16\n" + + "\x06source\x18\x05 \x01(\tR\x06source\x12%\n" + + "\vpreemptible\x18\x06 \x01(\bH\x00R\vpreemptible\x88\x01\x01\x12\x1b\n" + + "\x06public\x18\a \x01(\bH\x01R\x06public\x88\x01\x01\x12\x16\n" + + "\x06status\x18\b \x01(\tR\x06status\x12\x16\n" + + "\x06region\x18\t \x01(\tR\x06region\x12;\n" + + "\x18price_per_gpu_hour_cents\x18\n" + + " \x01(\rH\x02R\x14pricePerGpuHourCents\x88\x01\x01B\x0e\n" + + "\f_preemptibleB\t\n" + + "\a_publicB\x1b\n" + + "\x19_price_per_gpu_hour_cents\"\x82\x01\n" + + " UpdateMarketplaceListingResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x125\n" + + "\alisting\x18\x03 \x01(\v2\x1b.gateway.MarketplaceListingR\alisting\"@\n" + + "\x1fDeleteMarketplaceListingRequest\x12\x1d\n" + + "\n" + + "listing_id\x18\x01 \x01(\tR\tlistingId\"K\n" + + " DeleteMarketplaceListingResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"6\n" + + "\x1eListMarketplaceListingsRequest\x12\x14\n" + + "\x05limit\x18\x01 \x01(\rR\x05limit\"\x83\x01\n" + + "\x1fListMarketplaceListingsResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x127\n" + + "\blistings\x18\x03 \x03(\v2\x1b.gateway.MarketplaceListingR\blistings\"S\n" + + " GetMarketplaceJoinCommandRequest\x12\x1d\n" + + "\n" + + "listing_id\x18\x01 \x01(\tR\tlistingId\x12\x10\n" + + "\x03ttl\x18\x02 \x01(\tR\x03ttl\"\xb7\x01\n" + + "!GetMarketplaceJoinCommandResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12\x18\n" + + "\acommand\x18\x03 \x01(\tR\acommand\x12\x14\n" + + "\x05token\x18\x04 \x01(\tR\x05token\x129\n" + + "\n" + + "expires_at\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\texpiresAt\"F\n" + + "\x1cListMarketplaceOffersRequest\x12\x10\n" + + "\x03gpu\x18\x01 \x01(\tR\x03gpu\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\"{\n" + + "\x1dListMarketplaceOffersResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x121\n" + + "\x06offers\x18\x03 \x03(\v2\x19.gateway.MarketplaceOfferR\x06offers\";\n" + + "\x1aGetMarketplaceOfferRequest\x12\x1d\n" + + "\n" + + "listing_id\x18\x01 \x01(\tR\tlistingId\"w\n" + + "\x1bGetMarketplaceOfferResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12/\n" + + "\x05offer\x18\x03 \x01(\v2\x19.gateway.MarketplaceOfferR\x05offer\"\x88\x03\n" + + "\x11MarketplaceRental\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1d\n" + + "\n" + + "listing_id\x18\x02 \x01(\tR\tlistingId\x12!\n" + + "\flisting_name\x18\x03 \x01(\tR\vlistingName\x12\x1b\n" + + "\tpool_name\x18\x04 \x01(\tR\bpoolName\x12\x1d\n" + + "\n" + + "machine_id\x18\x05 \x01(\tR\tmachineId\x12\x10\n" + + "\x03gpu\x18\x06 \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\a \x01(\rR\bgpuCount\x12\x16\n" + + "\x06region\x18\b \x01(\tR\x06region\x12+\n" + + "\x11machine_connected\x18\t \x01(\bR\x10machineConnected\x129\n" + + "\n" + + "created_at\x18\n" + + " \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x126\n" + + "\x18price_per_gpu_hour_cents\x18\v \x01(\rR\x14pricePerGpuHourCents\"{\n" + + "\x1eCreateMarketplaceRentalRequest\x12\x1d\n" + + "\n" + + "listing_id\x18\x01 \x01(\tR\tlistingId\x12\x1d\n" + + "\n" + + "machine_id\x18\x02 \x01(\tR\tmachineId\x12\x1b\n" + + "\tgpu_count\x18\x03 \x01(\rR\bgpuCount\"~\n" + + "\x1fCreateMarketplaceRentalResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x122\n" + + "\x06rental\x18\x03 \x01(\v2\x1a.gateway.MarketplaceRentalR\x06rental\"\x1f\n" + + "\x1dListMarketplaceRentalsRequest\"\x7f\n" + + "\x1eListMarketplaceRentalsResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x124\n" + + "\arentals\x18\x03 \x03(\v2\x1a.gateway.MarketplaceRentalR\arentals\"=\n" + + "\x1eDeleteMarketplaceRentalRequest\x12\x1b\n" + + "\trental_id\x18\x01 \x01(\tR\brentalId\"J\n" + + "\x1fDeleteMarketplaceRentalResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"\xc8\x01\n" + + "\x1bLaunchRentalWorkloadRequest\x12\x1b\n" + + "\trental_id\x18\x01 \x01(\tR\brentalId\x12\x12\n" + + "\x04kind\x18\x02 \x01(\tR\x04kind\x12\x19\n" + + "\bimage_id\x18\x03 \x01(\tR\aimageId\x12\x18\n" + + "\acommand\x18\x04 \x03(\tR\acommand\x12\x14\n" + + "\x05ports\x18\x05 \x03(\rR\x05ports\x12\x1b\n" + + "\tgpu_count\x18\x06 \x01(\rR\bgpuCount\x12\x10\n" + + "\x03env\x18\a \x03(\tR\x03env\"\xf2\x01\n" + + "\x1cLaunchRentalWorkloadResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12!\n" + + "\fcontainer_id\x18\x03 \x01(\tR\vcontainerId\x12\x17\n" + + "\astub_id\x18\x04 \x01(\tR\x06stubId\x12\x10\n" + + "\x03url\x18\x05 \x01(\tR\x03url\x12#\n" + + "\rshell_command\x18\x06 \x01(\tR\fshellCommand\x12\x1a\n" + + "\busername\x18\a \x01(\tR\busername\x12\x1a\n" + + "\bpassword\x18\b \x01(\tR\bpassword\"U\n" + + "\x1eListMarketplaceMachinesRequest\x12\x1d\n" + + "\n" + + "listing_id\x18\x01 \x01(\tR\tlistingId\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\"x\n" + + "\x1fListMarketplaceMachinesResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12,\n" + + "\bmachines\x18\x03 \x03(\v2\x10.gateway.MachineR\bmachines\"Z\n" + + "\x1cListMachineContainersRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\x12\x1d\n" + + "\n" + + "machine_id\x18\x02 \x01(\tR\tmachineId\"\xa4\x02\n" + + "\x10MachineContainer\x12!\n" + + "\fcontainer_id\x18\x01 \x01(\tR\vcontainerId\x12\x17\n" + + "\astub_id\x18\x02 \x01(\tR\x06stubId\x12\x16\n" + + "\x06status\x18\x03 \x01(\tR\x06status\x12!\n" + + "\fworkspace_id\x18\x04 \x01(\tR\vworkspaceId\x12\x10\n" + + "\x03gpu\x18\x05 \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\x06 \x01(\rR\bgpuCount\x12\x10\n" + + "\x03cpu\x18\a \x01(\x03R\x03cpu\x12\x16\n" + + "\x06memory\x18\b \x01(\x03R\x06memory\x12!\n" + + "\fscheduled_at\x18\t \x01(\x03R\vscheduledAt\x12\x1d\n" + + "\n" + + "started_at\x18\n" + + " \x01(\x03R\tstartedAt\"\x83\x01\n" + + "\x1dListMachineContainersResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x129\n" + + "\n" + + "containers\x18\x03 \x03(\v2\x19.gateway.MachineContainerR\n" + + "containers\"<\n" + + "\x11CreatePoolRequest\x12'\n" + + "\x04pool\x18\x01 \x01(\v2\x13.gateway.PoolConfigR\x04pool\"g\n" + + "\x12CreatePoolResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12(\n" + + "\x04pool\x18\x03 \x01(\v2\x14.gateway.PrivatePoolR\x04pool\"'\n" + + "\x11DeletePoolRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"=\n" + + "\x12DeletePoolResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"^\n" + + "\x19ExtendPoolCapacityRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x10\n" + + "\x03ttl\x18\x02 \x01(\tR\x03ttl\x12\x1b\n" + + "\tmax_spend\x18\x03 \x01(\x01R\bmaxSpend\"o\n" + + "\x1aExtendPoolCapacityResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12(\n" + + "\x04pool\x18\x03 \x01(\v2\x14.gateway.PrivatePoolR\x04pool\"K\n" + + "\x1aCreatePoolJoinTokenRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\x12\x10\n" + + "\x03ttl\x18\x02 \x01(\tR\x03ttl\"\x97\x01\n" + + "\x1bCreatePoolJoinTokenResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12\x14\n" + + "\x05token\x18\x03 \x01(\tR\x05token\x129\n" + + "\n" + + "expires_at\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\texpiresAt\"2\n" + + "\x1aRevokePoolJoinTokenRequest\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\"F\n" + + "\x1bRevokePoolJoinTokenResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"J\n" + + "\x19GetPoolJoinCommandRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\x12\x10\n" + + "\x03ttl\x18\x02 \x01(\tR\x03ttl\"\xb0\x01\n" + + "\x1aGetPoolJoinCommandResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12\x18\n" + + "\acommand\x18\x03 \x01(\tR\acommand\x12\x14\n" + + "\x05token\x18\x04 \x01(\tR\x05token\x129\n" + + "\n" + + "expires_at\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\texpiresAt\"L\n" + + "\x17ListPoolMachinesRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\"q\n" + + "\x18ListPoolMachinesResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12,\n" + + "\bmachines\x18\x03 \x03(\v2\x10.gateway.MachineR\bmachines\"\x94\x05\n" + + "\x14AgentBootstrapConfig\x12(\n" + + "\x10gateway_http_url\x18\x01 \x01(\tR\x0egatewayHttpUrl\x12*\n" + + "\x11gateway_grpc_host\x18\x02 \x01(\tR\x0fgatewayGrpcHost\x12*\n" + + "\x11gateway_grpc_port\x18\x03 \x01(\x05R\x0fgatewayGrpcPort\x12(\n" + + "\x10gateway_grpc_tls\x18\x04 \x01(\bR\x0egatewayGrpcTls\x12!\n" + + "\fworkspace_id\x18\x05 \x01(\tR\vworkspaceId\x12\x1b\n" + + "\tpool_name\x18\x06 \x01(\tR\bpoolName\x12\x1c\n" + + "\ttransport\x18\a \x01(\tR\ttransport\x12\x1a\n" + + "\bexecutor\x18\b \x01(\tR\bexecutor\x12\x1a\n" + + "\bfallback\x18\t \x01(\tR\bfallback\x12+\n" + + "\x11disabled_services\x18\n" + + " \x03(\tR\x10disabledServices\x120\n" + + "\x14image_registry_store\x18\v \x01(\tR\x12imageRegistryStore\x12,\n" + + "\x12image_clip_version\x18\f \x01(\rR\x10imageClipVersion\x129\n" + + "\x19image_local_cache_enabled\x18\r \x01(\bR\x16imageLocalCacheEnabled\x12;\n" + + "\ttelemetry\x18\x0e \x01(\v2\x1d.gateway.AgentTelemetryConfigR\ttelemetry\x125\n" + + "\abilling\x18\x0f \x01(\v2\x1b.gateway.AgentBillingConfigR\abilling\"\xe2\x01\n" + + "\x12AgentBillingConfig\x12%\n" + + "\x0eusage_endpoint\x18\x01 \x01(\tR\rusageEndpoint\x12\x1f\n" + + "\vusage_token\x18\x02 \x01(\tR\n" + + "usageToken\x12,\n" + + "\x12cost_hook_endpoint\x18\x03 \x01(\tR\x10costHookEndpoint\x12&\n" + + "\x0fcost_hook_token\x18\x04 \x01(\tR\rcostHookToken\x12.\n" + + "\x13billable_margin_pct\x18\x05 \x01(\x01R\x11billableMarginPct\"\xc7\x01\n" + + "\x14AgentTelemetryConfig\x12\x18\n" + + "\aenabled\x18\x01 \x01(\bR\aenabled\x12#\n" + + "\rstream_prefix\x18\x02 \x01(\tR\fstreamPrefix\x125\n" + + "\x04logs\x18\x03 \x01(\v2!.gateway.AgentTelemetrySinkConfigR\x04logs\x129\n" + + "\x06events\x18\x04 \x01(\v2!.gateway.AgentTelemetrySinkConfigR\x06events\"\x81\x01\n" + + "\x18AgentTelemetrySinkConfig\x12 \n" + + "\vdestination\x18\x01 \x01(\tR\vdestination\x12\x1e\n" + + "\n" + + "credential\x18\x02 \x01(\tR\n" + + "credential\x12#\n" + + "\rstream_prefix\x18\x03 \x01(\tR\fstreamPrefix\"\x81\x05\n" + + "\x10JoinAgentRequest\x12\x1d\n" + + "\n" + + "join_token\x18\x01 \x01(\tR\tjoinToken\x12/\n" + + "\x13machine_fingerprint\x18\x02 \x01(\tR\x12machineFingerprint\x12\x1a\n" + + "\bhostname\x18\x03 \x01(\tR\bhostname\x12\x0e\n" + + "\x02os\x18\x04 \x01(\tR\x02os\x12\x12\n" + + "\x04arch\x18\x05 \x01(\tR\x04arch\x12\x1b\n" + + "\tcpu_count\x18\x06 \x01(\rR\bcpuCount\x12\x1b\n" + + "\tmemory_mb\x18\a \x01(\x04R\bmemoryMb\x12\x10\n" + + "\x03gpu\x18\b \x03(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\t \x01(\rR\bgpuCount\x12:\n" + + "\tpreflight\x18\n" + + " \x03(\v2\x1c.gateway.AgentPreflightCheckR\tpreflight\x12 \n" + + "\vschedulable\x18\v \x01(\bR\vschedulable\x12\x1a\n" + + "\bexecutor\x18\f \x01(\tR\bexecutor\x12%\n" + + "\x0ecpu_millicores\x18\r \x01(\x03R\rcpuMillicores\x12\x17\n" + + "\agpu_ids\x18\x0e \x03(\tR\x06gpuIds\x123\n" + + "\x16network_slot_pool_size\x18\x0f \x01(\rR\x13networkSlotPoolSize\x12>\n" + + "\x1bcontainer_start_concurrency\x18\x10 \x01(\rR\x19containerStartConcurrency\x12!\n" + + "\fworker_image\x18\x11 \x01(\tR\vworkerImage\x12\"\n" + + "\fcapabilities\x18\x12 \x03(\tR\fcapabilities\"\xf9\x01\n" + + "\x11JoinAgentResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12!\n" + + "\fworkspace_id\x18\x03 \x01(\tR\vworkspaceId\x12\x1b\n" + + "\tpool_name\x18\x04 \x01(\tR\bpoolName\x12\x1d\n" + + "\n" + + "machine_id\x18\x05 \x01(\tR\tmachineId\x12\x1f\n" + + "\vagent_token\x18\x06 \x01(\tR\n" + + "agentToken\x12;\n" + + "\tbootstrap\x18\a \x01(\v2\x1d.gateway.AgentBootstrapConfigR\tbootstrap\"o\n" + + "\x13AgentPreflightCheck\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x0e\n" + + "\x02ok\x18\x02 \x01(\bR\x02ok\x12\x18\n" + + "\amessage\x18\x03 \x01(\tR\amessage\x12\x1a\n" + + "\bseverity\x18\x04 \x01(\tR\bseverity\"\xb9\x03\n" + + "\n" + + "AgentRoute\x12\x19\n" + + "\broute_id\x18\x01 \x01(\tR\arouteId\x12!\n" + + "\fworkspace_id\x18\x02 \x01(\tR\vworkspaceId\x12\x1b\n" + + "\tpool_name\x18\x03 \x01(\tR\bpoolName\x12\x1d\n" + + "\n" + + "machine_id\x18\x04 \x01(\tR\tmachineId\x12\x1b\n" + + "\tworker_id\x18\x05 \x01(\tR\bworkerId\x12!\n" + + "\fcontainer_id\x18\x06 \x01(\tR\vcontainerId\x12\x12\n" + + "\x04kind\x18\a \x01(\tR\x04kind\x12\x12\n" + + "\x04port\x18\b \x01(\x05R\x04port\x12\x1a\n" + + "\bprotocol\x18\t \x01(\tR\bprotocol\x12\x1c\n" + + "\ttransport\x18\n" + + " \x01(\tR\ttransport\x12!\n" + + "\flocal_target\x18\v \x01(\tR\vlocalTarget\x12!\n" + + "\fproxy_target\x18\f \x01(\tR\vproxyTarget\x12\x14\n" + + "\x05state\x18\r \x01(\tR\x05state\x12\x14\n" + + "\x05error\x18\x0e \x01(\tR\x05error\x12\x1d\n" + + "\n" + + "updated_at\x18\x0f \x01(\x03R\tupdatedAt\"g\n" + + "&RequestAgentTransportCredentialRequest\x12\x1f\n" + + "\vagent_token\x18\x01 \x01(\tR\n" + + "agentToken\x12\x1c\n" + + "\ttransport\x18\x02 \x01(\tR\ttransport\"\xc8\x01\n" + + "'RequestAgentTransportCredentialResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12\x19\n" + + "\bauth_key\x18\x03 \x01(\tR\aauthKey\x12\x1f\n" + + "\vcontrol_url\x18\x04 \x01(\tR\n" + + "controlUrl\x12\x1a\n" + + "\bhostname\x18\x05 \x01(\tR\bhostname\x12\x1c\n" + + "\tephemeral\x18\x06 \x01(\bR\tephemeral\">\n" + + "\x1bCreateNodeEnrollmentRequest\x12\x1f\n" + + "\vagent_token\x18\x01 \x01(\tR\n" + + "agentToken\"v\n" + + "\x1cCreateNodeEnrollmentResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x1b\n" + + "\terror_msg\x18\x02 \x01(\tR\berrorMsg\x12)\n" + + "\x10enrollment_token\x18\x03 \x01(\tR\x0fenrollmentToken\">\n" + + "\x1bDeleteNodeEnrollmentRequest\x12\x1f\n" + + "\vagent_token\x18\x01 \x01(\tR\n" + + "agentToken\"K\n" + + "\x1cDeleteNodeEnrollmentResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x1b\n" + + "\terror_msg\x18\x02 \x01(\tR\berrorMsg\"9\n" + + "\x16ListAgentRoutesRequest\x12\x1f\n" + + "\vagent_token\x18\x01 \x01(\tR\n" + + "agentToken\"o\n" + + "\x17ListAgentRoutesResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12+\n" + + "\x06routes\x18\x03 \x03(\v2\x13.gateway.AgentRouteR\x06routes\"\xad\x02\n" + + "\x1dUpdateAgentRouteStatusRequest\x12\x1f\n" + + "\vagent_token\x18\x01 \x01(\tR\n" + + "agentToken\x12\x19\n" + + "\broute_id\x18\x02 \x01(\tR\arouteId\x12\x14\n" + + "\x05state\x18\x03 \x01(\tR\x05state\x12!\n" + + "\fproxy_target\x18\x04 \x01(\tR\vproxyTarget\x12\x14\n" + + "\x05error\x18\x05 \x01(\tR\x05error\x12G\n" + + "\x05attrs\x18\x06 \x03(\v21.gateway.UpdateAgentRouteStatusRequest.AttrsEntryR\x05attrs\x1a8\n" + + "\n" + + "AttrsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"I\n" + + "\x1eUpdateAgentRouteStatusResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"\x96\b\n" + + "\x0fAgentWorkerSlot\x12\x1b\n" + + "\tworker_id\x18\x01 \x01(\tR\bworkerId\x12!\n" + + "\fworker_token\x18\x02 \x01(\tR\vworkerToken\x12\x1b\n" + + "\tpool_name\x18\x03 \x01(\tR\bpoolName\x12\x1d\n" + + "\n" + + "machine_id\x18\x04 \x01(\tR\tmachineId\x12\x10\n" + + "\x03cpu\x18\x05 \x01(\x03R\x03cpu\x12\x16\n" + + "\x06memory\x18\x06 \x01(\x03R\x06memory\x12\x10\n" + + "\x03gpu\x18\a \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\b \x01(\rR\bgpuCount\x12%\n" + + "\x0egpu_assignment\x18\t \x01(\tR\rgpuAssignment\x12%\n" + + "\x0enetwork_prefix\x18\n" + + " \x01(\tR\rnetworkPrefix\x12!\n" + + "\fworker_image\x18\v \x01(\tR\vworkerImage\x123\n" + + "\x16network_slot_pool_size\x18\f \x01(\rR\x13networkSlotPoolSize\x12>\n" + + "\x1bcontainer_start_concurrency\x18\r \x01(\rR\x19containerStartConcurrency\x12\x12\n" + + "\x04mode\x18\x0e \x01(\tR\x04mode\x12+\n" + + "\x11container_runtime\x18\x0f \x01(\tR\x10containerRuntime\x124\n" + + "\x16marketplace_listing_id\x18\x10 \x01(\tR\x14marketplaceListingId\x12.\n" + + "\x13seller_workspace_id\x18\x11 \x01(\tR\x11sellerWorkspaceId\x124\n" + + "\x16requires_pool_selector\x18\x12 \x01(\bR\x14requiresPoolSelector\x12\x1a\n" + + "\bpriority\x18\x13 \x01(\x05R\bpriority\x12 \n" + + "\vpreemptable\x18\x14 \x01(\bR\vpreemptable\x12!\n" + + "\fpriority_set\x18\x15 \x01(\bR\vprioritySet\x12'\n" + + "\x0fgvisor_platform\x18\x16 \x01(\tR\x0egvisorPlatform\x12\x1f\n" + + "\vgvisor_root\x18\x17 \x01(\tR\n" + + "gvisorRoot\x12*\n" + + "\x11gvisor_extra_args\x18\x18 \x03(\tR\x0fgvisorExtraArgs\x12\x1e\n" + + "\n" + + "generation\x18\x19 \x01(\tR\n" + + "generation\x122\n" + + "\x15cpu_affinity_enforced\x18\x1a \x01(\bR\x13cpuAffinityEnforced\x12@\n" + + "\vpool_config\x18\x1b \x01(\v2\x1f.gateway.AgentPoolRuntimeConfigR\n" + + "poolConfig\"5\n" + + "\x12StreamAgentRequest\x12\x1f\n" + + "\vagent_token\x18\x01 \x01(\tR\n" + + "agentToken\"\xc6\x01\n" + + "\x13StreamAgentResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12+\n" + + "\x06routes\x18\x03 \x03(\v2\x13.gateway.AgentRouteR\x06routes\x12.\n" + + "\x05slots\x18\x04 \x03(\v2\x18.gateway.AgentWorkerSlotR\x05slots\x12)\n" + + "\x03ssh\x18\x05 \x01(\v2\x17.gateway.AgentSSHConfigR\x03ssh\"\xb7\x01\n" + + "\x0eAgentLogRecord\x12\x16\n" + + "\x06source\x18\x01 \x01(\tR\x06source\x12\x1b\n" + + "\tworker_id\x18\x02 \x01(\tR\bworkerId\x12\x14\n" + + "\x05level\x18\x03 \x01(\tR\x05level\x12\x16\n" + + "\x06stream\x18\x04 \x01(\tR\x06stream\x12\x12\n" + + "\x04line\x18\x05 \x01(\tR\x04line\x12.\n" + + "\x13timestamp_unix_nano\x18\x06 \x01(\x03R\x11timestampUnixNano\"\xb4\x04\n" + + "\x13AgentMetricSnapshot\x12.\n" + + "\x13timestamp_unix_nano\x18\x01 \x01(\x03R\x11timestampUnixNano\x12.\n" + + "\x13cpu_utilization_pct\x18\x02 \x01(\x02R\x11cpuUtilizationPct\x12$\n" + + "\x0ememory_used_mb\x18\x03 \x01(\x04R\fmemoryUsedMb\x12&\n" + + "\x0fmemory_total_mb\x18\x04 \x01(\x04R\rmemoryTotalMb\x124\n" + + "\x16memory_utilization_pct\x18\x05 \x01(\x02R\x14memoryUtilizationPct\x12 \n" + + "\fdisk_used_mb\x18\x06 \x01(\x04R\n" + + "diskUsedMb\x12\"\n" + + "\rdisk_total_mb\x18\a \x01(\x04R\vdiskTotalMb\x12$\n" + + "\x0edisk_usage_pct\x18\b \x01(\x02R\fdiskUsagePct\x12\x1b\n" + + "\tdisk_path\x18\t \x01(\tR\bdiskPath\x12!\n" + + "\fworker_count\x18\n" + + " \x01(\rR\vworkerCount\x12'\n" + + "\x0fcontainer_count\x18\v \x01(\rR\x0econtainerCount\x12$\n" + + "\x0efree_gpu_count\x18\f \x01(\rR\ffreeGpuCount\x12>\n" + + "\fpath_metrics\x18\r \x03(\v2\x1b.gateway.MachinePathMetricsR\vpathMetrics\"\xa1\x02\n" + + "\x10AgentEventRecord\x12\x16\n" + + "\x06action\x18\x01 \x01(\tR\x06action\x12\x16\n" + + "\x06status\x18\x02 \x01(\tR\x06status\x12\x18\n" + + "\amessage\x18\x03 \x01(\tR\amessage\x12:\n" + + "\x05attrs\x18\x04 \x03(\v2$.gateway.AgentEventRecord.AttrsEntryR\x05attrs\x12.\n" + + "\x13timestamp_unix_nano\x18\x05 \x01(\x03R\x11timestampUnixNano\x12\x1d\n" + + "\n" + + "event_type\x18\x06 \x01(\tR\teventType\x1a8\n" + + "\n" + + "AttrsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xd0\x01\n" + + "\x15AgentTelemetryRequest\x12\x1f\n" + + "\vagent_token\x18\x01 \x01(\tR\n" + + "agentToken\x12+\n" + + "\x04logs\x18\x02 \x03(\v2\x17.gateway.AgentLogRecordR\x04logs\x126\n" + + "\ametrics\x18\x03 \x01(\v2\x1c.gateway.AgentMetricSnapshotR\ametrics\x121\n" + + "\x06events\x18\x04 \x03(\v2\x19.gateway.AgentEventRecordR\x06events\"A\n" + + "\x16AgentTelemetryResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"\xb9\x04\n" + + "\aMachine\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x10\n" + + "\x03cpu\x18\x02 \x01(\x03R\x03cpu\x12\x16\n" + + "\x06memory\x18\x03 \x01(\x03R\x06memory\x12\x10\n" + + "\x03gpu\x18\x04 \x01(\tR\x03gpu\x12\x1b\n" + + "\tgpu_count\x18\x05 \x01(\rR\bgpuCount\x12\x16\n" + + "\x06status\x18\x06 \x01(\tR\x06status\x12\x1b\n" + + "\tpool_name\x18\a \x01(\tR\bpoolName\x12#\n" + + "\rprovider_name\x18\b \x01(\tR\fproviderName\x12-\n" + + "\x12registration_token\x18\t \x01(\tR\x11registrationToken\x12#\n" + + "\rtailscale_url\x18\n" + + " \x01(\tR\ftailscaleUrl\x12%\n" + + "\x0etailscale_auth\x18\v \x01(\tR\rtailscaleAuth\x12%\n" + + "\x0elast_keepalive\x18\f \x01(\tR\rlastKeepalive\x12\x18\n" + + "\acreated\x18\r \x01(\tR\acreated\x12#\n" + + "\ragent_version\x18\x0e \x01(\tR\fagentVersion\x12@\n" + + "\x0fmachine_metrics\x18\x0f \x01(\v2\x17.gateway.MachineMetricsR\x0emachineMetrics\x12\x1b\n" + + "\tuser_data\x18\x10 \x01(\tR\buserData\x12+\n" + + "\x03ssh\x18\x11 \x01(\v2\x19.gateway.MachineSSHAccessR\x03ssh\"\xed\x05\n" + + "\x0eMachineMetrics\x12.\n" + + "\x13total_cpu_available\x18\x01 \x01(\x05R\x11totalCpuAvailable\x124\n" + + "\x16total_memory_available\x18\x02 \x01(\x05R\x14totalMemoryAvailable\x12.\n" + + "\x13cpu_utilization_pct\x18\x03 \x01(\x02R\x11cpuUtilizationPct\x124\n" + + "\x16memory_utilization_pct\x18\x04 \x01(\x02R\x14memoryUtilizationPct\x12!\n" + + "\fworker_count\x18\x05 \x01(\x05R\vworkerCount\x12'\n" + + "\x0fcontainer_count\x18\x06 \x01(\x05R\x0econtainerCount\x12$\n" + + "\x0efree_gpu_count\x18\a \x01(\x05R\ffreeGpuCount\x12&\n" + + "\x0fcache_usage_pct\x18\b \x01(\x02R\rcacheUsagePct\x12%\n" + + "\x0ecache_capacity\x18\t \x01(\x05R\rcacheCapacity\x12,\n" + + "\x12cache_memory_usage\x18\n" + + " \x01(\x05R\x10cacheMemoryUsage\x12&\n" + + "\x0fcache_cpu_usage\x18\v \x01(\x02R\rcacheCpuUsage\x12$\n" + + "\x0ememory_used_mb\x18\f \x01(\x03R\fmemoryUsedMb\x12&\n" + + "\x0fmemory_total_mb\x18\r \x01(\x03R\rmemoryTotalMb\x12 \n" + + "\fdisk_used_mb\x18\x0e \x01(\x03R\n" + + "diskUsedMb\x12\"\n" + + "\rdisk_total_mb\x18\x0f \x01(\x03R\vdiskTotalMb\x12$\n" + + "\x0edisk_usage_pct\x18\x10 \x01(\x02R\fdiskUsagePct\x12>\n" + + "\fpath_metrics\x18\x11 \x03(\v2\x1b.gateway.MachinePathMetricsR\vpathMetrics\"\xb2\x01\n" + + "\x12MachinePathMetrics\x12\x14\n" + + "\x05label\x18\x01 \x01(\tR\x05label\x12\x12\n" + + "\x04path\x18\x02 \x01(\tR\x04path\x12\x17\n" + + "\aused_mb\x18\x03 \x01(\x04R\x06usedMb\x12\x19\n" + + "\btotal_mb\x18\x04 \x01(\x04R\atotalMb\x12!\n" + + "\favailable_mb\x18\x05 \x01(\x04R\vavailableMb\x12\x1b\n" + + "\tusage_pct\x18\x06 \x01(\x02R\busagePct\"H\n" + + "\x13ListMachinesRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\x12\x14\n" + + "\x05limit\x18\x02 \x01(\rR\x05limit\"\xfe\x02\n" + + "\x14ListMachinesResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12,\n" + + "\bmachines\x18\x03 \x03(\v2\x10.gateway.MachineR\bmachines\x12;\n" + + "\x04gpus\x18\x04 \x03(\v2'.gateway.ListMachinesResponse.GpusEntryR\x04gpus\x12W\n" + + "\x0esupported_gpus\x18\x05 \x03(\v20.gateway.ListMachinesResponse.SupportedGpusEntryR\rsupportedGpus\x1a7\n" + + "\tGpusEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\bR\x05value:\x028\x01\x1a@\n" + + "\x12SupportedGpusEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\bR\x05value:\x028\x01\"3\n" + + "\x14CreateMachineRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\"\xa9\x02\n" + + "\x15CreateMachineResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12*\n" + + "\amachine\x18\x03 \x01(\v2\x10.gateway.MachineR\amachine\x12,\n" + + "\x12agent_upstream_url\x18\x04 \x01(\tR\x10agentUpstreamUrl\x122\n" + + "\x15agent_upstream_branch\x18\x05 \x01(\tR\x13agentUpstreamBranch\x120\n" + + "\x14agent_upstream_token\x18\x06 \x01(\tR\x12agentUpstreamToken\x12'\n" + + "\x0finstall_command\x18\a \x01(\tR\x0einstallCommand\"R\n" + + "\x14DeleteMachineRequest\x12\x1d\n" + + "\n" + + "machine_id\x18\x01 \x01(\tR\tmachineId\x12\x1b\n" + + "\tpool_name\x18\x02 \x01(\tR\bpoolName\"@\n" + + "\x15DeleteMachineResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"\xb6\x02\n" + + "\x05Token\x12\x19\n" + + "\btoken_id\x18\x01 \x01(\tR\atokenId\x12\x10\n" + + "\x03key\x18\x02 \x01(\tR\x03key\x12\x16\n" + + "\x06active\x18\x03 \x01(\bR\x06active\x12\x1a\n" + + "\breusable\x18\x04 \x01(\bR\breusable\x12&\n" + + "\fworkspace_id\x18\x05 \x01(\rH\x00R\vworkspaceId\x88\x01\x01\x12\x1d\n" + + "\n" + + "token_type\x18\x06 \x01(\tR\ttokenType\x129\n" + + "\n" + + "created_at\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x129\n" + + "\n" + + "updated_at\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\tupdatedAtB\x0f\n" + + "\r_workspace_id\"\x13\n" + + "\x11ListTokensRequest\"e\n" + + "\x12ListTokensResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12&\n" + + "\x06tokens\x18\x03 \x03(\v2\x0e.gateway.TokenR\x06tokens\"3\n" + + "\x12CreateTokenRequest\x12\x1d\n" + + "\n" + + "token_type\x18\x01 \x01(\tR\ttokenType\"d\n" + + "\x13CreateTokenResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12$\n" + + "\x05token\x18\x03 \x01(\v2\x0e.gateway.TokenR\x05token\"/\n" + + "\x12ToggleTokenRequest\x12\x19\n" + + "\btoken_id\x18\x01 \x01(\tR\atokenId\"d\n" + + "\x13ToggleTokenResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12$\n" + + "\x05token\x18\x03 \x01(\v2\x0e.gateway.TokenR\x05token\"/\n" + + "\x12DeleteTokenRequest\x12\x19\n" + + "\btoken_id\x18\x01 \x01(\tR\atokenId\">\n" + + "\x13DeleteTokenResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"\x83\x01\n" + + "\rGetURLRequest\x12\x17\n" + + "\astub_id\x18\x01 \x01(\tR\x06stubId\x12#\n" + + "\rdeployment_id\x18\x02 \x01(\tR\fdeploymentId\x12\x19\n" + + "\burl_type\x18\x03 \x01(\tR\aurlType\x12\x19\n" + + "\bis_shell\x18\x04 \x01(\bR\aisShell\"K\n" + + "\x0eGetURLResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12\x10\n" + + "\x03url\x18\x03 \x01(\tR\x03url\"\x14\n" + + "\x12ListWorkersRequest\"g\n" + + "\x13ListWorkersResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12'\n" + + "\aworkers\x18\x03 \x03(\v2\r.types.WorkerR\aworkers\"2\n" + + "\x13CordonWorkerRequest\x12\x1b\n" + + "\tworker_id\x18\x01 \x01(\tR\bworkerId\"?\n" + + "\x14CordonWorkerResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"4\n" + + "\x15UncordonWorkerRequest\x12\x1b\n" + + "\tworker_id\x18\x01 \x01(\tR\bworkerId\"A\n" + + "\x16UncordonWorkerResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"1\n" + + "\x12DrainWorkerRequest\x12\x1b\n" + + "\tworker_id\x18\x01 \x01(\tR\bworkerId\">\n" + + "\x13DrainWorkerResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"\x1e\n" + + "\x1cExportWorkspaceConfigRequest\"\xc6\x02\n" + + "\x1dExportWorkspaceConfigResponse\x12*\n" + + "\x11gateway_http_host\x18\x01 \x01(\tR\x0fgatewayHttpHost\x12*\n" + + "\x11gateway_http_port\x18\x02 \x01(\x05R\x0fgatewayHttpPort\x12(\n" + + "\x10gateway_http_tls\x18\x03 \x01(\bR\x0egatewayHttpTls\x12*\n" + + "\x11gateway_grpc_host\x18\x04 \x01(\tR\x0fgatewayGrpcHost\x12*\n" + + "\x11gateway_grpc_port\x18\x05 \x01(\x05R\x0fgatewayGrpcPort\x12(\n" + + "\x10gateway_grpc_tls\x18\x06 \x01(\bR\x0egatewayGrpcTls\x12!\n" + + "\fworkspace_id\x18\a \x01(\tR\vworkspaceId\"\xae\x01\n" + + "\x1eUpdateAgentAvailabilityRequest\x12\x1f\n" + + "\vagent_token\x18\x01 \x01(\tR\n" + + "agentToken\x12 \n" + + "\vschedulable\x18\x02 \x01(\bR\vschedulable\x12\x16\n" + + "\x06reason\x18\x03 \x01(\tR\x06reason\x121\n" + + "\x15observed_at_unix_nano\x18\x04 \x01(\x03R\x12observedAtUnixNano\"J\n" + + "\x1fUpdateAgentAvailabilityResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"Z\n" + + "\x1cDownloadMachineSSHKeyRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\x12\x1d\n" + + "\n" + + "machine_id\x18\x02 \x01(\tR\tmachineId\"\xf8\x01\n" + + "\x1dDownloadMachineSSHKeyResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12\x1f\n" + + "\vprivate_key\x18\x03 \x01(\tR\n" + + "privateKey\x12\x1a\n" + + "\bfilename\x18\x04 \x01(\tR\bfilename\x12\x1e\n" + + "\n" + + "generation\x18\x05 \x01(\x04R\n" + + "generation\x12 \n" + + "\vfingerprint\x18\x06 \x01(\tR\vfingerprint\x12/\n" + + "\x13activation_required\x18\a \x01(\bR\x12activationRequired\"X\n" + + "\x1aRotateMachineSSHKeyRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\x12\x1d\n" + + "\n" + + "machine_id\x18\x02 \x01(\tR\tmachineId\"s\n" + + "\x1bRotateMachineSSHKeyResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12+\n" + + "\x03ssh\x18\x03 \x01(\v2\x19.gateway.MachineSSHAccessR\x03ssh\"z\n" + + "\x1cActivateMachineSSHKeyRequest\x12\x1b\n" + + "\tpool_name\x18\x01 \x01(\tR\bpoolName\x12\x1d\n" + + "\n" + + "machine_id\x18\x02 \x01(\tR\tmachineId\x12\x1e\n" + + "\n" + + "generation\x18\x03 \x01(\x04R\n" + + "generation\"u\n" + + "\x1dActivateMachineSSHKeyResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12+\n" + + "\x03ssh\x18\x03 \x01(\v2\x19.gateway.MachineSSHAccessR\x03ssh\"\xae\x01\n" + + "\x0eAgentSSHConfig\x12\x18\n" + + "\aenabled\x18\x01 \x01(\bR\aenabled\x12\x1a\n" + + "\busername\x18\x02 \x01(\tR\busername\x12\x1d\n" + + "\n" + + "public_key\x18\x03 \x01(\tR\tpublicKey\x12'\n" + + "\x0fkey_fingerprint\x18\x04 \x01(\tR\x0ekeyFingerprint\x12\x1e\n" + + "\n" + + "generation\x18\x05 \x01(\x04R\n" + + "generation\"\xfc\x01\n" + + "\x1bUpdateAgentSSHStatusRequest\x12\x1f\n" + + "\vagent_token\x18\x01 \x01(\tR\n" + + "agentToken\x12\x1e\n" + + "\n" + + "generation\x18\x02 \x01(\x04R\n" + + "generation\x12\x16\n" + + "\x06status\x18\x03 \x01(\tR\x06status\x12\x1b\n" + + "\tpublic_ip\x18\x04 \x01(\tR\bpublicIp\x120\n" + + "\x14host_key_fingerprint\x18\x05 \x01(\tR\x12hostKeyFingerprint\x12\x14\n" + + "\x05error\x18\x06 \x01(\tR\x05error\x12\x1f\n" + + "\vlisten_port\x18\a \x01(\rR\n" + + "listenPort\"G\n" + + "\x1cUpdateAgentSSHStatusResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\"\xda\x05\n" + + "\x10MachineSSHAccess\x12\x1c\n" + + "\tsupported\x18\x01 \x01(\bR\tsupported\x12\x16\n" + + "\x06status\x18\x02 \x01(\tR\x06status\x12\x1b\n" + + "\tpublic_ip\x18\x03 \x01(\tR\bpublicIp\x12\x12\n" + + "\x04host\x18\x04 \x01(\tR\x04host\x12\x12\n" + + "\x04port\x18\x05 \x01(\rR\x04port\x12\x1a\n" + + "\busername\x18\x06 \x01(\tR\busername\x12+\n" + + "\x11active_generation\x18\a \x01(\x04R\x10activeGeneration\x12-\n" + + "\x12applied_generation\x18\b \x01(\x04R\x11appliedGeneration\x12'\n" + + "\x0fkey_fingerprint\x18\t \x01(\tR\x0ekeyFingerprint\x120\n" + + "\x14host_key_fingerprint\x18\n" + + " \x01(\tR\x12hostKeyFingerprint\x122\n" + + "\x15private_key_available\x18\v \x01(\bR\x13privateKeyAvailable\x12)\n" + + "\x10pending_rotation\x18\f \x01(\bR\x0fpendingRotation\x12-\n" + + "\x12pending_generation\x18\r \x01(\x04R\x11pendingGeneration\x12/\n" + + "\x13pending_fingerprint\x18\x0e \x01(\tR\x12pendingFingerprint\x122\n" + + "\x15pending_key_available\x18\x0f \x01(\bR\x13pendingKeyAvailable\x124\n" + + "\x16pending_key_downloaded\x18\x10 \x01(\bR\x14pendingKeyDownloaded\x12\x14\n" + + "\x05error\x18\x11 \x01(\tR\x05error\x129\n" + + "\n" + + "updated_at\x18\x12 \x01(\v2\x1a.google.protobuf.TimestampR\tupdatedAt\"\xba\x01\n" + + "\x18AgentPoolCacheDiskConfig\x12\x18\n" + + "\aenabled\x18\x01 \x01(\bR\aenabled\x12\x1b\n" + + "\thost_path\x18\x02 \x01(\tR\bhostPath\x12\x1d\n" + + "\n" + + "mount_path\x18\x03 \x01(\tR\tmountPath\x12\"\n" + + "\rmax_usage_pct\x18\x04 \x01(\x01R\vmaxUsagePct\x12$\n" + + "\x0emin_free_bytes\x18\x05 \x01(\x03R\fminFreeBytes\"g\n" + + "\x14AgentPoolCacheConfig\x12\x18\n" + + "\aenabled\x18\x01 \x01(\bR\aenabled\x125\n" + + "\x04disk\x18\x02 \x01(\v2!.gateway.AgentPoolCacheDiskConfigR\x04disk\"\xac\x03\n" + + "\x16AgentPoolRuntimeConfig\x123\n" + + "\x15network_preallocation\x18\x01 \x01(\bR\x14networkPreallocation\x12!\n" + + "\fcriu_enabled\x18\x02 \x01(\bR\vcriuEnabled\x12$\n" + + "\x0etmp_size_limit\x18\x03 \x01(\tR\ftmpSizeLimit\x12!\n" + + "\fstorage_mode\x18\x04 \x01(\tR\vstorageMode\x12!\n" + + "\fstorage_path\x18\x05 \x01(\tR\vstoragePath\x12\x1f\n" + + "\vimages_path\x18\x06 \x01(\tR\n" + + "imagesPath\x12,\n" + + "\x12durable_disks_path\x18\a \x01(\tR\x10durableDisksPath\x123\n" + + "\x05cache\x18\b \x01(\v2\x1d.gateway.AgentPoolCacheConfigR\x05cache\x12!\n" + + "\fconfig_group\x18\t \x01(\tR\vconfigGroup\x12'\n" + + "\x0fgpu_virtualized\x18\n" + + " \x01(\bR\x0egpuVirtualized*C\n" + + "\x1fSyncContainerWorkspaceOperation\x12\t\n" + + "\x05WRITE\x10\x00\x12\n" + + "\n" + + "\x06DELETE\x10\x01\x12\t\n" + + "\x05MOVED\x10\x022\xe8C\n" + + "\x0eGatewayService\x12[\n" + + "\tAuthorize\x12\x19.gateway.AuthorizeRequest\x1a\x1a.gateway.AuthorizeResponse\"\x17\x82\xd3\xe4\x93\x02\x11\"\x0f/auth/authorize\x12_\n" + + "\vSignPayload\x12\x1b.gateway.SignPayloadRequest\x1a\x1c.gateway.SignPayloadResponse\"\x15\x82\xd3\xe4\x93\x02\x0f:\x01*\"\n" + + "/auth/sign\x12^\n" + + "\n" + + "HeadObject\x12\x1a.gateway.HeadObjectRequest\x1a\x1b.gateway.HeadObjectResponse\"\x17\x82\xd3\xe4\x93\x02\x11\x12\x0f/objects/{hash}\x12`\n" + + "\fCreateObject\x12\x1c.gateway.CreateObjectRequest\x1a\x1d.gateway.CreateObjectResponse\"\x13\x82\xd3\xe4\x93\x02\r:\x01*\"\b/objects\x12L\n" + + "\x0fPutObjectStream\x12\x19.gateway.PutObjectRequest\x1a\x1a.gateway.PutObjectResponse\"\x00(\x01\x12b\n" + + "\x13CheckpointContainer\x12#.gateway.CheckpointContainerRequest\x1a$.gateway.CheckpointContainerResponse\"\x00\x12f\n" + + "\x0eListContainers\x12\x1e.gateway.ListContainersRequest\x1a\x1f.gateway.ListContainersResponse\"\x13\x82\xd3\xe4\x93\x02\r\x12\v/containers\x12w\n" + + "\rStopContainer\x12\x1d.gateway.StopContainerRequest\x1a\x1e.gateway.StopContainerResponse\"'\x82\xd3\xe4\x93\x02!\"\x1f/containers/{container_id}/stop\x12^\n" + + "\x11AttachToContainer\x12\x1f.gateway.ContainerStreamMessage\x1a\".gateway.AttachToContainerResponse\"\x00(\x010\x01\x12[\n" + + "\tStartTask\x12\x19.gateway.StartTaskRequest\x1a\x1a.gateway.StartTaskResponse\"\x17\x82\xd3\xe4\x93\x02\x11:\x01*\"\f/tasks/start\x12S\n" + + "\aEndTask\x12\x17.gateway.EndTaskRequest\x1a\x18.gateway.EndTaskResponse\"\x15\x82\xd3\xe4\x93\x02\x0f:\x01*\"\n" + + "/tasks/end\x12Z\n" + + "\tStopTasks\x12\x19.gateway.StopTasksRequest\x1a\x1a.gateway.StopTasksResponse\"\x16\x82\xd3\xe4\x93\x02\x10:\x01*\"\v/tasks/stop\x12R\n" + + "\tListTasks\x12\x19.gateway.ListTasksRequest\x1a\x1a.gateway.ListTasksResponse\"\x0e\x82\xd3\xe4\x93\x02\b\x12\x06/tasks\x12g\n" + + "\x0fGetOrCreateStub\x12\x1f.gateway.GetOrCreateStubRequest\x1a .gateway.GetOrCreateStubResponse\"\x11\x82\xd3\xe4\x93\x02\v:\x01*\"\x06/stubs\x12_\n" + + "\n" + + "DeployStub\x12\x1a.gateway.DeployStubRequest\x1a\x1b.gateway.DeployStubResponse\"\x18\x82\xd3\xe4\x93\x02\x12:\x01*\"\r/stubs/deploy\x12W\n" + + "\x06GetURL\x12\x16.gateway.GetURLRequest\x1a\x17.gateway.GetURLResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\x12\x14/stubs/{stub_id}/url\x12j\n" + + "\x0fListDeployments\x12\x1f.gateway.ListDeploymentsRequest\x1a .gateway.ListDeploymentsResponse\"\x14\x82\xd3\xe4\x93\x02\x0e\x12\f/deployments\x12q\n" + + "\x0eStopDeployment\x12\x1e.gateway.StopDeploymentRequest\x1a\x1f.gateway.StopDeploymentResponse\"\x1e\x82\xd3\xe4\x93\x02\x18\"\x16/deployments/{id}/stop\x12u\n" + + "\x0fStartDeployment\x12\x1f.gateway.StartDeploymentRequest\x1a .gateway.StartDeploymentResponse\"\x1f\x82\xd3\xe4\x93\x02\x19\"\x17/deployments/{id}/start\x12x\n" + + "\x0fScaleDeployment\x12\x1f.gateway.ScaleDeploymentRequest\x1a .gateway.ScaleDeploymentResponse\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/deployments/{id}/scale\x12r\n" + + "\x10DeleteDeployment\x12 .gateway.DeleteDeploymentRequest\x1a!.gateway.DeleteDeploymentResponse\"\x19\x82\xd3\xe4\x93\x02\x13*\x11/deployments/{id}\x12R\n" + + "\tListPools\x12\x19.gateway.ListPoolsRequest\x1a\x1a.gateway.ListPoolsResponse\"\x0e\x82\xd3\xe4\x93\x02\b\x12\x06/pools\x12k\n" + + "\x0eListPoolOffers\x12\x1e.gateway.ListPoolOffersRequest\x1a\x1f.gateway.ListPoolOffersResponse\"\x18\x82\xd3\xe4\x93\x02\x12:\x01*\"\r/pools:offers\x12w\n" + + "\x12LaunchPoolCapacity\x12\".gateway.LaunchPoolCapacityRequest\x1a#.gateway.LaunchPoolCapacityResponse\"\x18\x82\xd3\xe4\x93\x02\x12:\x01*\"\r/pools:launch\x12o\n" + + "\x10ListPrivatePools\x12 .gateway.ListPrivatePoolsRequest\x1a!.gateway.ListPrivatePoolsResponse\"\x16\x82\xd3\xe4\x93\x02\x10\x12\x0e/pools/private\x12i\n" + + "\x0eCreateBYOCPool\x12\x1e.gateway.CreateBYOCPoolRequest\x1a\x1f.gateway.CreateBYOCPoolResponse\"\x16\x82\xd3\xe4\x93\x02\x10:\x01*\"\v/pools/byoc\x12i\n" + + "\vGetBYOCPool\x12\x1b.gateway.GetBYOCPoolRequest\x1a\x1c.gateway.GetBYOCPoolResponse\"\x1f\x82\xd3\xe4\x93\x02\x19\x12\x17/pools/{pool_name}/byoc\x12x\n" + + "\rScaleBYOCPool\x12\x1d.gateway.ScaleBYOCPoolRequest\x1a\x1e.gateway.ScaleBYOCPoolResponse\"(\x82\xd3\xe4\x93\x02\":\x01*\"\x1d/pools/{pool_name}/byoc/scale\x12\x91\x01\n" + + "\x18CreateMarketplaceListing\x12(.gateway.CreateMarketplaceListingRequest\x1a).gateway.CreateMarketplaceListingResponse\" \x82\xd3\xe4\x93\x02\x1a:\x01*\"\x15/marketplace/listings\x12\x9e\x01\n" + + "\x18UpdateMarketplaceListing\x12(.gateway.UpdateMarketplaceListingRequest\x1a).gateway.UpdateMarketplaceListingResponse\"-\x82\xd3\xe4\x93\x02':\x01*\"\"/marketplace/listings/{listing_id}\x12\x9b\x01\n" + + "\x18DeleteMarketplaceListing\x12(.gateway.DeleteMarketplaceListingRequest\x1a).gateway.DeleteMarketplaceListingResponse\"*\x82\xd3\xe4\x93\x02$*\"/marketplace/listings/{listing_id}\x12\x8b\x01\n" + + "\x17ListMarketplaceListings\x12'.gateway.ListMarketplaceListingsRequest\x1a(.gateway.ListMarketplaceListingsResponse\"\x1d\x82\xd3\xe4\x93\x02\x17\x12\x15/marketplace/listings\x12\xae\x01\n" + + "\x19GetMarketplaceJoinCommand\x12).gateway.GetMarketplaceJoinCommandRequest\x1a*.gateway.GetMarketplaceJoinCommandResponse\":\x82\xd3\xe4\x93\x024:\x01*\"//marketplace/listings/{listing_id}/join-command\x12\x83\x01\n" + + "\x15ListMarketplaceOffers\x12%.gateway.ListMarketplaceOffersRequest\x1a&.gateway.ListMarketplaceOffersResponse\"\x1b\x82\xd3\xe4\x93\x02\x15\x12\x13/marketplace/offers\x12\x8a\x01\n" + + "\x13GetMarketplaceOffer\x12#.gateway.GetMarketplaceOfferRequest\x1a$.gateway.GetMarketplaceOfferResponse\"(\x82\xd3\xe4\x93\x02\"\x12 /marketplace/offers/{listing_id}\x12\x8d\x01\n" + + "\x17CreateMarketplaceRental\x12'.gateway.CreateMarketplaceRentalRequest\x1a(.gateway.CreateMarketplaceRentalResponse\"\x1f\x82\xd3\xe4\x93\x02\x19:\x01*\"\x14/marketplace/rentals\x12\x87\x01\n" + + "\x16ListMarketplaceRentals\x12&.gateway.ListMarketplaceRentalsRequest\x1a'.gateway.ListMarketplaceRentalsResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\x12\x14/marketplace/rentals\x12\x96\x01\n" + + "\x17DeleteMarketplaceRental\x12'.gateway.DeleteMarketplaceRentalRequest\x1a(.gateway.DeleteMarketplaceRentalResponse\"(\x82\xd3\xe4\x93\x02\"* /marketplace/rentals/{rental_id}\x12\x97\x01\n" + + "\x14LaunchRentalWorkload\x12$.gateway.LaunchRentalWorkloadRequest\x1a%.gateway.LaunchRentalWorkloadResponse\"2\x82\xd3\xe4\x93\x02,:\x01*\"'/marketplace/rentals/{rental_id}/launch\x12\xa1\x01\n" + + "\x17ListMarketplaceMachines\x12'.gateway.ListMarketplaceMachinesRequest\x1a(.gateway.ListMarketplaceMachinesResponse\"3\x82\xd3\xe4\x93\x02-\x12+/marketplace/listings/{listing_id}/machines\x12\xa3\x01\n" + + "\x15ListMachineContainers\x12%.gateway.ListMachineContainersRequest\x1a&.gateway.ListMachineContainersResponse\";\x82\xd3\xe4\x93\x025\x123/pools/{pool_name}/machines/{machine_id}/containers\x12X\n" + + "\n" + + "CreatePool\x12\x1a.gateway.CreatePoolRequest\x1a\x1b.gateway.CreatePoolResponse\"\x11\x82\xd3\xe4\x93\x02\v:\x01*\"\x06/pools\x12\\\n" + + "\n" + + "DeletePool\x12\x1a.gateway.DeletePoolRequest\x1a\x1b.gateway.DeletePoolResponse\"\x15\x82\xd3\xe4\x93\x02\x0f*\r/pools/{name}\x12~\n" + + "\x12ExtendPoolCapacity\x12\".gateway.ExtendPoolCapacityRequest\x1a#.gateway.ExtendPoolCapacityResponse\"\x1f\x82\xd3\xe4\x93\x02\x19:\x01*\"\x14/pools/{name}/extend\x12\x8b\x01\n" + + "\x13CreatePoolJoinToken\x12#.gateway.CreatePoolJoinTokenRequest\x1a$.gateway.CreatePoolJoinTokenResponse\")\x82\xd3\xe4\x93\x02#:\x01*\"\x1e/pools/{pool_name}/join-tokens\x12\x86\x01\n" + + "\x13RevokePoolJoinToken\x12#.gateway.RevokePoolJoinTokenRequest\x1a$.gateway.RevokePoolJoinTokenResponse\"$\x82\xd3\xe4\x93\x02\x1e:\x01*\"\x19/pools/join-tokens/revoke\x12\x89\x01\n" + + "\x12GetPoolJoinCommand\x12\".gateway.GetPoolJoinCommandRequest\x1a#.gateway.GetPoolJoinCommandResponse\"*\x82\xd3\xe4\x93\x02$:\x01*\"\x1f/pools/{pool_name}/join-command\x12|\n" + + "\x10ListPoolMachines\x12 .gateway.ListPoolMachinesRequest\x1a!.gateway.ListPoolMachinesResponse\"#\x82\xd3\xe4\x93\x02\x1d\x12\x1b/pools/{pool_name}/machines\x12\xac\x01\n" + + "\x15DownloadMachineSSHKey\x12%.gateway.DownloadMachineSSHKeyRequest\x1a&.gateway.DownloadMachineSSHKeyResponse\"D\x82\xd3\xe4\x93\x02>:\x01*\"9/pools/{pool_name}/machines/{machine_id}/ssh/key:download\x12\xa4\x01\n" + + "\x13RotateMachineSSHKey\x12#.gateway.RotateMachineSSHKeyRequest\x1a$.gateway.RotateMachineSSHKeyResponse\"B\x82\xd3\xe4\x93\x02<:\x01*\"7/pools/{pool_name}/machines/{machine_id}/ssh/key:rotate\x12\xac\x01\n" + + "\x15ActivateMachineSSHKey\x12%.gateway.ActivateMachineSSHKeyRequest\x1a&.gateway.ActivateMachineSSHKeyResponse\"D\x82\xd3\xe4\x93\x02>:\x01*\"9/pools/{pool_name}/machines/{machine_id}/ssh/key:activate\x12Z\n" + + "\tJoinAgent\x12\x19.gateway.JoinAgentRequest\x1a\x1a.gateway.JoinAgentResponse\"\x16\x82\xd3\xe4\x93\x02\x10:\x01*\"\v/agent/join\x12\xac\x01\n" + + "\x1fRequestAgentTransportCredential\x12/.gateway.RequestAgentTransportCredentialRequest\x1a0.gateway.RequestAgentTransportCredentialResponse\"&\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/agent/transport-credential\x12c\n" + + "\x14CreateNodeEnrollment\x12$.gateway.CreateNodeEnrollmentRequest\x1a%.gateway.CreateNodeEnrollmentResponse\x12c\n" + + "\x14DeleteNodeEnrollment\x12$.gateway.DeleteNodeEnrollmentRequest\x1a%.gateway.DeleteNodeEnrollmentResponse\x12s\n" + + "\x0fListAgentRoutes\x12\x1f.gateway.ListAgentRoutesRequest\x1a .gateway.ListAgentRoutesResponse\"\x1d\x82\xd3\xe4\x93\x02\x17:\x01*\"\x12/agent/routes:list\x12\x8a\x01\n" + + "\x16UpdateAgentRouteStatus\x12&.gateway.UpdateAgentRouteStatusRequest\x1a'.gateway.UpdateAgentRouteStatusResponse\"\x1f\x82\xd3\xe4\x93\x02\x19:\x01*\"\x14/agent/routes/status\x12\x81\x01\n" + + "\x14UpdateAgentSSHStatus\x12$.gateway.UpdateAgentSSHStatusRequest\x1a%.gateway.UpdateAgentSSHStatusResponse\"\x1c\x82\xd3\xe4\x93\x02\x16:\x01*\"\x11/agent/ssh/status\x12\x8c\x01\n" + + "\x17UpdateAgentAvailability\x12'.gateway.UpdateAgentAvailabilityRequest\x1a(.gateway.UpdateAgentAvailabilityResponse\"\x1e\x82\xd3\xe4\x93\x02\x18:\x01*\"\x13/agent/availability\x12J\n" + + "\vStreamAgent\x12\x1b.gateway.StreamAgentRequest\x1a\x1c.gateway.StreamAgentResponse0\x01\x12Y\n" + + "\x14StreamAgentTelemetry\x12\x1e.gateway.AgentTelemetryRequest\x1a\x1f.gateway.AgentTelemetryResponse(\x01\x12^\n" + + "\fListMachines\x12\x1c.gateway.ListMachinesRequest\x1a\x1d.gateway.ListMachinesResponse\"\x11\x82\xd3\xe4\x93\x02\v\x12\t/machines\x12d\n" + + "\rCreateMachine\x12\x1d.gateway.CreateMachineRequest\x1a\x1e.gateway.CreateMachineResponse\"\x14\x82\xd3\xe4\x93\x02\x0e:\x01*\"\t/machines\x12n\n" + + "\rDeleteMachine\x12\x1d.gateway.DeleteMachineRequest\x1a\x1e.gateway.DeleteMachineResponse\"\x1e\x82\xd3\xe4\x93\x02\x18*\x16/machines/{machine_id}\x12V\n" + + "\n" + + "ListTokens\x12\x1a.gateway.ListTokensRequest\x1a\x1b.gateway.ListTokensResponse\"\x0f\x82\xd3\xe4\x93\x02\t\x12\a/tokens\x12Y\n" + + "\vCreateToken\x12\x1b.gateway.CreateTokenRequest\x1a\x1c.gateway.CreateTokenResponse\"\x0f\x82\xd3\xe4\x93\x02\t\"\a/tokens\x12k\n" + + "\vToggleToken\x12\x1b.gateway.ToggleTokenRequest\x1a\x1c.gateway.ToggleTokenResponse\"!\x82\xd3\xe4\x93\x02\x1b\"\x19/tokens/{token_id}/toggle\x12d\n" + + "\vDeleteToken\x12\x1b.gateway.DeleteTokenRequest\x1a\x1c.gateway.DeleteTokenResponse\"\x1a\x82\xd3\xe4\x93\x02\x14*\x12/tokens/{token_id}\x12Z\n" + + "\vListWorkers\x12\x1b.gateway.ListWorkersRequest\x1a\x1c.gateway.ListWorkersResponse\"\x10\x82\xd3\xe4\x93\x02\n" + + "\x12\b/workers\x12p\n" + + "\fCordonWorker\x12\x1c.gateway.CordonWorkerRequest\x1a\x1d.gateway.CordonWorkerResponse\"#\x82\xd3\xe4\x93\x02\x1d\"\x1b/workers/{worker_id}/cordon\x12x\n" + + "\x0eUncordonWorker\x12\x1e.gateway.UncordonWorkerRequest\x1a\x1f.gateway.UncordonWorkerResponse\"%\x82\xd3\xe4\x93\x02\x1f\"\x1d/workers/{worker_id}/uncordon\x12l\n" + + "\vDrainWorker\x12\x1b.gateway.DrainWorkerRequest\x1a\x1c.gateway.DrainWorkerResponse\"\"\x82\xd3\xe4\x93\x02\x1c\"\x1a/workers/{worker_id}/drain\x12\x81\x01\n" + + "\x15ExportWorkspaceConfig\x12%.gateway.ExportWorkspaceConfigRequest\x1a&.gateway.ExportWorkspaceConfigResponse\"\x19\x82\xd3\xe4\x93\x02\x13\x12\x11/workspace/configB#Z!github.com/beam-cloud/beta9/protob\x06proto3" var ( file_gateway_proto_rawDescOnce sync.Once @@ -17018,8 +15620,8 @@ func file_gateway_proto_rawDescGZIP() []byte { } var file_gateway_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_gateway_proto_msgTypes = make([]protoimpl.MessageInfo, 198) -var file_gateway_proto_goTypes = []interface{}{ +var file_gateway_proto_msgTypes = make([]protoimpl.MessageInfo, 202) +var file_gateway_proto_goTypes = []any{ (SyncContainerWorkspaceOperation)(0), // 0: gateway.SyncContainerWorkspaceOperation (*AuthorizeRequest)(nil), // 1: gateway.AuthorizeRequest (*AuthorizeResponse)(nil), // 2: gateway.AuthorizeResponse @@ -17152,132 +15754,136 @@ var file_gateway_proto_goTypes = []interface{}{ (*AgentRoute)(nil), // 129: gateway.AgentRoute (*RequestAgentTransportCredentialRequest)(nil), // 130: gateway.RequestAgentTransportCredentialRequest (*RequestAgentTransportCredentialResponse)(nil), // 131: gateway.RequestAgentTransportCredentialResponse - (*ListAgentRoutesRequest)(nil), // 132: gateway.ListAgentRoutesRequest - (*ListAgentRoutesResponse)(nil), // 133: gateway.ListAgentRoutesResponse - (*UpdateAgentRouteStatusRequest)(nil), // 134: gateway.UpdateAgentRouteStatusRequest - (*UpdateAgentRouteStatusResponse)(nil), // 135: gateway.UpdateAgentRouteStatusResponse - (*AgentWorkerSlot)(nil), // 136: gateway.AgentWorkerSlot - (*StreamAgentRequest)(nil), // 137: gateway.StreamAgentRequest - (*StreamAgentResponse)(nil), // 138: gateway.StreamAgentResponse - (*AgentLogRecord)(nil), // 139: gateway.AgentLogRecord - (*AgentMetricSnapshot)(nil), // 140: gateway.AgentMetricSnapshot - (*AgentEventRecord)(nil), // 141: gateway.AgentEventRecord - (*AgentTelemetryRequest)(nil), // 142: gateway.AgentTelemetryRequest - (*AgentTelemetryResponse)(nil), // 143: gateway.AgentTelemetryResponse - (*Machine)(nil), // 144: gateway.Machine - (*MachineMetrics)(nil), // 145: gateway.MachineMetrics - (*MachinePathMetrics)(nil), // 146: gateway.MachinePathMetrics - (*ListMachinesRequest)(nil), // 147: gateway.ListMachinesRequest - (*ListMachinesResponse)(nil), // 148: gateway.ListMachinesResponse - (*CreateMachineRequest)(nil), // 149: gateway.CreateMachineRequest - (*CreateMachineResponse)(nil), // 150: gateway.CreateMachineResponse - (*DeleteMachineRequest)(nil), // 151: gateway.DeleteMachineRequest - (*DeleteMachineResponse)(nil), // 152: gateway.DeleteMachineResponse - (*Token)(nil), // 153: gateway.Token - (*ListTokensRequest)(nil), // 154: gateway.ListTokensRequest - (*ListTokensResponse)(nil), // 155: gateway.ListTokensResponse - (*CreateTokenRequest)(nil), // 156: gateway.CreateTokenRequest - (*CreateTokenResponse)(nil), // 157: gateway.CreateTokenResponse - (*ToggleTokenRequest)(nil), // 158: gateway.ToggleTokenRequest - (*ToggleTokenResponse)(nil), // 159: gateway.ToggleTokenResponse - (*DeleteTokenRequest)(nil), // 160: gateway.DeleteTokenRequest - (*DeleteTokenResponse)(nil), // 161: gateway.DeleteTokenResponse - (*GetURLRequest)(nil), // 162: gateway.GetURLRequest - (*GetURLResponse)(nil), // 163: gateway.GetURLResponse - (*ListWorkersRequest)(nil), // 164: gateway.ListWorkersRequest - (*ListWorkersResponse)(nil), // 165: gateway.ListWorkersResponse - (*CordonWorkerRequest)(nil), // 166: gateway.CordonWorkerRequest - (*CordonWorkerResponse)(nil), // 167: gateway.CordonWorkerResponse - (*UncordonWorkerRequest)(nil), // 168: gateway.UncordonWorkerRequest - (*UncordonWorkerResponse)(nil), // 169: gateway.UncordonWorkerResponse - (*DrainWorkerRequest)(nil), // 170: gateway.DrainWorkerRequest - (*DrainWorkerResponse)(nil), // 171: gateway.DrainWorkerResponse - (*ExportWorkspaceConfigRequest)(nil), // 172: gateway.ExportWorkspaceConfigRequest - (*ExportWorkspaceConfigResponse)(nil), // 173: gateway.ExportWorkspaceConfigResponse - (*UpdateAgentAvailabilityRequest)(nil), // 174: gateway.UpdateAgentAvailabilityRequest - (*UpdateAgentAvailabilityResponse)(nil), // 175: gateway.UpdateAgentAvailabilityResponse - (*DownloadMachineSSHKeyRequest)(nil), // 176: gateway.DownloadMachineSSHKeyRequest - (*DownloadMachineSSHKeyResponse)(nil), // 177: gateway.DownloadMachineSSHKeyResponse - (*RotateMachineSSHKeyRequest)(nil), // 178: gateway.RotateMachineSSHKeyRequest - (*RotateMachineSSHKeyResponse)(nil), // 179: gateway.RotateMachineSSHKeyResponse - (*ActivateMachineSSHKeyRequest)(nil), // 180: gateway.ActivateMachineSSHKeyRequest - (*ActivateMachineSSHKeyResponse)(nil), // 181: gateway.ActivateMachineSSHKeyResponse - (*AgentSSHConfig)(nil), // 182: gateway.AgentSSHConfig - (*UpdateAgentSSHStatusRequest)(nil), // 183: gateway.UpdateAgentSSHStatusRequest - (*UpdateAgentSSHStatusResponse)(nil), // 184: gateway.UpdateAgentSSHStatusResponse - (*MachineSSHAccess)(nil), // 185: gateway.MachineSSHAccess - (*AgentPoolCacheDiskConfig)(nil), // 186: gateway.AgentPoolCacheDiskConfig - (*AgentPoolCacheConfig)(nil), // 187: gateway.AgentPoolCacheConfig - (*AgentPoolRuntimeConfig)(nil), // 188: gateway.AgentPoolRuntimeConfig - nil, // 189: gateway.CreateObjectResponse.PutHeadersEntry - nil, // 190: gateway.ListTasksRequest.FiltersEntry - nil, // 191: gateway.Schema.FieldsEntry - nil, // 192: gateway.ListDeploymentsRequest.FiltersEntry - nil, // 193: gateway.ListPoolsRequest.FiltersEntry - nil, // 194: gateway.ListPrivatePoolsRequest.FiltersEntry - nil, // 195: gateway.UpdateAgentRouteStatusRequest.AttrsEntry - nil, // 196: gateway.AgentEventRecord.AttrsEntry - nil, // 197: gateway.ListMachinesResponse.GpusEntry - nil, // 198: gateway.ListMachinesResponse.SupportedGpusEntry - (*Container)(nil), // 199: types.Container - (*timestamppb.Timestamp)(nil), // 200: google.protobuf.Timestamp - (*MountPointConfig)(nil), // 201: types.MountPointConfig - (*PricingPolicy)(nil), // 202: types.PricingPolicy - (*CheckpointTrigger)(nil), // 203: types.CheckpointTrigger - (*WorkerPoolState)(nil), // 204: types.WorkerPoolState - (*Worker)(nil), // 205: types.Worker + (*CreateNodeEnrollmentRequest)(nil), // 132: gateway.CreateNodeEnrollmentRequest + (*CreateNodeEnrollmentResponse)(nil), // 133: gateway.CreateNodeEnrollmentResponse + (*DeleteNodeEnrollmentRequest)(nil), // 134: gateway.DeleteNodeEnrollmentRequest + (*DeleteNodeEnrollmentResponse)(nil), // 135: gateway.DeleteNodeEnrollmentResponse + (*ListAgentRoutesRequest)(nil), // 136: gateway.ListAgentRoutesRequest + (*ListAgentRoutesResponse)(nil), // 137: gateway.ListAgentRoutesResponse + (*UpdateAgentRouteStatusRequest)(nil), // 138: gateway.UpdateAgentRouteStatusRequest + (*UpdateAgentRouteStatusResponse)(nil), // 139: gateway.UpdateAgentRouteStatusResponse + (*AgentWorkerSlot)(nil), // 140: gateway.AgentWorkerSlot + (*StreamAgentRequest)(nil), // 141: gateway.StreamAgentRequest + (*StreamAgentResponse)(nil), // 142: gateway.StreamAgentResponse + (*AgentLogRecord)(nil), // 143: gateway.AgentLogRecord + (*AgentMetricSnapshot)(nil), // 144: gateway.AgentMetricSnapshot + (*AgentEventRecord)(nil), // 145: gateway.AgentEventRecord + (*AgentTelemetryRequest)(nil), // 146: gateway.AgentTelemetryRequest + (*AgentTelemetryResponse)(nil), // 147: gateway.AgentTelemetryResponse + (*Machine)(nil), // 148: gateway.Machine + (*MachineMetrics)(nil), // 149: gateway.MachineMetrics + (*MachinePathMetrics)(nil), // 150: gateway.MachinePathMetrics + (*ListMachinesRequest)(nil), // 151: gateway.ListMachinesRequest + (*ListMachinesResponse)(nil), // 152: gateway.ListMachinesResponse + (*CreateMachineRequest)(nil), // 153: gateway.CreateMachineRequest + (*CreateMachineResponse)(nil), // 154: gateway.CreateMachineResponse + (*DeleteMachineRequest)(nil), // 155: gateway.DeleteMachineRequest + (*DeleteMachineResponse)(nil), // 156: gateway.DeleteMachineResponse + (*Token)(nil), // 157: gateway.Token + (*ListTokensRequest)(nil), // 158: gateway.ListTokensRequest + (*ListTokensResponse)(nil), // 159: gateway.ListTokensResponse + (*CreateTokenRequest)(nil), // 160: gateway.CreateTokenRequest + (*CreateTokenResponse)(nil), // 161: gateway.CreateTokenResponse + (*ToggleTokenRequest)(nil), // 162: gateway.ToggleTokenRequest + (*ToggleTokenResponse)(nil), // 163: gateway.ToggleTokenResponse + (*DeleteTokenRequest)(nil), // 164: gateway.DeleteTokenRequest + (*DeleteTokenResponse)(nil), // 165: gateway.DeleteTokenResponse + (*GetURLRequest)(nil), // 166: gateway.GetURLRequest + (*GetURLResponse)(nil), // 167: gateway.GetURLResponse + (*ListWorkersRequest)(nil), // 168: gateway.ListWorkersRequest + (*ListWorkersResponse)(nil), // 169: gateway.ListWorkersResponse + (*CordonWorkerRequest)(nil), // 170: gateway.CordonWorkerRequest + (*CordonWorkerResponse)(nil), // 171: gateway.CordonWorkerResponse + (*UncordonWorkerRequest)(nil), // 172: gateway.UncordonWorkerRequest + (*UncordonWorkerResponse)(nil), // 173: gateway.UncordonWorkerResponse + (*DrainWorkerRequest)(nil), // 174: gateway.DrainWorkerRequest + (*DrainWorkerResponse)(nil), // 175: gateway.DrainWorkerResponse + (*ExportWorkspaceConfigRequest)(nil), // 176: gateway.ExportWorkspaceConfigRequest + (*ExportWorkspaceConfigResponse)(nil), // 177: gateway.ExportWorkspaceConfigResponse + (*UpdateAgentAvailabilityRequest)(nil), // 178: gateway.UpdateAgentAvailabilityRequest + (*UpdateAgentAvailabilityResponse)(nil), // 179: gateway.UpdateAgentAvailabilityResponse + (*DownloadMachineSSHKeyRequest)(nil), // 180: gateway.DownloadMachineSSHKeyRequest + (*DownloadMachineSSHKeyResponse)(nil), // 181: gateway.DownloadMachineSSHKeyResponse + (*RotateMachineSSHKeyRequest)(nil), // 182: gateway.RotateMachineSSHKeyRequest + (*RotateMachineSSHKeyResponse)(nil), // 183: gateway.RotateMachineSSHKeyResponse + (*ActivateMachineSSHKeyRequest)(nil), // 184: gateway.ActivateMachineSSHKeyRequest + (*ActivateMachineSSHKeyResponse)(nil), // 185: gateway.ActivateMachineSSHKeyResponse + (*AgentSSHConfig)(nil), // 186: gateway.AgentSSHConfig + (*UpdateAgentSSHStatusRequest)(nil), // 187: gateway.UpdateAgentSSHStatusRequest + (*UpdateAgentSSHStatusResponse)(nil), // 188: gateway.UpdateAgentSSHStatusResponse + (*MachineSSHAccess)(nil), // 189: gateway.MachineSSHAccess + (*AgentPoolCacheDiskConfig)(nil), // 190: gateway.AgentPoolCacheDiskConfig + (*AgentPoolCacheConfig)(nil), // 191: gateway.AgentPoolCacheConfig + (*AgentPoolRuntimeConfig)(nil), // 192: gateway.AgentPoolRuntimeConfig + nil, // 193: gateway.CreateObjectResponse.PutHeadersEntry + nil, // 194: gateway.ListTasksRequest.FiltersEntry + nil, // 195: gateway.Schema.FieldsEntry + nil, // 196: gateway.ListDeploymentsRequest.FiltersEntry + nil, // 197: gateway.ListPoolsRequest.FiltersEntry + nil, // 198: gateway.ListPrivatePoolsRequest.FiltersEntry + nil, // 199: gateway.UpdateAgentRouteStatusRequest.AttrsEntry + nil, // 200: gateway.AgentEventRecord.AttrsEntry + nil, // 201: gateway.ListMachinesResponse.GpusEntry + nil, // 202: gateway.ListMachinesResponse.SupportedGpusEntry + (*Container)(nil), // 203: types.Container + (*timestamppb.Timestamp)(nil), // 204: google.protobuf.Timestamp + (*MountPointConfig)(nil), // 205: types.MountPointConfig + (*PricingPolicy)(nil), // 206: types.PricingPolicy + (*CheckpointTrigger)(nil), // 207: types.CheckpointTrigger + (*WorkerPoolState)(nil), // 208: types.WorkerPoolState + (*Worker)(nil), // 209: types.Worker } var file_gateway_proto_depIdxs = []int32{ 5, // 0: gateway.HeadObjectResponse.object_metadata:type_name -> gateway.ObjectMetadata 5, // 1: gateway.CreateObjectRequest.object_metadata:type_name -> gateway.ObjectMetadata - 189, // 2: gateway.CreateObjectResponse.put_headers:type_name -> gateway.CreateObjectResponse.PutHeadersEntry + 193, // 2: gateway.CreateObjectResponse.put_headers:type_name -> gateway.CreateObjectResponse.PutHeadersEntry 5, // 3: gateway.PutObjectRequest.object_metadata:type_name -> gateway.ObjectMetadata 0, // 4: gateway.SyncContainerWorkspaceRequest.op:type_name -> gateway.SyncContainerWorkspaceOperation - 199, // 5: gateway.ListContainersResponse.containers:type_name -> types.Container + 203, // 5: gateway.ListContainersResponse.containers:type_name -> types.Container 21, // 6: gateway.ContainerStreamMessage.attach_request:type_name -> gateway.AttachToContainerRequest 12, // 7: gateway.ContainerStreamMessage.sync_container_workspace:type_name -> gateway.SyncContainerWorkspaceRequest - 190, // 8: gateway.ListTasksRequest.filters:type_name -> gateway.ListTasksRequest.FiltersEntry - 200, // 9: gateway.Task.started_at:type_name -> google.protobuf.Timestamp - 200, // 10: gateway.Task.ended_at:type_name -> google.protobuf.Timestamp - 200, // 11: gateway.Task.created_at:type_name -> google.protobuf.Timestamp - 200, // 12: gateway.Task.updated_at:type_name -> google.protobuf.Timestamp + 194, // 8: gateway.ListTasksRequest.filters:type_name -> gateway.ListTasksRequest.FiltersEntry + 204, // 9: gateway.Task.started_at:type_name -> google.protobuf.Timestamp + 204, // 10: gateway.Task.ended_at:type_name -> google.protobuf.Timestamp + 204, // 11: gateway.Task.created_at:type_name -> google.protobuf.Timestamp + 204, // 12: gateway.Task.updated_at:type_name -> google.protobuf.Timestamp 29, // 13: gateway.ListTasksResponse.tasks:type_name -> gateway.Task - 201, // 14: gateway.Volume.config:type_name -> types.MountPointConfig + 205, // 14: gateway.Volume.config:type_name -> types.MountPointConfig 36, // 15: gateway.ServingConfig.llm:type_name -> gateway.LLMConfig 37, // 16: gateway.ServingConfig.database:type_name -> gateway.DatabaseServingConfig - 191, // 17: gateway.Schema.fields:type_name -> gateway.Schema.FieldsEntry + 195, // 17: gateway.Schema.fields:type_name -> gateway.Schema.FieldsEntry 41, // 18: gateway.SchemaField.fields:type_name -> gateway.Schema 33, // 19: gateway.GetOrCreateStubRequest.volumes:type_name -> gateway.Volume 34, // 20: gateway.GetOrCreateStubRequest.secrets:type_name -> gateway.SecretVar 35, // 21: gateway.GetOrCreateStubRequest.autoscaler:type_name -> gateway.Autoscaler 40, // 22: gateway.GetOrCreateStubRequest.task_policy:type_name -> gateway.TaskPolicy - 202, // 23: gateway.GetOrCreateStubRequest.pricing:type_name -> types.PricingPolicy + 206, // 23: gateway.GetOrCreateStubRequest.pricing:type_name -> types.PricingPolicy 41, // 24: gateway.GetOrCreateStubRequest.inputs:type_name -> gateway.Schema 41, // 25: gateway.GetOrCreateStubRequest.outputs:type_name -> gateway.Schema 61, // 26: gateway.GetOrCreateStubRequest.pool:type_name -> gateway.PoolConfig 38, // 27: gateway.GetOrCreateStubRequest.serving:type_name -> gateway.ServingConfig 39, // 28: gateway.GetOrCreateStubRequest.disks:type_name -> gateway.DurableDisk - 203, // 29: gateway.GetOrCreateStubRequest.checkpoint_trigger:type_name -> types.CheckpointTrigger - 200, // 30: gateway.Deployment.created_at:type_name -> google.protobuf.Timestamp - 200, // 31: gateway.Deployment.updated_at:type_name -> google.protobuf.Timestamp - 192, // 32: gateway.ListDeploymentsRequest.filters:type_name -> gateway.ListDeploymentsRequest.FiltersEntry + 207, // 29: gateway.GetOrCreateStubRequest.checkpoint_trigger:type_name -> types.CheckpointTrigger + 204, // 30: gateway.Deployment.created_at:type_name -> google.protobuf.Timestamp + 204, // 31: gateway.Deployment.updated_at:type_name -> google.protobuf.Timestamp + 196, // 32: gateway.ListDeploymentsRequest.filters:type_name -> gateway.ListDeploymentsRequest.FiltersEntry 47, // 33: gateway.ListDeploymentsResponse.deployments:type_name -> gateway.Deployment - 204, // 34: gateway.Pool.state:type_name -> types.WorkerPoolState - 193, // 35: gateway.ListPoolsRequest.filters:type_name -> gateway.ListPoolsRequest.FiltersEntry + 208, // 34: gateway.Pool.state:type_name -> types.WorkerPoolState + 197, // 35: gateway.ListPoolsRequest.filters:type_name -> gateway.ListPoolsRequest.FiltersEntry 58, // 36: gateway.ListPoolsResponse.pools:type_name -> gateway.Pool - 200, // 37: gateway.ProviderInstance.created_at:type_name -> google.protobuf.Timestamp - 200, // 38: gateway.ProviderInstance.expires_at:type_name -> google.protobuf.Timestamp - 200, // 39: gateway.ProviderInstance.billing_renewal_at:type_name -> google.protobuf.Timestamp + 204, // 37: gateway.ProviderInstance.created_at:type_name -> google.protobuf.Timestamp + 204, // 38: gateway.ProviderInstance.expires_at:type_name -> google.protobuf.Timestamp + 204, // 39: gateway.ProviderInstance.billing_renewal_at:type_name -> google.protobuf.Timestamp 61, // 40: gateway.PrivatePool.config:type_name -> gateway.PoolConfig 63, // 41: gateway.PrivatePool.reservations:type_name -> gateway.ProviderInstance - 200, // 42: gateway.PrivatePool.created_at:type_name -> google.protobuf.Timestamp - 200, // 43: gateway.PrivatePool.expires_at:type_name -> google.protobuf.Timestamp + 204, // 42: gateway.PrivatePool.created_at:type_name -> google.protobuf.Timestamp + 204, // 43: gateway.PrivatePool.expires_at:type_name -> google.protobuf.Timestamp 73, // 44: gateway.PrivatePool.byoc:type_name -> gateway.BYOCPoolState 61, // 45: gateway.ListPoolOffersRequest.pool:type_name -> gateway.PoolConfig 62, // 46: gateway.ListPoolOffersResponse.offers:type_name -> gateway.PoolOffer 61, // 47: gateway.LaunchPoolCapacityRequest.pool:type_name -> gateway.PoolConfig 64, // 48: gateway.LaunchPoolCapacityResponse.pool:type_name -> gateway.PrivatePool - 194, // 49: gateway.ListPrivatePoolsRequest.filters:type_name -> gateway.ListPrivatePoolsRequest.FiltersEntry + 198, // 49: gateway.ListPrivatePoolsRequest.filters:type_name -> gateway.ListPrivatePoolsRequest.FiltersEntry 64, // 50: gateway.ListPrivatePoolsResponse.pools:type_name -> gateway.PrivatePool 64, // 51: gateway.CreateBYOCPoolResponse.pool:type_name -> gateway.PrivatePool 73, // 52: gateway.CreateBYOCPoolResponse.byoc:type_name -> gateway.BYOCPoolState @@ -17285,16 +15891,16 @@ var file_gateway_proto_depIdxs = []int32{ 73, // 54: gateway.GetBYOCPoolResponse.byoc:type_name -> gateway.BYOCPoolState 64, // 55: gateway.ScaleBYOCPoolResponse.pool:type_name -> gateway.PrivatePool 73, // 56: gateway.ScaleBYOCPoolResponse.byoc:type_name -> gateway.BYOCPoolState - 200, // 57: gateway.MarketplaceListing.created_at:type_name -> google.protobuf.Timestamp - 200, // 58: gateway.MarketplaceListing.updated_at:type_name -> google.protobuf.Timestamp - 200, // 59: gateway.MarketplaceOffer.created_at:type_name -> google.protobuf.Timestamp + 204, // 57: gateway.MarketplaceListing.created_at:type_name -> google.protobuf.Timestamp + 204, // 58: gateway.MarketplaceListing.updated_at:type_name -> google.protobuf.Timestamp + 204, // 59: gateway.MarketplaceOffer.created_at:type_name -> google.protobuf.Timestamp 78, // 60: gateway.CreateMarketplaceListingResponse.listing:type_name -> gateway.MarketplaceListing 78, // 61: gateway.UpdateMarketplaceListingResponse.listing:type_name -> gateway.MarketplaceListing 78, // 62: gateway.ListMarketplaceListingsResponse.listings:type_name -> gateway.MarketplaceListing - 200, // 63: gateway.GetMarketplaceJoinCommandResponse.expires_at:type_name -> google.protobuf.Timestamp + 204, // 63: gateway.GetMarketplaceJoinCommandResponse.expires_at:type_name -> google.protobuf.Timestamp 79, // 64: gateway.ListMarketplaceOffersResponse.offers:type_name -> gateway.MarketplaceOffer 79, // 65: gateway.GetMarketplaceOfferResponse.offer:type_name -> gateway.MarketplaceOffer - 200, // 66: gateway.MarketplaceRental.created_at:type_name -> google.protobuf.Timestamp + 204, // 66: gateway.MarketplaceRental.created_at:type_name -> google.protobuf.Timestamp 94, // 67: gateway.CreateMarketplaceRentalResponse.rental:type_name -> gateway.MarketplaceRental 94, // 68: gateway.ListMarketplaceRentalsResponse.rentals:type_name -> gateway.MarketplaceRental 148, // 69: gateway.ListMarketplaceMachinesResponse.machines:type_name -> gateway.Machine @@ -17302,9 +15908,9 @@ var file_gateway_proto_depIdxs = []int32{ 61, // 71: gateway.CreatePoolRequest.pool:type_name -> gateway.PoolConfig 64, // 72: gateway.CreatePoolResponse.pool:type_name -> gateway.PrivatePool 64, // 73: gateway.ExtendPoolCapacityResponse.pool:type_name -> gateway.PrivatePool - 200, // 74: gateway.CreatePoolJoinTokenResponse.expires_at:type_name -> google.protobuf.Timestamp - 200, // 75: gateway.GetPoolJoinCommandResponse.expires_at:type_name -> google.protobuf.Timestamp - 144, // 76: gateway.ListPoolMachinesResponse.machines:type_name -> gateway.Machine + 204, // 74: gateway.CreatePoolJoinTokenResponse.expires_at:type_name -> google.protobuf.Timestamp + 204, // 75: gateway.GetPoolJoinCommandResponse.expires_at:type_name -> google.protobuf.Timestamp + 148, // 76: gateway.ListPoolMachinesResponse.machines:type_name -> gateway.Machine 124, // 77: gateway.AgentBootstrapConfig.telemetry:type_name -> gateway.AgentTelemetryConfig 123, // 78: gateway.AgentBootstrapConfig.billing:type_name -> gateway.AgentBillingConfig 125, // 79: gateway.AgentTelemetryConfig.logs:type_name -> gateway.AgentTelemetrySinkConfig @@ -17312,34 +15918,34 @@ var file_gateway_proto_depIdxs = []int32{ 128, // 81: gateway.JoinAgentRequest.preflight:type_name -> gateway.AgentPreflightCheck 122, // 82: gateway.JoinAgentResponse.bootstrap:type_name -> gateway.AgentBootstrapConfig 129, // 83: gateway.ListAgentRoutesResponse.routes:type_name -> gateway.AgentRoute - 195, // 84: gateway.UpdateAgentRouteStatusRequest.attrs:type_name -> gateway.UpdateAgentRouteStatusRequest.AttrsEntry - 188, // 85: gateway.AgentWorkerSlot.pool_config:type_name -> gateway.AgentPoolRuntimeConfig + 199, // 84: gateway.UpdateAgentRouteStatusRequest.attrs:type_name -> gateway.UpdateAgentRouteStatusRequest.AttrsEntry + 192, // 85: gateway.AgentWorkerSlot.pool_config:type_name -> gateway.AgentPoolRuntimeConfig 129, // 86: gateway.StreamAgentResponse.routes:type_name -> gateway.AgentRoute - 136, // 87: gateway.StreamAgentResponse.slots:type_name -> gateway.AgentWorkerSlot - 182, // 88: gateway.StreamAgentResponse.ssh:type_name -> gateway.AgentSSHConfig - 146, // 89: gateway.AgentMetricSnapshot.path_metrics:type_name -> gateway.MachinePathMetrics - 196, // 90: gateway.AgentEventRecord.attrs:type_name -> gateway.AgentEventRecord.AttrsEntry - 139, // 91: gateway.AgentTelemetryRequest.logs:type_name -> gateway.AgentLogRecord - 140, // 92: gateway.AgentTelemetryRequest.metrics:type_name -> gateway.AgentMetricSnapshot - 141, // 93: gateway.AgentTelemetryRequest.events:type_name -> gateway.AgentEventRecord - 145, // 94: gateway.Machine.machine_metrics:type_name -> gateway.MachineMetrics - 185, // 95: gateway.Machine.ssh:type_name -> gateway.MachineSSHAccess - 146, // 96: gateway.MachineMetrics.path_metrics:type_name -> gateway.MachinePathMetrics - 144, // 97: gateway.ListMachinesResponse.machines:type_name -> gateway.Machine - 197, // 98: gateway.ListMachinesResponse.gpus:type_name -> gateway.ListMachinesResponse.GpusEntry - 198, // 99: gateway.ListMachinesResponse.supported_gpus:type_name -> gateway.ListMachinesResponse.SupportedGpusEntry - 144, // 100: gateway.CreateMachineResponse.machine:type_name -> gateway.Machine - 200, // 101: gateway.Token.created_at:type_name -> google.protobuf.Timestamp - 200, // 102: gateway.Token.updated_at:type_name -> google.protobuf.Timestamp - 153, // 103: gateway.ListTokensResponse.tokens:type_name -> gateway.Token - 153, // 104: gateway.CreateTokenResponse.token:type_name -> gateway.Token - 153, // 105: gateway.ToggleTokenResponse.token:type_name -> gateway.Token - 205, // 106: gateway.ListWorkersResponse.workers:type_name -> types.Worker - 185, // 107: gateway.RotateMachineSSHKeyResponse.ssh:type_name -> gateway.MachineSSHAccess - 185, // 108: gateway.ActivateMachineSSHKeyResponse.ssh:type_name -> gateway.MachineSSHAccess - 200, // 109: gateway.MachineSSHAccess.updated_at:type_name -> google.protobuf.Timestamp - 186, // 110: gateway.AgentPoolCacheConfig.disk:type_name -> gateway.AgentPoolCacheDiskConfig - 187, // 111: gateway.AgentPoolRuntimeConfig.cache:type_name -> gateway.AgentPoolCacheConfig + 140, // 87: gateway.StreamAgentResponse.slots:type_name -> gateway.AgentWorkerSlot + 186, // 88: gateway.StreamAgentResponse.ssh:type_name -> gateway.AgentSSHConfig + 150, // 89: gateway.AgentMetricSnapshot.path_metrics:type_name -> gateway.MachinePathMetrics + 200, // 90: gateway.AgentEventRecord.attrs:type_name -> gateway.AgentEventRecord.AttrsEntry + 143, // 91: gateway.AgentTelemetryRequest.logs:type_name -> gateway.AgentLogRecord + 144, // 92: gateway.AgentTelemetryRequest.metrics:type_name -> gateway.AgentMetricSnapshot + 145, // 93: gateway.AgentTelemetryRequest.events:type_name -> gateway.AgentEventRecord + 149, // 94: gateway.Machine.machine_metrics:type_name -> gateway.MachineMetrics + 189, // 95: gateway.Machine.ssh:type_name -> gateway.MachineSSHAccess + 150, // 96: gateway.MachineMetrics.path_metrics:type_name -> gateway.MachinePathMetrics + 148, // 97: gateway.ListMachinesResponse.machines:type_name -> gateway.Machine + 201, // 98: gateway.ListMachinesResponse.gpus:type_name -> gateway.ListMachinesResponse.GpusEntry + 202, // 99: gateway.ListMachinesResponse.supported_gpus:type_name -> gateway.ListMachinesResponse.SupportedGpusEntry + 148, // 100: gateway.CreateMachineResponse.machine:type_name -> gateway.Machine + 204, // 101: gateway.Token.created_at:type_name -> google.protobuf.Timestamp + 204, // 102: gateway.Token.updated_at:type_name -> google.protobuf.Timestamp + 157, // 103: gateway.ListTokensResponse.tokens:type_name -> gateway.Token + 157, // 104: gateway.CreateTokenResponse.token:type_name -> gateway.Token + 157, // 105: gateway.ToggleTokenResponse.token:type_name -> gateway.Token + 209, // 106: gateway.ListWorkersResponse.workers:type_name -> types.Worker + 189, // 107: gateway.RotateMachineSSHKeyResponse.ssh:type_name -> gateway.MachineSSHAccess + 189, // 108: gateway.ActivateMachineSSHKeyResponse.ssh:type_name -> gateway.MachineSSHAccess + 204, // 109: gateway.MachineSSHAccess.updated_at:type_name -> google.protobuf.Timestamp + 190, // 110: gateway.AgentPoolCacheConfig.disk:type_name -> gateway.AgentPoolCacheDiskConfig + 191, // 111: gateway.AgentPoolRuntimeConfig.cache:type_name -> gateway.AgentPoolCacheConfig 27, // 112: gateway.ListTasksRequest.FiltersEntry.value:type_name -> gateway.StringList 42, // 113: gateway.Schema.FieldsEntry.value:type_name -> gateway.SchemaField 27, // 114: gateway.ListDeploymentsRequest.FiltersEntry.value:type_name -> gateway.StringList @@ -17360,7 +15966,7 @@ var file_gateway_proto_depIdxs = []int32{ 28, // 129: gateway.GatewayService.ListTasks:input_type -> gateway.ListTasksRequest 43, // 130: gateway.GatewayService.GetOrCreateStub:input_type -> gateway.GetOrCreateStubRequest 45, // 131: gateway.GatewayService.DeployStub:input_type -> gateway.DeployStubRequest - 162, // 132: gateway.GatewayService.GetURL:input_type -> gateway.GetURLRequest + 166, // 132: gateway.GatewayService.GetURL:input_type -> gateway.GetURLRequest 48, // 133: gateway.GatewayService.ListDeployments:input_type -> gateway.ListDeploymentsRequest 50, // 134: gateway.GatewayService.StopDeployment:input_type -> gateway.StopDeploymentRequest 52, // 135: gateway.GatewayService.StartDeployment:input_type -> gateway.StartDeploymentRequest @@ -17393,102 +15999,106 @@ var file_gateway_proto_depIdxs = []int32{ 116, // 162: gateway.GatewayService.RevokePoolJoinToken:input_type -> gateway.RevokePoolJoinTokenRequest 118, // 163: gateway.GatewayService.GetPoolJoinCommand:input_type -> gateway.GetPoolJoinCommandRequest 120, // 164: gateway.GatewayService.ListPoolMachines:input_type -> gateway.ListPoolMachinesRequest - 176, // 165: gateway.GatewayService.DownloadMachineSSHKey:input_type -> gateway.DownloadMachineSSHKeyRequest - 178, // 166: gateway.GatewayService.RotateMachineSSHKey:input_type -> gateway.RotateMachineSSHKeyRequest - 180, // 167: gateway.GatewayService.ActivateMachineSSHKey:input_type -> gateway.ActivateMachineSSHKeyRequest + 180, // 165: gateway.GatewayService.DownloadMachineSSHKey:input_type -> gateway.DownloadMachineSSHKeyRequest + 182, // 166: gateway.GatewayService.RotateMachineSSHKey:input_type -> gateway.RotateMachineSSHKeyRequest + 184, // 167: gateway.GatewayService.ActivateMachineSSHKey:input_type -> gateway.ActivateMachineSSHKeyRequest 126, // 168: gateway.GatewayService.JoinAgent:input_type -> gateway.JoinAgentRequest 130, // 169: gateway.GatewayService.RequestAgentTransportCredential:input_type -> gateway.RequestAgentTransportCredentialRequest - 132, // 170: gateway.GatewayService.ListAgentRoutes:input_type -> gateway.ListAgentRoutesRequest - 134, // 171: gateway.GatewayService.UpdateAgentRouteStatus:input_type -> gateway.UpdateAgentRouteStatusRequest - 183, // 172: gateway.GatewayService.UpdateAgentSSHStatus:input_type -> gateway.UpdateAgentSSHStatusRequest - 174, // 173: gateway.GatewayService.UpdateAgentAvailability:input_type -> gateway.UpdateAgentAvailabilityRequest - 137, // 174: gateway.GatewayService.StreamAgent:input_type -> gateway.StreamAgentRequest - 142, // 175: gateway.GatewayService.StreamAgentTelemetry:input_type -> gateway.AgentTelemetryRequest - 147, // 176: gateway.GatewayService.ListMachines:input_type -> gateway.ListMachinesRequest - 149, // 177: gateway.GatewayService.CreateMachine:input_type -> gateway.CreateMachineRequest - 151, // 178: gateway.GatewayService.DeleteMachine:input_type -> gateway.DeleteMachineRequest - 154, // 179: gateway.GatewayService.ListTokens:input_type -> gateway.ListTokensRequest - 156, // 180: gateway.GatewayService.CreateToken:input_type -> gateway.CreateTokenRequest - 158, // 181: gateway.GatewayService.ToggleToken:input_type -> gateway.ToggleTokenRequest - 160, // 182: gateway.GatewayService.DeleteToken:input_type -> gateway.DeleteTokenRequest - 164, // 183: gateway.GatewayService.ListWorkers:input_type -> gateway.ListWorkersRequest - 166, // 184: gateway.GatewayService.CordonWorker:input_type -> gateway.CordonWorkerRequest - 168, // 185: gateway.GatewayService.UncordonWorker:input_type -> gateway.UncordonWorkerRequest - 170, // 186: gateway.GatewayService.DrainWorker:input_type -> gateway.DrainWorkerRequest - 172, // 187: gateway.GatewayService.ExportWorkspaceConfig:input_type -> gateway.ExportWorkspaceConfigRequest - 2, // 188: gateway.GatewayService.Authorize:output_type -> gateway.AuthorizeResponse - 4, // 189: gateway.GatewayService.SignPayload:output_type -> gateway.SignPayloadResponse - 7, // 190: gateway.GatewayService.HeadObject:output_type -> gateway.HeadObjectResponse - 9, // 191: gateway.GatewayService.CreateObject:output_type -> gateway.CreateObjectResponse - 11, // 192: gateway.GatewayService.PutObjectStream:output_type -> gateway.PutObjectResponse - 19, // 193: gateway.GatewayService.CheckpointContainer:output_type -> gateway.CheckpointContainerResponse - 15, // 194: gateway.GatewayService.ListContainers:output_type -> gateway.ListContainersResponse - 17, // 195: gateway.GatewayService.StopContainer:output_type -> gateway.StopContainerResponse - 22, // 196: gateway.GatewayService.AttachToContainer:output_type -> gateway.AttachToContainerResponse - 24, // 197: gateway.GatewayService.StartTask:output_type -> gateway.StartTaskResponse - 26, // 198: gateway.GatewayService.EndTask:output_type -> gateway.EndTaskResponse - 32, // 199: gateway.GatewayService.StopTasks:output_type -> gateway.StopTasksResponse - 30, // 200: gateway.GatewayService.ListTasks:output_type -> gateway.ListTasksResponse - 44, // 201: gateway.GatewayService.GetOrCreateStub:output_type -> gateway.GetOrCreateStubResponse - 46, // 202: gateway.GatewayService.DeployStub:output_type -> gateway.DeployStubResponse - 163, // 203: gateway.GatewayService.GetURL:output_type -> gateway.GetURLResponse - 49, // 204: gateway.GatewayService.ListDeployments:output_type -> gateway.ListDeploymentsResponse - 51, // 205: gateway.GatewayService.StopDeployment:output_type -> gateway.StopDeploymentResponse - 53, // 206: gateway.GatewayService.StartDeployment:output_type -> gateway.StartDeploymentResponse - 55, // 207: gateway.GatewayService.ScaleDeployment:output_type -> gateway.ScaleDeploymentResponse - 57, // 208: gateway.GatewayService.DeleteDeployment:output_type -> gateway.DeleteDeploymentResponse - 60, // 209: gateway.GatewayService.ListPools:output_type -> gateway.ListPoolsResponse - 66, // 210: gateway.GatewayService.ListPoolOffers:output_type -> gateway.ListPoolOffersResponse - 68, // 211: gateway.GatewayService.LaunchPoolCapacity:output_type -> gateway.LaunchPoolCapacityResponse - 70, // 212: gateway.GatewayService.ListPrivatePools:output_type -> gateway.ListPrivatePoolsResponse - 72, // 213: gateway.GatewayService.CreateBYOCPool:output_type -> gateway.CreateBYOCPoolResponse - 75, // 214: gateway.GatewayService.GetBYOCPool:output_type -> gateway.GetBYOCPoolResponse - 77, // 215: gateway.GatewayService.ScaleBYOCPool:output_type -> gateway.ScaleBYOCPoolResponse - 81, // 216: gateway.GatewayService.CreateMarketplaceListing:output_type -> gateway.CreateMarketplaceListingResponse - 83, // 217: gateway.GatewayService.UpdateMarketplaceListing:output_type -> gateway.UpdateMarketplaceListingResponse - 85, // 218: gateway.GatewayService.DeleteMarketplaceListing:output_type -> gateway.DeleteMarketplaceListingResponse - 87, // 219: gateway.GatewayService.ListMarketplaceListings:output_type -> gateway.ListMarketplaceListingsResponse - 89, // 220: gateway.GatewayService.GetMarketplaceJoinCommand:output_type -> gateway.GetMarketplaceJoinCommandResponse - 91, // 221: gateway.GatewayService.ListMarketplaceOffers:output_type -> gateway.ListMarketplaceOffersResponse - 93, // 222: gateway.GatewayService.GetMarketplaceOffer:output_type -> gateway.GetMarketplaceOfferResponse - 96, // 223: gateway.GatewayService.CreateMarketplaceRental:output_type -> gateway.CreateMarketplaceRentalResponse - 98, // 224: gateway.GatewayService.ListMarketplaceRentals:output_type -> gateway.ListMarketplaceRentalsResponse - 100, // 225: gateway.GatewayService.DeleteMarketplaceRental:output_type -> gateway.DeleteMarketplaceRentalResponse - 102, // 226: gateway.GatewayService.LaunchRentalWorkload:output_type -> gateway.LaunchRentalWorkloadResponse - 104, // 227: gateway.GatewayService.ListMarketplaceMachines:output_type -> gateway.ListMarketplaceMachinesResponse - 107, // 228: gateway.GatewayService.ListMachineContainers:output_type -> gateway.ListMachineContainersResponse - 109, // 229: gateway.GatewayService.CreatePool:output_type -> gateway.CreatePoolResponse - 111, // 230: gateway.GatewayService.DeletePool:output_type -> gateway.DeletePoolResponse - 113, // 231: gateway.GatewayService.ExtendPoolCapacity:output_type -> gateway.ExtendPoolCapacityResponse - 115, // 232: gateway.GatewayService.CreatePoolJoinToken:output_type -> gateway.CreatePoolJoinTokenResponse - 117, // 233: gateway.GatewayService.RevokePoolJoinToken:output_type -> gateway.RevokePoolJoinTokenResponse - 119, // 234: gateway.GatewayService.GetPoolJoinCommand:output_type -> gateway.GetPoolJoinCommandResponse - 121, // 235: gateway.GatewayService.ListPoolMachines:output_type -> gateway.ListPoolMachinesResponse - 177, // 236: gateway.GatewayService.DownloadMachineSSHKey:output_type -> gateway.DownloadMachineSSHKeyResponse - 179, // 237: gateway.GatewayService.RotateMachineSSHKey:output_type -> gateway.RotateMachineSSHKeyResponse - 181, // 238: gateway.GatewayService.ActivateMachineSSHKey:output_type -> gateway.ActivateMachineSSHKeyResponse - 127, // 239: gateway.GatewayService.JoinAgent:output_type -> gateway.JoinAgentResponse - 131, // 240: gateway.GatewayService.RequestAgentTransportCredential:output_type -> gateway.RequestAgentTransportCredentialResponse - 133, // 241: gateway.GatewayService.ListAgentRoutes:output_type -> gateway.ListAgentRoutesResponse - 135, // 242: gateway.GatewayService.UpdateAgentRouteStatus:output_type -> gateway.UpdateAgentRouteStatusResponse - 184, // 243: gateway.GatewayService.UpdateAgentSSHStatus:output_type -> gateway.UpdateAgentSSHStatusResponse - 175, // 244: gateway.GatewayService.UpdateAgentAvailability:output_type -> gateway.UpdateAgentAvailabilityResponse - 138, // 245: gateway.GatewayService.StreamAgent:output_type -> gateway.StreamAgentResponse - 143, // 246: gateway.GatewayService.StreamAgentTelemetry:output_type -> gateway.AgentTelemetryResponse - 148, // 247: gateway.GatewayService.ListMachines:output_type -> gateway.ListMachinesResponse - 150, // 248: gateway.GatewayService.CreateMachine:output_type -> gateway.CreateMachineResponse - 152, // 249: gateway.GatewayService.DeleteMachine:output_type -> gateway.DeleteMachineResponse - 155, // 250: gateway.GatewayService.ListTokens:output_type -> gateway.ListTokensResponse - 157, // 251: gateway.GatewayService.CreateToken:output_type -> gateway.CreateTokenResponse - 159, // 252: gateway.GatewayService.ToggleToken:output_type -> gateway.ToggleTokenResponse - 161, // 253: gateway.GatewayService.DeleteToken:output_type -> gateway.DeleteTokenResponse - 165, // 254: gateway.GatewayService.ListWorkers:output_type -> gateway.ListWorkersResponse - 167, // 255: gateway.GatewayService.CordonWorker:output_type -> gateway.CordonWorkerResponse - 169, // 256: gateway.GatewayService.UncordonWorker:output_type -> gateway.UncordonWorkerResponse - 171, // 257: gateway.GatewayService.DrainWorker:output_type -> gateway.DrainWorkerResponse - 173, // 258: gateway.GatewayService.ExportWorkspaceConfig:output_type -> gateway.ExportWorkspaceConfigResponse - 188, // [188:259] is the sub-list for method output_type - 117, // [117:188] is the sub-list for method input_type + 132, // 170: gateway.GatewayService.CreateNodeEnrollment:input_type -> gateway.CreateNodeEnrollmentRequest + 134, // 171: gateway.GatewayService.DeleteNodeEnrollment:input_type -> gateway.DeleteNodeEnrollmentRequest + 136, // 172: gateway.GatewayService.ListAgentRoutes:input_type -> gateway.ListAgentRoutesRequest + 138, // 173: gateway.GatewayService.UpdateAgentRouteStatus:input_type -> gateway.UpdateAgentRouteStatusRequest + 187, // 174: gateway.GatewayService.UpdateAgentSSHStatus:input_type -> gateway.UpdateAgentSSHStatusRequest + 178, // 175: gateway.GatewayService.UpdateAgentAvailability:input_type -> gateway.UpdateAgentAvailabilityRequest + 141, // 176: gateway.GatewayService.StreamAgent:input_type -> gateway.StreamAgentRequest + 146, // 177: gateway.GatewayService.StreamAgentTelemetry:input_type -> gateway.AgentTelemetryRequest + 151, // 178: gateway.GatewayService.ListMachines:input_type -> gateway.ListMachinesRequest + 153, // 179: gateway.GatewayService.CreateMachine:input_type -> gateway.CreateMachineRequest + 155, // 180: gateway.GatewayService.DeleteMachine:input_type -> gateway.DeleteMachineRequest + 158, // 181: gateway.GatewayService.ListTokens:input_type -> gateway.ListTokensRequest + 160, // 182: gateway.GatewayService.CreateToken:input_type -> gateway.CreateTokenRequest + 162, // 183: gateway.GatewayService.ToggleToken:input_type -> gateway.ToggleTokenRequest + 164, // 184: gateway.GatewayService.DeleteToken:input_type -> gateway.DeleteTokenRequest + 168, // 185: gateway.GatewayService.ListWorkers:input_type -> gateway.ListWorkersRequest + 170, // 186: gateway.GatewayService.CordonWorker:input_type -> gateway.CordonWorkerRequest + 172, // 187: gateway.GatewayService.UncordonWorker:input_type -> gateway.UncordonWorkerRequest + 174, // 188: gateway.GatewayService.DrainWorker:input_type -> gateway.DrainWorkerRequest + 176, // 189: gateway.GatewayService.ExportWorkspaceConfig:input_type -> gateway.ExportWorkspaceConfigRequest + 2, // 190: gateway.GatewayService.Authorize:output_type -> gateway.AuthorizeResponse + 4, // 191: gateway.GatewayService.SignPayload:output_type -> gateway.SignPayloadResponse + 7, // 192: gateway.GatewayService.HeadObject:output_type -> gateway.HeadObjectResponse + 9, // 193: gateway.GatewayService.CreateObject:output_type -> gateway.CreateObjectResponse + 11, // 194: gateway.GatewayService.PutObjectStream:output_type -> gateway.PutObjectResponse + 19, // 195: gateway.GatewayService.CheckpointContainer:output_type -> gateway.CheckpointContainerResponse + 15, // 196: gateway.GatewayService.ListContainers:output_type -> gateway.ListContainersResponse + 17, // 197: gateway.GatewayService.StopContainer:output_type -> gateway.StopContainerResponse + 22, // 198: gateway.GatewayService.AttachToContainer:output_type -> gateway.AttachToContainerResponse + 24, // 199: gateway.GatewayService.StartTask:output_type -> gateway.StartTaskResponse + 26, // 200: gateway.GatewayService.EndTask:output_type -> gateway.EndTaskResponse + 32, // 201: gateway.GatewayService.StopTasks:output_type -> gateway.StopTasksResponse + 30, // 202: gateway.GatewayService.ListTasks:output_type -> gateway.ListTasksResponse + 44, // 203: gateway.GatewayService.GetOrCreateStub:output_type -> gateway.GetOrCreateStubResponse + 46, // 204: gateway.GatewayService.DeployStub:output_type -> gateway.DeployStubResponse + 167, // 205: gateway.GatewayService.GetURL:output_type -> gateway.GetURLResponse + 49, // 206: gateway.GatewayService.ListDeployments:output_type -> gateway.ListDeploymentsResponse + 51, // 207: gateway.GatewayService.StopDeployment:output_type -> gateway.StopDeploymentResponse + 53, // 208: gateway.GatewayService.StartDeployment:output_type -> gateway.StartDeploymentResponse + 55, // 209: gateway.GatewayService.ScaleDeployment:output_type -> gateway.ScaleDeploymentResponse + 57, // 210: gateway.GatewayService.DeleteDeployment:output_type -> gateway.DeleteDeploymentResponse + 60, // 211: gateway.GatewayService.ListPools:output_type -> gateway.ListPoolsResponse + 66, // 212: gateway.GatewayService.ListPoolOffers:output_type -> gateway.ListPoolOffersResponse + 68, // 213: gateway.GatewayService.LaunchPoolCapacity:output_type -> gateway.LaunchPoolCapacityResponse + 70, // 214: gateway.GatewayService.ListPrivatePools:output_type -> gateway.ListPrivatePoolsResponse + 72, // 215: gateway.GatewayService.CreateBYOCPool:output_type -> gateway.CreateBYOCPoolResponse + 75, // 216: gateway.GatewayService.GetBYOCPool:output_type -> gateway.GetBYOCPoolResponse + 77, // 217: gateway.GatewayService.ScaleBYOCPool:output_type -> gateway.ScaleBYOCPoolResponse + 81, // 218: gateway.GatewayService.CreateMarketplaceListing:output_type -> gateway.CreateMarketplaceListingResponse + 83, // 219: gateway.GatewayService.UpdateMarketplaceListing:output_type -> gateway.UpdateMarketplaceListingResponse + 85, // 220: gateway.GatewayService.DeleteMarketplaceListing:output_type -> gateway.DeleteMarketplaceListingResponse + 87, // 221: gateway.GatewayService.ListMarketplaceListings:output_type -> gateway.ListMarketplaceListingsResponse + 89, // 222: gateway.GatewayService.GetMarketplaceJoinCommand:output_type -> gateway.GetMarketplaceJoinCommandResponse + 91, // 223: gateway.GatewayService.ListMarketplaceOffers:output_type -> gateway.ListMarketplaceOffersResponse + 93, // 224: gateway.GatewayService.GetMarketplaceOffer:output_type -> gateway.GetMarketplaceOfferResponse + 96, // 225: gateway.GatewayService.CreateMarketplaceRental:output_type -> gateway.CreateMarketplaceRentalResponse + 98, // 226: gateway.GatewayService.ListMarketplaceRentals:output_type -> gateway.ListMarketplaceRentalsResponse + 100, // 227: gateway.GatewayService.DeleteMarketplaceRental:output_type -> gateway.DeleteMarketplaceRentalResponse + 102, // 228: gateway.GatewayService.LaunchRentalWorkload:output_type -> gateway.LaunchRentalWorkloadResponse + 104, // 229: gateway.GatewayService.ListMarketplaceMachines:output_type -> gateway.ListMarketplaceMachinesResponse + 107, // 230: gateway.GatewayService.ListMachineContainers:output_type -> gateway.ListMachineContainersResponse + 109, // 231: gateway.GatewayService.CreatePool:output_type -> gateway.CreatePoolResponse + 111, // 232: gateway.GatewayService.DeletePool:output_type -> gateway.DeletePoolResponse + 113, // 233: gateway.GatewayService.ExtendPoolCapacity:output_type -> gateway.ExtendPoolCapacityResponse + 115, // 234: gateway.GatewayService.CreatePoolJoinToken:output_type -> gateway.CreatePoolJoinTokenResponse + 117, // 235: gateway.GatewayService.RevokePoolJoinToken:output_type -> gateway.RevokePoolJoinTokenResponse + 119, // 236: gateway.GatewayService.GetPoolJoinCommand:output_type -> gateway.GetPoolJoinCommandResponse + 121, // 237: gateway.GatewayService.ListPoolMachines:output_type -> gateway.ListPoolMachinesResponse + 181, // 238: gateway.GatewayService.DownloadMachineSSHKey:output_type -> gateway.DownloadMachineSSHKeyResponse + 183, // 239: gateway.GatewayService.RotateMachineSSHKey:output_type -> gateway.RotateMachineSSHKeyResponse + 185, // 240: gateway.GatewayService.ActivateMachineSSHKey:output_type -> gateway.ActivateMachineSSHKeyResponse + 127, // 241: gateway.GatewayService.JoinAgent:output_type -> gateway.JoinAgentResponse + 131, // 242: gateway.GatewayService.RequestAgentTransportCredential:output_type -> gateway.RequestAgentTransportCredentialResponse + 133, // 243: gateway.GatewayService.CreateNodeEnrollment:output_type -> gateway.CreateNodeEnrollmentResponse + 135, // 244: gateway.GatewayService.DeleteNodeEnrollment:output_type -> gateway.DeleteNodeEnrollmentResponse + 137, // 245: gateway.GatewayService.ListAgentRoutes:output_type -> gateway.ListAgentRoutesResponse + 139, // 246: gateway.GatewayService.UpdateAgentRouteStatus:output_type -> gateway.UpdateAgentRouteStatusResponse + 188, // 247: gateway.GatewayService.UpdateAgentSSHStatus:output_type -> gateway.UpdateAgentSSHStatusResponse + 179, // 248: gateway.GatewayService.UpdateAgentAvailability:output_type -> gateway.UpdateAgentAvailabilityResponse + 142, // 249: gateway.GatewayService.StreamAgent:output_type -> gateway.StreamAgentResponse + 147, // 250: gateway.GatewayService.StreamAgentTelemetry:output_type -> gateway.AgentTelemetryResponse + 152, // 251: gateway.GatewayService.ListMachines:output_type -> gateway.ListMachinesResponse + 154, // 252: gateway.GatewayService.CreateMachine:output_type -> gateway.CreateMachineResponse + 156, // 253: gateway.GatewayService.DeleteMachine:output_type -> gateway.DeleteMachineResponse + 159, // 254: gateway.GatewayService.ListTokens:output_type -> gateway.ListTokensResponse + 161, // 255: gateway.GatewayService.CreateToken:output_type -> gateway.CreateTokenResponse + 163, // 256: gateway.GatewayService.ToggleToken:output_type -> gateway.ToggleTokenResponse + 165, // 257: gateway.GatewayService.DeleteToken:output_type -> gateway.DeleteTokenResponse + 169, // 258: gateway.GatewayService.ListWorkers:output_type -> gateway.ListWorkersResponse + 171, // 259: gateway.GatewayService.CordonWorker:output_type -> gateway.CordonWorkerResponse + 173, // 260: gateway.GatewayService.UncordonWorker:output_type -> gateway.UncordonWorkerResponse + 175, // 261: gateway.GatewayService.DrainWorker:output_type -> gateway.DrainWorkerResponse + 177, // 262: gateway.GatewayService.ExportWorkspaceConfig:output_type -> gateway.ExportWorkspaceConfigResponse + 190, // [190:263] is the sub-list for method output_type + 117, // [117:190] is the sub-list for method input_type 117, // [117:117] is the sub-list for extension type_name 117, // [117:117] is the sub-list for extension extendee 0, // [0:117] is the sub-list for field type_name @@ -17500,2265 +16110,7 @@ func file_gateway_proto_init() { return } file_types_proto_init() - if !protoimpl.UnsafeEnabled { - file_gateway_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthorizeRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthorizeResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignPayloadRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignPayloadResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObjectMetadata); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HeadObjectRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HeadObjectResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateObjectRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateObjectResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutObjectRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutObjectResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncContainerWorkspaceRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncContainerWorkspaceResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListContainersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListContainersResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopContainerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopContainerResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CheckpointContainerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CheckpointContainerResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerStreamMessage); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachToContainerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachToContainerResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartTaskRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartTaskResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EndTaskRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EndTaskResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StringList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTasksRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Task); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTasksResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopTasksRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopTasksResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Volume); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SecretVar); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Autoscaler); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LLMConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseServingConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServingConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DurableDisk); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TaskPolicy); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Schema); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SchemaField); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetOrCreateStubRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetOrCreateStubResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeployStubRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeployStubResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Deployment); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListDeploymentsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListDeploymentsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopDeploymentRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopDeploymentResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartDeploymentRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartDeploymentResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ScaleDeploymentRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ScaleDeploymentResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteDeploymentRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteDeploymentResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Pool); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPoolsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPoolsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PoolConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PoolOffer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProviderInstance); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PrivatePool); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPoolOffersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPoolOffersResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LaunchPoolCapacityRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LaunchPoolCapacityResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPrivatePoolsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPrivatePoolsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateBYOCPoolRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateBYOCPoolResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BYOCPoolState); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBYOCPoolRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBYOCPoolResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ScaleBYOCPoolRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ScaleBYOCPoolResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarketplaceListing); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarketplaceOffer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMarketplaceListingRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMarketplaceListingResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateMarketplaceListingRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateMarketplaceListingResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMarketplaceListingRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMarketplaceListingResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarketplaceListingsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarketplaceListingsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMarketplaceJoinCommandRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMarketplaceJoinCommandResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarketplaceOffersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarketplaceOffersResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMarketplaceOfferRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMarketplaceOfferResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarketplaceRental); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMarketplaceRentalRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMarketplaceRentalResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarketplaceRentalsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarketplaceRentalsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMarketplaceRentalRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMarketplaceRentalResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LaunchRentalWorkloadRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LaunchRentalWorkloadResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarketplaceMachinesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarketplaceMachinesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMachineContainersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MachineContainer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMachineContainersResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreatePoolRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreatePoolResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeletePoolRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeletePoolResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtendPoolCapacityRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtendPoolCapacityResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreatePoolJoinTokenRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreatePoolJoinTokenResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RevokePoolJoinTokenRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RevokePoolJoinTokenResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPoolJoinCommandRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPoolJoinCommandResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPoolMachinesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPoolMachinesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentBootstrapConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentBillingConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentTelemetryConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentTelemetrySinkConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JoinAgentRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JoinAgentResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentPreflightCheck); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentRoute); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RequestAgentTransportCredentialRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RequestAgentTransportCredentialResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAgentRoutesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAgentRoutesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateAgentRouteStatusRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateAgentRouteStatusResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentWorkerSlot); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamAgentRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamAgentResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentLogRecord); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentMetricSnapshot); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentEventRecord); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentTelemetryRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentTelemetryResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Machine); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MachineMetrics); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MachinePathMetrics); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[146].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMachinesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[147].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMachinesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[148].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMachineRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[149].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMachineResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[150].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMachineRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[151].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMachineResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[152].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Token); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[153].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTokensRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[154].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTokensResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[155].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTokenRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[156].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTokenResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[157].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ToggleTokenRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[158].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ToggleTokenResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[159].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteTokenRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[160].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteTokenResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[161].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetURLRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[162].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetURLResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[163].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[164].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkersResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[165].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CordonWorkerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[166].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CordonWorkerResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[167].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UncordonWorkerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[168].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UncordonWorkerResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[169].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DrainWorkerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[170].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DrainWorkerResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[171].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExportWorkspaceConfigRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[172].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExportWorkspaceConfigResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[173].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateAgentAvailabilityRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[174].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateAgentAvailabilityResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[175].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DownloadMachineSSHKeyRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[176].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DownloadMachineSSHKeyResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[177].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RotateMachineSSHKeyRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[178].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RotateMachineSSHKeyResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[179].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ActivateMachineSSHKeyRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[180].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ActivateMachineSSHKeyResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[181].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentSSHConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[182].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateAgentSSHStatusRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[183].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateAgentSSHStatusResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[184].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MachineSSHAccess); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[185].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentPoolCacheDiskConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[186].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentPoolCacheConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[187].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentPoolRuntimeConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_gateway_proto_msgTypes[19].OneofWrappers = []interface{}{ + file_gateway_proto_msgTypes[19].OneofWrappers = []any{ (*ContainerStreamMessage_AttachRequest)(nil), (*ContainerStreamMessage_SyncContainerWorkspace)(nil), } @@ -19771,7 +16123,7 @@ func file_gateway_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_gateway_proto_rawDesc), len(file_gateway_proto_rawDesc)), NumEnums: 1, - NumMessages: 198, + NumMessages: 202, NumExtensions: 0, NumServices: 1, }, From bcc9e728c044cac9e55af2b2a351d85bbcbd6bcd Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Thu, 6 Aug 2026 01:50:18 +0000 Subject: [PATCH 20/26] using worker gpu virtualized env --- pkg/agent/agent_test.go | 2 ++ pkg/agent/worker_container.go | 1 + pkg/types/agent_worker.go | 1 + pkg/worker/lifecycle.go | 14 +++++++------- pkg/worker/lifecycle_test.go | 10 +++++----- pkg/worker/thunder.go | 2 +- pkg/worker/thunder_test.go | 14 ++++++++------ pkg/worker/worker.go | 13 ++++++++++--- pkg/worker/worker_test.go | 16 ++++++++++++++++ 9 files changed, 51 insertions(+), 22 deletions(-) diff --git a/pkg/agent/agent_test.go b/pkg/agent/agent_test.go index dcfcd9363..bfe7219cf 100644 --- a/pkg/agent/agent_test.go +++ b/pkg/agent/agent_test.go @@ -324,6 +324,7 @@ func TestDockerRunArgsUsesConfigurableRouteTargetHost(t *testing.T) { NetworkPrefix: "10.0.0.0/24", NetworkSlotPoolSize: 64, ContainerStartConcurrency: 12, + PoolConfig: &pb.AgentPoolRuntimeConfig{GpuVirtualized: true}, }, agentWorkerDirs("/tmp/agent-state", "", "worker-one"), workerContainerResourceLimits{}) if !containsArg(args, "-e", types.WorkerRouteTargetEnv+"=host.docker.internal") { @@ -345,6 +346,7 @@ func TestDockerRunArgsUsesConfigurableRouteTargetHost(t *testing.T) { types.NvidiaVisibleDevicesEnv + "=0,1", types.WorkerStartConcurrencyEnv + "=12", types.WorkerNetworkSlotsEnv + "=64", + types.WorkerGPUVirtualizedEnv + "=true", } { if !containsArg(args, "-e", want) { t.Fatalf("expected %s env in docker args: %#v", want, args) diff --git a/pkg/agent/worker_container.go b/pkg/agent/worker_container.go index 8b594e60b..808c58339 100644 --- a/pkg/agent/worker_container.go +++ b/pkg/agent/worker_container.go @@ -97,6 +97,7 @@ func dockerRunArgs(name, image, imageID, configPath string, bootstrap bootstrapC types.WorkerMemoryEnv: strconv.FormatInt(slot.Memory, 10), types.WorkerGPUEnv: slot.Gpu, types.WorkerGPUCountEnv: strconv.FormatUint(uint64(slot.GpuCount), 10), + types.WorkerGPUVirtualizedEnv: strconv.FormatBool(slot.GetPoolConfig().GetGpuVirtualized()), types.WorkerMinimalConfigEnv: "true", types.WorkerPodHostEnv: types.LoopbackHost, types.WorkerPodIPEnv: types.LoopbackHost, diff --git a/pkg/types/agent_worker.go b/pkg/types/agent_worker.go index 6e5ef7b00..e85154538 100644 --- a/pkg/types/agent_worker.go +++ b/pkg/types/agent_worker.go @@ -127,6 +127,7 @@ const ( WorkerMemoryEnv = "MEMORY_LIMIT" WorkerGPUEnv = "GPU_TYPE" WorkerGPUCountEnv = "GPU_COUNT" + WorkerGPUVirtualizedEnv = "WORKER_GPU_VIRTUALIZED" // The agent's GPU assignment ("all" or a device list); unlike // NVIDIA_VISIBLE_DEVICES it survives container toolkit rewrites. WorkerGPUDevicesEnv = "WORKER_GPU_DEVICES" diff --git a/pkg/worker/lifecycle.go b/pkg/worker/lifecycle.go index 54942db7f..15e979059 100644 --- a/pkg/worker/lifecycle.go +++ b/pkg/worker/lifecycle.go @@ -295,7 +295,7 @@ func (s *Worker) RunContainer(ctx context.Context, request *types.ContainerReque caps := s.runtime.Capabilities() - if request.RequiresPhysicalGPU() && !caps.GPU { + if request.RequiresGPU() && !s.gpuVirtualizedForRequest(request) && !caps.GPU { return fmt.Errorf("runtime %s does not support GPU workloads", s.runtime.Name()) } @@ -310,7 +310,7 @@ func (s *Worker) RunContainer(ctx context.Context, request *types.ContainerReque } if request.Stub.Type.Kind() == types.StubTypeSandbox { instance.initializeProcessManagerReadiness() - if request.GpuVirtualized { + if s.gpuVirtualizedForRequest(request) { s.thunderSetupTracker.Begin(request.ContainerId) } } @@ -935,7 +935,7 @@ func (s *Worker) specFromRequest(request *types.ContainerRequest, options *Conta } s.enableVolumeCaching(request, volumeCacheMap, spec) - if request.RequiresGPU() && request.GpuVirtualized { + if request.RequiresGPU() && s.gpuVirtualizedForRequest(request) { spec.Mounts = s.gpuManagerForRequest(request).InjectMounts(spec.Mounts) } @@ -1256,7 +1256,7 @@ func (s *Worker) spawn(request *types.ContainerRequest, spec *specs.Spec, output // Virtualized GPU requests register with Thunder but never receive physical // device mounts, CDI devices, or NVIDIA_VISIBLE_DEVICES pinning. - if request.RequiresGPU() && (request.GpuVirtualized || s.runtime.Capabilities().GPU) { + if request.RequiresGPU() && (s.gpuVirtualizedForRequest(request) || s.runtime.Capabilities().GPU) { gpuManager := s.gpuManagerForRequest(request) phaseStart = time.Now() @@ -1268,7 +1268,7 @@ func (s *Worker) spawn(request *types.ContainerRequest, spec *specs.Spec, output return } - if request.RequiresPhysicalGPU() { + if request.RequiresGPU() && !s.gpuVirtualizedForRequest(request) { // Only use CDI if runtime supports it if s.runtime.Capabilities().CDI { cdiCache := cdi.GetDefaultCache() @@ -1446,7 +1446,7 @@ func (s *Worker) spawn(request *types.ContainerRequest, spec *specs.Spec, output return } - if request.GpuVirtualized { + if s.gpuVirtualizedForRequest(request) { if err := s.installThunderClient(ctx, request); err != nil { s.thunderSetupTracker.Complete(request.ContainerId, err) log.Error().Err(err).Str("container_id", request.ContainerId).Msg("failed to install Thunder client") @@ -1725,7 +1725,7 @@ func (s *Worker) runContainer(ctx context.Context, request *types.ContainerReque publishRuntimeStarted(pid) } - if request.Stub.Type.Kind() == types.StubTypeSandbox && request.GpuVirtualized { + if request.Stub.Type.Kind() == types.StubTypeSandbox && s.gpuVirtualizedForRequest(request) { select { case err := <-thunderInstallResult: if err != nil { diff --git a/pkg/worker/lifecycle_test.go b/pkg/worker/lifecycle_test.go index b4efd3295..aff83ce5f 100644 --- a/pkg/worker/lifecycle_test.go +++ b/pkg/worker/lifecycle_test.go @@ -524,14 +524,14 @@ func TestSpecFromRequestInjectsThunderMounts(t *testing.T) { worker := &Worker{ runtime: &mockRuntime{name: types.ContainerRuntimeGvisor.String()}, containerThunderManager: NewContainerThunderManager(nil), + gpuVirtualized: true, } spec, err := worker.specFromRequest(&types.ContainerRequest{ - ContainerId: "container-1", - EntryPoint: []string{"sleep", "60"}, - GpuRequest: []string{"H100"}, - GpuCount: 1, - GpuVirtualized: true, + ContainerId: "container-1", + EntryPoint: []string{"sleep", "60"}, + GpuRequest: []string{"H100"}, + GpuCount: 1, Stub: types.StubWithRelated{Stub: types.Stub{ Type: types.StubType(types.StubTypePodDeployment), }}, diff --git a/pkg/worker/thunder.go b/pkg/worker/thunder.go index 2823d4578..d43bcddbf 100644 --- a/pkg/worker/thunder.go +++ b/pkg/worker/thunder.go @@ -236,7 +236,7 @@ func thunderBindMount(path string) specs.Mount { } func (s *Worker) installThunderClient(ctx context.Context, request *types.ContainerRequest) error { - if s == nil || request == nil || !request.GpuVirtualized { + if s == nil || request == nil || !s.gpuVirtualizedForRequest(request) { return nil } manager, ok := s.containerThunderManager.(*ContainerThunderManager) diff --git a/pkg/worker/thunder_test.go b/pkg/worker/thunder_test.go index 88ca2d976..83883a7d4 100644 --- a/pkg/worker/thunder_test.go +++ b/pkg/worker/thunder_test.go @@ -104,7 +104,7 @@ func TestThunderAssignCreatesClientEnrollmentAndCachesInstallCommand(t *testing. createResp: &pb.CreateClientEnrollmentResponse{Ok: true, InstallCommand: "curl install thunder"}, } manager := NewContainerThunderManager(client) - request := &types.ContainerRequest{ContainerId: "container-123", GpuVirtualized: true} + request := &types.ContainerRequest{ContainerId: "container-123", GpuRequest: []string{"H100"}} assigned, err := manager.AssignGPUDevices(request) if err != nil { @@ -127,7 +127,7 @@ func TestThunderAssignReturnsGatewayError(t *testing.T) { createResp: &pb.CreateClientEnrollmentResponse{ErrorMsg: "gateway refused enrollment"}, }) - _, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container-123", GpuVirtualized: true}) + _, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container-123", GpuRequest: []string{"H100"}}) if err == nil { t.Fatal("expected Thunder enrollment error") } @@ -136,7 +136,7 @@ func TestThunderAssignReturnsGatewayError(t *testing.T) { func TestThunderAssignRequiresServiceClient(t *testing.T) { manager := NewContainerThunderManager(nil) - _, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container-123", GpuVirtualized: true}) + _, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container-123", GpuRequest: []string{"H100"}}) if err == nil { t.Fatal("expected missing Thunder client error") } @@ -147,7 +147,7 @@ func TestThunderAssignRequiresInstallCommand(t *testing.T) { manager := NewContainerThunderManager(&fakeThunderServiceClient{ createResp: &pb.CreateClientEnrollmentResponse{Ok: true}, }) - _, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container-123", GpuVirtualized: true}) + _, err := manager.AssignGPUDevices(&types.ContainerRequest{ContainerId: "container-123", GpuRequest: []string{"H100"}}) if err == nil { t.Fatal("expected missing install command error") } @@ -182,9 +182,10 @@ func TestInstallThunderClientExecutesCachedInstaller(t *testing.T) { worker := &Worker{ containerThunderManager: manager, containerInstances: instances, + gpuVirtualized: true, } - err := worker.installThunderClient(context.Background(), &types.ContainerRequest{ContainerId: "container-123", GpuVirtualized: true}) + err := worker.installThunderClient(context.Background(), &types.ContainerRequest{ContainerId: "container-123", GpuRequest: []string{"H100"}}) if err != nil { t.Fatal(err) } @@ -203,8 +204,9 @@ func TestInstallThunderClientRequiresCachedInstaller(t *testing.T) { worker := &Worker{ containerThunderManager: NewContainerThunderManager(nil), containerInstances: common.NewSafeMap[*ContainerInstance](), + gpuVirtualized: true, } - err := worker.installThunderClient(context.Background(), &types.ContainerRequest{ContainerId: "container-123", GpuVirtualized: true}) + err := worker.installThunderClient(context.Background(), &types.ContainerRequest{ContainerId: "container-123", GpuRequest: []string{"H100"}}) if err == nil || !strings.Contains(err.Error(), "install command") { t.Fatalf("installThunderClient() error = %v", err) } diff --git a/pkg/worker/worker.go b/pkg/worker/worker.go index f7dec8a0c..39aec2182 100644 --- a/pkg/worker/worker.go +++ b/pkg/worker/worker.go @@ -81,6 +81,7 @@ type Worker struct { memoryLimit int64 gpuType string gpuCount uint32 + gpuVirtualized bool podAddr string podHostName string routeLocalTargetHost string @@ -122,8 +123,12 @@ type Worker struct { config types.AppConfig } +func (w *Worker) gpuVirtualizedForRequest(request *types.ContainerRequest) bool { + return w != nil && w.gpuVirtualized && request != nil && request.RequiresGPU() +} + func (w *Worker) gpuManagerForRequest(request *types.ContainerRequest) GPUManager { - if request != nil && request.GpuVirtualized { + if w.gpuVirtualizedForRequest(request) { return w.containerThunderManager } return w.containerGPUManager @@ -256,6 +261,7 @@ func NewWorker() (_ *Worker, err error) { if err != nil { return nil, err } + gpuVirtualized := envBool(types.WorkerGPUVirtualizedEnv) configManager, err := common.NewConfigManager[types.AppConfig]() if err != nil { @@ -431,6 +437,7 @@ func NewWorker() (_ *Worker, err error) { memoryLimit: memoryLimit, gpuType: gpuType, gpuCount: uint32(gpuCount), + gpuVirtualized: gpuVirtualized, runtime: defaultRuntime, runcRuntime: runcRuntime, gvisorRuntime: gvisorRuntime, @@ -576,7 +583,7 @@ containerRequestStream: Str("container_id", request.ContainerId). Str("gpu", request.Gpu). Uint32("gpu_count", request.GpuCount). - Bool("gpu_virtualized", request.GpuVirtualized). + Bool("gpu_virtualized", s.gpuVirtualizedForRequest(request)). Msg("worker received container request") if !request.Timestamp.IsZero() { s.recordContainerLifecycle(s.ctx, request, containerLifecycleFromDuration(types.ContainerLifecycleWorkerQueueReceive, request, request.Timestamp, time.Since(request.Timestamp), true, map[string]string{ @@ -690,7 +697,7 @@ func (s *Worker) reserveContainerInstance(request *types.ContainerRequest) bool } if request.Stub.Type.Kind() == types.StubTypeSandbox { instance.initializeProcessManagerReadiness() - if request.GpuVirtualized { + if s.gpuVirtualizedForRequest(request) { s.thunderSetupTracker.Begin(request.ContainerId) } } diff --git a/pkg/worker/worker_test.go b/pkg/worker/worker_test.go index b167c17e2..d49a90bcf 100644 --- a/pkg/worker/worker_test.go +++ b/pkg/worker/worker_test.go @@ -19,6 +19,22 @@ import ( "google.golang.org/grpc" ) +func TestGpuManagerForRequestUsesWorkerVirtualizationFlag(t *testing.T) { + physical := &testGPUManager{} + thunder := &testGPUManager{} + worker := &Worker{ + gpuVirtualized: true, + containerGPUManager: physical, + containerThunderManager: thunder, + } + + require.Same(t, thunder, worker.gpuManagerForRequest(&types.ContainerRequest{GpuRequest: []string{"H100"}})) + require.Same(t, physical, worker.gpuManagerForRequest(&types.ContainerRequest{})) + + worker.gpuVirtualized = false + require.Same(t, physical, worker.gpuManagerForRequest(&types.ContainerRequest{GpuRequest: []string{"H100"}})) +} + type shutdownSignalRuntime struct { mockRuntime mu sync.Mutex From bcece0af1d60a7075e25be998daef8c918d2771b Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Thu, 6 Aug 2026 02:07:37 +0000 Subject: [PATCH 21/26] removed gpu_virtualized from client sdk --- docs/openapi/gateway.swagger.json | 6 +- pkg/abstractions/common/instance.go | 1 - pkg/abstractions/endpoint/instance.go | 1 - pkg/abstractions/function/task.go | 34 +- pkg/abstractions/pod/instance.go | 1 - pkg/abstractions/pod/pod.go | 2 - pkg/abstractions/shell/shell.go | 1 - pkg/abstractions/taskqueue/instance.go | 1 - pkg/gateway/gateway.proto | 2 +- pkg/gateway/services/compute/rentals.go | 1 - pkg/gateway/services/rollout.go | 23 +- pkg/gateway/services/rollout_test.go | 16 +- pkg/gateway/services/stub.go | 13 +- pkg/gateway/services/stub_test.go | 28 - pkg/types/backend.go | 13 +- pkg/types/scheduler.go | 7 - pkg/types/types.proto | 1 - proto/gateway.pb.go | 13 +- proto/types.pb.go | 626 +++++++++++----------- sdk/src/beta9/abstractions/base/runner.py | 3 - sdk/src/beta9/abstractions/pod.py | 5 - sdk/src/beta9/abstractions/sandbox.py | 5 - sdk/src/beta9/clients/gateway/__init__.py | 2 +- sdk/src/beta9/clients/types/__init__.py | 1 - 24 files changed, 359 insertions(+), 447 deletions(-) diff --git a/docs/openapi/gateway.swagger.json b/docs/openapi/gateway.swagger.json index f39655e4f..cb1828f57 100644 --- a/docs/openapi/gateway.swagger.json +++ b/docs/openapi/gateway.swagger.json @@ -2593,6 +2593,9 @@ }, "configGroup": { "type": "string" + }, + "gpuVirtualized": { + "type": "boolean" } } }, @@ -3831,9 +3834,6 @@ }, "checkpointTrigger": { "$ref": "#/definitions/typesCheckpointTrigger" - }, - "gpuVirtualized": { - "type": "boolean" } } }, diff --git a/pkg/abstractions/common/instance.go b/pkg/abstractions/common/instance.go index 75a8db31d..58b341fab 100644 --- a/pkg/abstractions/common/instance.go +++ b/pkg/abstractions/common/instance.go @@ -337,7 +337,6 @@ func (i *AutoscaledInstance) CheckConcurrencyLimit() error { request := &types.ContainerRequest{ Cpu: i.StubConfig.Runtime.Cpu, GpuCount: uint32(gpuCount), - GpuVirtualized: i.StubConfig.Runtime.GpuVirtualized, WorkspaceId: i.Workspace.ExternalId, Workspace: *i.Workspace, AllowMarketplace: i.StubConfig.AllowMarketplace, diff --git a/pkg/abstractions/endpoint/instance.go b/pkg/abstractions/endpoint/instance.go index 26e90a622..9f4a24dba 100644 --- a/pkg/abstractions/endpoint/instance.go +++ b/pkg/abstractions/endpoint/instance.go @@ -112,7 +112,6 @@ func (i *endpointInstance) startContainers(containersToRun int) error { Memory: i.StubConfig.Runtime.Memory, GpuRequest: gpuRequest, GpuCount: uint32(gpuCount), - GpuVirtualized: i.StubConfig.Runtime.GpuVirtualized, AppId: i.Stub.App.ExternalId, ImageId: i.StubConfig.Runtime.ImageId, StubId: i.Stub.ExternalId, diff --git a/pkg/abstractions/function/task.go b/pkg/abstractions/function/task.go index fb6854899..158feb1cc 100644 --- a/pkg/abstractions/function/task.go +++ b/pkg/abstractions/function/task.go @@ -47,7 +47,6 @@ func (t *FunctionTask) Execute(ctx context.Context, options ...interface{}) erro if err := t.fs.scheduler.CheckConcurrencyLimit(&types.ContainerRequest{ Cpu: cpu, GpuCount: uint32(gpuCount), - GpuVirtualized: stubConfig.Runtime.GpuVirtualized, WorkspaceId: stub.Workspace.ExternalId, Workspace: stub.Workspace, StubId: stub.ExternalId, @@ -205,23 +204,22 @@ func (t *FunctionTask) run(ctx context.Context, stub *types.StubWithRelated, tas } runRequest := &types.ContainerRequest{ - ContainerId: t.containerId, - Env: env, - Cpu: stubConfig.Runtime.Cpu, - Memory: stubConfig.Runtime.Memory, - GpuRequest: gpuRequest, - GpuCount: uint32(gpuCount), - GpuVirtualized: stubConfig.Runtime.GpuVirtualized, - ImageId: stubConfig.Runtime.ImageId, - StubId: stub.ExternalId, - TaskId: task.ExternalId, - AppId: stub.App.ExternalId, - WorkspaceId: stub.Workspace.ExternalId, - Workspace: stub.Workspace, - EntryPoint: []string{stubConfig.PythonVersion, "-m", "beta9.runner.function"}, - Mounts: mounts, - Stub: *stub, - PoolSelector: stubConfig.PoolSelector(), + ContainerId: t.containerId, + Env: env, + Cpu: stubConfig.Runtime.Cpu, + Memory: stubConfig.Runtime.Memory, + GpuRequest: gpuRequest, + GpuCount: uint32(gpuCount), + ImageId: stubConfig.Runtime.ImageId, + StubId: stub.ExternalId, + TaskId: task.ExternalId, + AppId: stub.App.ExternalId, + WorkspaceId: stub.Workspace.ExternalId, + Workspace: stub.Workspace, + EntryPoint: []string{stubConfig.PythonVersion, "-m", "beta9.runner.function"}, + Mounts: mounts, + Stub: *stub, + PoolSelector: stubConfig.PoolSelector(), } if err := abstractions.ConfigureContainerRequestNetwork(runRequest, stubConfig); err != nil { return err diff --git a/pkg/abstractions/pod/instance.go b/pkg/abstractions/pod/instance.go index a0252f76e..e961c08f7 100644 --- a/pkg/abstractions/pod/instance.go +++ b/pkg/abstractions/pod/instance.go @@ -144,7 +144,6 @@ func (i *podInstance) startContainers(containersToRun int) error { Memory: i.StubConfig.Runtime.Memory, GpuRequest: gpuRequest, GpuCount: uint32(gpuCount), - GpuVirtualized: i.StubConfig.Runtime.GpuVirtualized, ImageId: i.StubConfig.Runtime.ImageId, StubId: i.Stub.ExternalId, AppId: i.Stub.App.ExternalId, diff --git a/pkg/abstractions/pod/pod.go b/pkg/abstractions/pod/pod.go index 951a76ee8..d568d9620 100644 --- a/pkg/abstractions/pod/pod.go +++ b/pkg/abstractions/pod/pod.go @@ -477,7 +477,6 @@ func (s *GenericPodService) run(ctx context.Context, authInfo *auth.AuthInfo, st Str("gpu", stubConfig.Runtime.Gpu.String()). Strs("gpu_request", gpuRequest). Uint32("gpu_count", uint32(gpuCount)). - Bool("gpu_virtualized", stubConfig.Runtime.GpuVirtualized). Msg("pod service built sandbox run request from stub config") checkpointEnabled := stubConfig.CheckpointEnabled @@ -517,7 +516,6 @@ func (s *GenericPodService) run(ctx context.Context, authInfo *auth.AuthInfo, st Memory: stubConfig.Runtime.Memory, GpuRequest: gpuRequest, GpuCount: uint32(gpuCount), - GpuVirtualized: stubConfig.Runtime.GpuVirtualized, Mounts: mounts, Stub: *stub, ImageId: *imageId, diff --git a/pkg/abstractions/shell/shell.go b/pkg/abstractions/shell/shell.go index b7314b131..d458d1e21 100644 --- a/pkg/abstractions/shell/shell.go +++ b/pkg/abstractions/shell/shell.go @@ -562,7 +562,6 @@ func (ss *SSHShellService) CreateStandaloneShell(ctx context.Context, in *pb.Cre Memory: stubConfig.Runtime.Memory, GpuRequest: gpuRequest, GpuCount: uint32(gpuCount), - GpuVirtualized: stubConfig.Runtime.GpuVirtualized, ImageId: stubConfig.Runtime.ImageId, StubId: stub.ExternalId, AppId: "", diff --git a/pkg/abstractions/taskqueue/instance.go b/pkg/abstractions/taskqueue/instance.go index e82b8f1cc..95edbbe1f 100644 --- a/pkg/abstractions/taskqueue/instance.go +++ b/pkg/abstractions/taskqueue/instance.go @@ -93,7 +93,6 @@ func (i *taskQueueInstance) startContainers(containersToRun int) error { Memory: i.StubConfig.Runtime.Memory, GpuRequest: gpuRequest, GpuCount: uint32(gpuCount), - GpuVirtualized: i.StubConfig.Runtime.GpuVirtualized, ImageId: i.StubConfig.Runtime.ImageId, StubId: i.Stub.ExternalId, AppId: i.Stub.App.ExternalId, diff --git a/pkg/gateway/gateway.proto b/pkg/gateway/gateway.proto index 8a48484e0..7338a5775 100644 --- a/pkg/gateway/gateway.proto +++ b/pkg/gateway/gateway.proto @@ -738,7 +738,7 @@ message GetOrCreateStubRequest { repeated DurableDisk disks = 44; bool allow_marketplace = 45; types.CheckpointTrigger checkpoint_trigger = 46; - bool gpu_virtualized = 47; + reserved 47; } message GetOrCreateStubResponse { diff --git a/pkg/gateway/services/compute/rentals.go b/pkg/gateway/services/compute/rentals.go index d3f485fdc..6cfc797de 100644 --- a/pkg/gateway/services/compute/rentals.go +++ b/pkg/gateway/services/compute/rentals.go @@ -509,7 +509,6 @@ func (s *Service) rentalContainerRequest( Memory: stubConfig.Runtime.Memory, GpuRequest: []string{rental.GPU}, GpuCount: stubConfig.Runtime.GpuCount, - GpuVirtualized: stubConfig.Runtime.GpuVirtualized, ImageId: stubConfig.Runtime.ImageId, WorkspaceId: authInfo.Workspace.ExternalId, Workspace: *authInfo.Workspace, diff --git a/pkg/gateway/services/rollout.go b/pkg/gateway/services/rollout.go index 0b8da8e18..03018f72e 100644 --- a/pkg/gateway/services/rollout.go +++ b/pkg/gateway/services/rollout.go @@ -168,18 +168,17 @@ func rolloutContainerRequest(in deploymentRolloutInput) *types.ContainerRequest workspaceID = in.workspace.ExternalId } return &types.ContainerRequest{ - Cpu: in.config.Runtime.Cpu, - Memory: in.config.Runtime.Memory, - Gpu: string(in.config.Runtime.Gpu), - GpuRequest: types.GpuTypesToStrings(in.config.Runtime.Gpus), - GpuCount: in.config.Runtime.GpuCount, - GpuVirtualized: in.config.Runtime.GpuVirtualized, - ImageId: in.config.Runtime.ImageId, - StubId: in.stub.ExternalId, - WorkspaceId: workspaceID, - Stub: *in.stub, - PoolSelector: in.config.PoolSelector(), - MachineId: in.config.MachineID, + Cpu: in.config.Runtime.Cpu, + Memory: in.config.Runtime.Memory, + Gpu: string(in.config.Runtime.Gpu), + GpuRequest: types.GpuTypesToStrings(in.config.Runtime.Gpus), + GpuCount: in.config.Runtime.GpuCount, + ImageId: in.config.Runtime.ImageId, + StubId: in.stub.ExternalId, + WorkspaceId: workspaceID, + Stub: *in.stub, + PoolSelector: in.config.PoolSelector(), + MachineId: in.config.MachineID, } } diff --git a/pkg/gateway/services/rollout_test.go b/pkg/gateway/services/rollout_test.go index 59dbdbaed..811af73d4 100644 --- a/pkg/gateway/services/rollout_test.go +++ b/pkg/gateway/services/rollout_test.go @@ -10,23 +10,19 @@ import ( "github.com/beam-cloud/beta9/pkg/types" ) -func TestRolloutContainerRequestPropagatesGpuVirtualized(t *testing.T) { +func TestRolloutContainerRequestPropagatesGpuSchedulingFields(t *testing.T) { request := rolloutContainerRequest(deploymentRolloutInput{ workspace: &types.Workspace{ExternalId: "workspace-1"}, stub: &types.StubWithRelated{Stub: types.Stub{ExternalId: "stub-1"}}, config: &types.StubConfigV1{Runtime: types.Runtime{ - Cpu: 1_000, - Memory: 2_048, - Gpus: []types.GpuType{types.GPU_A10G}, - GpuCount: 1, - GpuVirtualized: true, - ImageId: "image-1", + Cpu: 1_000, + Memory: 2_048, + Gpus: []types.GpuType{types.GPU_A10G}, + GpuCount: 1, + ImageId: "image-1", }}, }) - if !request.GpuVirtualized { - t.Fatal("expected virtualized GPU flag to propagate") - } if request.GpuCount != 1 || len(request.GpuRequest) != 1 || request.GpuRequest[0] != string(types.GPU_A10G) { t.Fatalf("gpu scheduling fields = count %d request %v, want A10G x1", request.GpuCount, request.GpuRequest) } diff --git a/pkg/gateway/services/stub.go b/pkg/gateway/services/stub.go index 88528e978..15fc672e4 100644 --- a/pkg/gateway/services/stub.go +++ b/pkg/gateway/services/stub.go @@ -53,7 +53,6 @@ func (gws *GatewayService) GetOrCreateStub(ctx context.Context, in *pb.GetOrCrea Str("workspace_id", authInfo.Workspace.ExternalId). Strs("gpus", types.GpuTypesToStrings(gpus)). Uint32("gpu_count", in.GpuCount). - Bool("gpu_virtualized", in.GpuVirtualized). Msg("gateway received GetOrCreateStub request") keepWarmSeconds := normalizeKeepWarmSeconds(in.KeepWarmSeconds, types.StubType(in.StubType)) @@ -129,12 +128,11 @@ func (gws *GatewayService) GetOrCreateStub(ctx context.Context, in *pb.GetOrCrea stubConfig := types.StubConfigV1{ Runtime: types.Runtime{ - Cpu: in.Cpu, - Gpus: gpus, - GpuCount: in.GpuCount, - GpuVirtualized: in.GpuVirtualized, - Memory: in.Memory, - ImageId: in.ImageId, + Cpu: in.Cpu, + Gpus: gpus, + GpuCount: in.GpuCount, + Memory: in.Memory, + ImageId: in.ImageId, }, Handler: in.Handler, OnStart: in.OnStart, @@ -181,7 +179,6 @@ func (gws *GatewayService) GetOrCreateStub(ctx context.Context, in *pb.GetOrCrea Str("stub_type", in.StubType). Strs("gpus", types.GpuTypesToStrings(gpus)). Uint32("gpu_count", stubConfig.Runtime.GpuCount). - Bool("gpu_virtualized", stubConfig.Runtime.GpuVirtualized). Msg("gateway built stub config") if stubConfig.RequiresGPU() { diff --git a/pkg/gateway/services/stub_test.go b/pkg/gateway/services/stub_test.go index 83593ef99..1df8381ec 100644 --- a/pkg/gateway/services/stub_test.go +++ b/pkg/gateway/services/stub_test.go @@ -121,34 +121,6 @@ func (r *getOrCreateStubBackendRepo) GetOrCreateStub(ctx context.Context, name, return types.Stub{Id: 4, ExternalId: "stub-123", Name: name, Type: types.StubType(stubType), ObjectId: objectId, WorkspaceId: workspaceId, AppId: appId}, nil } -func TestGetOrCreateStubPersistsGpuVirtualizedRuntimeConfig(t *testing.T) { - backend := &getOrCreateStubBackendRepo{} - gws := &GatewayService{ - backendRepo: backend, - appConfig: types.AppConfig{GatewayService: types.GatewayServiceConfig{StubLimits: types.StubLimits{ - Cpu: 1000, - Memory: 1024, - MaxGpuCount: 1, - }}}, - } - ctx := auth.ContextWithAuthInfo(context.Background(), &auth.AuthInfo{Workspace: &types.Workspace{Id: 1, ExternalId: "workspace-1"}}) - - resp, err := gws.GetOrCreateStub(ctx, &pb.GetOrCreateStubRequest{ - Name: "sandbox", - StubType: types.StubTypeSandbox, - ObjectId: "object-123", - AppName: "app", - Cpu: 1000, - Memory: 1024, - GpuVirtualized: true, - }) - - require.NoError(t, err) - require.True(t, resp.Ok) - require.Equal(t, "stub-123", resp.StubId) - require.True(t, backend.stubConfig.Runtime.GpuVirtualized) -} - func TestConfigureDurableDiskPlacementDefaultsSnapshotDriver(t *testing.T) { config := &types.StubConfigV1{ Disks: []*pb.DurableDisk{{Name: "pg-data"}}, diff --git a/pkg/types/backend.go b/pkg/types/backend.go index 7c073f88c..818fd56a4 100644 --- a/pkg/types/backend.go +++ b/pkg/types/backend.go @@ -995,13 +995,12 @@ type Image struct { } type Runtime struct { - Cpu int64 `json:"cpu"` - Gpu GpuType `json:"gpu"` - GpuCount uint32 `json:"gpu_count"` - GpuVirtualized bool `json:"gpu_virtualized"` - Memory int64 `json:"memory"` - ImageId string `json:"image_id"` - Gpus []GpuType `json:"gpus"` + Cpu int64 `json:"cpu"` + Gpu GpuType `json:"gpu"` + GpuCount uint32 `json:"gpu_count"` + Memory int64 `json:"memory"` + ImageId string `json:"image_id"` + Gpus []GpuType `json:"gpus"` } // FilterFieldMapping represents a mapping between a client-provided field and diff --git a/pkg/types/scheduler.go b/pkg/types/scheduler.go index 15ed63a6f..a443a6199 100644 --- a/pkg/types/scheduler.go +++ b/pkg/types/scheduler.go @@ -290,7 +290,6 @@ type ContainerRequest struct { MachineId string `json:"machine_id,omitempty"` CheckpointTrigger *CheckpointTrigger `json:"checkpoint_trigger,omitempty"` TaskId string `json:"task_id,omitempty"` - GpuVirtualized bool `json:"gpu_virtualized"` DeliveryToken string `json:"-" go2proto:"ignore"` } @@ -346,10 +345,6 @@ func (c *ContainerRequest) RequiresGPU() bool { return c.Gpu != "" && c.Gpu != string(NO_GPU) } -func (c *ContainerRequest) RequiresPhysicalGPU() bool { - return c.RequiresGPU() && !c.GpuVirtualized -} - func WorkerStartConcurrencyForPool(poolConfig WorkerPoolConfig, globalRuntime, runtimeType string, workerCPU int64) int { if runtimeType == "" { runtimeType = poolConfig.ContainerRuntime @@ -605,7 +600,6 @@ func (c *ContainerRequest) ToProto() *pb.ContainerRequest { Gpu: c.Gpu, GpuRequest: c.GpuRequest, GpuCount: c.GpuCount, - GpuVirtualized: c.GpuVirtualized, ImageId: c.ImageId, Mounts: mounts, StubId: c.StubId, @@ -666,7 +660,6 @@ func NewContainerRequestFromProto(in *pb.ContainerRequest) *ContainerRequest { Gpu: in.Gpu, GpuRequest: in.GpuRequest, GpuCount: in.GpuCount, - GpuVirtualized: in.GpuVirtualized, ImageId: in.ImageId, Mounts: mounts, WorkspaceId: in.WorkspaceId, diff --git a/pkg/types/types.proto b/pkg/types/types.proto index ab0d7f6a7..41a7cb38f 100644 --- a/pkg/types/types.proto +++ b/pkg/types/types.proto @@ -112,7 +112,6 @@ message ContainerRequest { string machine_id = 34; CheckpointTrigger checkpoint_trigger = 35; string task_id = 36; - bool gpu_virtualized = 37; } message ContainerState { diff --git a/proto/gateway.pb.go b/proto/gateway.pb.go index 29c4c46c0..57d5402a8 100644 --- a/proto/gateway.pb.go +++ b/proto/gateway.pb.go @@ -2718,7 +2718,6 @@ type GetOrCreateStubRequest struct { Disks []*DurableDisk `protobuf:"bytes,44,rep,name=disks,proto3" json:"disks,omitempty"` AllowMarketplace bool `protobuf:"varint,45,opt,name=allow_marketplace,json=allowMarketplace,proto3" json:"allow_marketplace,omitempty"` CheckpointTrigger *CheckpointTrigger `protobuf:"bytes,46,opt,name=checkpoint_trigger,json=checkpointTrigger,proto3" json:"checkpoint_trigger,omitempty"` - GpuVirtualized bool `protobuf:"varint,47,opt,name=gpu_virtualized,json=gpuVirtualized,proto3" json:"gpu_virtualized,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -3068,13 +3067,6 @@ func (x *GetOrCreateStubRequest) GetCheckpointTrigger() *CheckpointTrigger { return nil } -func (x *GetOrCreateStubRequest) GetGpuVirtualized() bool { - if x != nil { - return x.GpuVirtualized - } - return false -} - type GetOrCreateStubResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` @@ -14450,7 +14442,7 @@ const file_gateway_proto_rawDesc = "" + "\x05value\x18\x02 \x01(\v2\x14.gateway.SchemaFieldR\x05value:\x028\x01\"J\n" + "\vSchemaField\x12\x12\n" + "\x04type\x18\x01 \x01(\tR\x04type\x12'\n" + - "\x06fields\x18\x02 \x01(\v2\x0f.gateway.SchemaR\x06fields\"\xed\f\n" + + "\x06fields\x18\x02 \x01(\v2\x0f.gateway.SchemaR\x06fields\"\xca\f\n" + "\x16GetOrCreateStubRequest\x12\x1b\n" + "\tobject_id\x18\x01 \x01(\tR\bobjectId\x12\x19\n" + "\bimage_id\x18\x02 \x01(\tR\aimageId\x12\x1b\n" + @@ -14506,8 +14498,7 @@ const file_gateway_proto_rawDesc = "" + "\aserving\x18+ \x01(\v2\x16.gateway.ServingConfigR\aserving\x12*\n" + "\x05disks\x18, \x03(\v2\x14.gateway.DurableDiskR\x05disks\x12+\n" + "\x11allow_marketplace\x18- \x01(\bR\x10allowMarketplace\x12G\n" + - "\x12checkpoint_trigger\x18. \x01(\v2\x18.types.CheckpointTriggerR\x11checkpointTrigger\x12'\n" + - "\x0fgpu_virtualized\x18/ \x01(\bR\x0egpuVirtualized\"\xfc\x01\n" + + "\x12checkpoint_trigger\x18. \x01(\v2\x18.types.CheckpointTriggerR\x11checkpointTriggerJ\x04\b/\x100\"\xfc\x01\n" + "\x17GetOrCreateStubResponse\x12\x0e\n" + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + "\astub_id\x18\x02 \x01(\tR\x06stubId\x12\x17\n" + diff --git a/proto/types.pb.go b/proto/types.pb.go index a553de890..4b6c57408 100644 --- a/proto/types.pb.go +++ b/proto/types.pb.go @@ -698,7 +698,6 @@ type ContainerRequest struct { MachineId string `protobuf:"bytes,34,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` CheckpointTrigger *CheckpointTrigger `protobuf:"bytes,35,opt,name=checkpoint_trigger,json=checkpointTrigger,proto3" json:"checkpoint_trigger,omitempty"` TaskId string `protobuf:"bytes,36,opt,name=task_id,json=taskId,proto3" json:"task_id,omitempty"` - GpuVirtualized bool `protobuf:"varint,37,opt,name=gpu_virtualized,json=gpuVirtualized,proto3" json:"gpu_virtualized,omitempty"` } func (x *ContainerRequest) Reset() { @@ -985,13 +984,6 @@ func (x *ContainerRequest) GetTaskId() string { return "" } -func (x *ContainerRequest) GetGpuVirtualized() bool { - if x != nil { - return x.GpuVirtualized - } - return false -} - type ContainerState struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2959,7 +2951,7 @@ var file_types_proto_rawDesc = []byte{ 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xfc, 0x0a, 0x0a, 0x10, 0x43, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xd3, 0x0a, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, @@ -3045,322 +3037,320 @@ var file_types_proto_rawDesc = []byte{ 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x12, 0x27, 0x0a, 0x0f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x67, 0x70, 0x75, 0x56, 0x69, - 0x72, 0x74, 0x75, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x22, 0xde, 0x02, 0x0a, 0x0e, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, - 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x22, 0x78, 0x0a, 0x16, 0x44, 0x75, - 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x6b, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1e, 0x0a, 0x0a, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x0a, 0x06, - 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x72, - 0x69, 0x76, 0x65, 0x72, 0x22, 0xda, 0x01, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x44, 0x69, 0x72, 0x12, 0x12, 0x0a, 0x04, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, - 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, - 0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x59, 0x0a, 0x0f, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x12, 0x2c, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x05, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x40, 0x0a, 0x12, + 0x22, 0xde, 0x02, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, + 0x03, 0x67, 0x70, 0x75, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, + 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x08, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x63, 0x70, 0x75, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, + 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, + 0x64, 0x22, 0x78, 0x0a, 0x16, 0x44, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x6b, + 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, + 0x69, 0x7a, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x22, 0xda, 0x01, 0x0a, 0x08, + 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, + 0x69, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, + 0x44, 0x69, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, + 0x6f, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, + 0x6f, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x70, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x59, 0x0a, 0x0f, 0x46, 0x69, 0x6c, 0x65, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x2c, 0x0a, 0x05, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x61, 0x6e, + 0x67, 0x65, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x40, 0x0a, 0x12, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0x6f, 0x0a, 0x0f, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0x6f, - 0x0a, 0x0f, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x12, 0x2b, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, - 0x58, 0x0a, 0x10, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x30, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x22, 0xa7, 0x02, 0x0a, 0x05, 0x4d, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x69, 0x6e, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1b, - 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x45, 0x0a, 0x12, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, - 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x10, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x40, 0x0a, 0x0c, 0x64, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x69, 0x73, - 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x6b, 0x4d, 0x6f, 0x75, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x64, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, - 0x69, 0x73, 0x6b, 0x22, 0xf3, 0x01, 0x0a, 0x10, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, - 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, - 0x28, 0x0a, 0x10, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x73, 0x74, - 0x79, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x50, 0x61, 0x74, 0x68, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x22, 0x50, 0x0a, 0x08, 0x4e, 0x75, 0x6c, - 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 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, - 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0xbf, 0x01, 0x0a, 0x06, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, - 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x06, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xb0, 0x01, - 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x22, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x5f, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x46, 0x6c, 0x69, - 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x73, 0x74, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x74, - 0x61, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x63, 0x6f, 0x73, 0x74, 0x50, - 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x38, 0x0a, 0x19, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, - 0x65, 0x72, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x73, 0x74, 0x50, - 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x73, - 0x22, 0x8c, 0x01, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, - 0x63, 0x6d, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x63, 0x6d, 0x64, 0x12, 0x10, - 0x0a, 0x03, 0x63, 0x77, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x63, 0x77, 0x64, - 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, - 0x6e, 0x76, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x22, - 0x83, 0x03, 0x0a, 0x04, 0x53, 0x74, 0x75, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, - 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, - 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, - 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x15, - 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0xa7, 0x01, 0x0a, 0x0f, 0x53, 0x74, 0x75, 0x62, 0x57, 0x69, - 0x74, 0x68, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x04, 0x73, 0x74, 0x75, - 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x53, 0x74, 0x75, 0x62, 0x52, 0x04, 0x73, 0x74, 0x75, 0x62, 0x12, 0x2e, 0x0a, 0x09, 0x77, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x12, 0x1c, 0x0a, 0x03, 0x61, 0x70, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x52, 0x03, 0x61, 0x70, 0x70, 0x22, - 0xcc, 0x06, 0x0a, 0x06, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x12, - 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x67, 0x70, 0x75, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x72, - 0x65, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x72, - 0x65, 0x65, 0x43, 0x70, 0x75, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x66, 0x72, 0x65, 0x65, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, - 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, - 0x66, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x67, 0x70, 0x75, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, - 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x73, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x50, - 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, - 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, - 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, - 0x65, 0x65, 0x6d, 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x69, - 0x6c, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3d, - 0x0a, 0x11, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x10, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x18, 0x0a, - 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x70, 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x29, 0x0a, 0x10, - 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, - 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, - 0x75, 0x74, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, - 0x74, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x77, 0x6f, - 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, - 0x69, 0x64, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x77, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x22, 0xe6, - 0x03, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, - 0x6e, 0x67, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x72, 0x65, - 0x65, 0x5f, 0x67, 0x70, 0x75, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x66, 0x72, 0x65, - 0x65, 0x47, 0x70, 0x75, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x63, 0x70, 0x75, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x72, 0x65, 0x65, 0x43, 0x70, 0x75, 0x12, - 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x66, 0x72, 0x65, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x77, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x70, 0x65, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x57, - 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x11, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x11, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x12, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, - 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x8f, 0x04, 0x0a, 0x09, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 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, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x05, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x65, - 0x79, 0x12, 0x30, 0x0a, 0x14, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, - 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x67, 0x70, 0x75, - 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x47, 0x70, 0x75, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, - 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x49, - 0x64, 0x12, 0x44, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, - 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x63, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x73, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x52, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x22, 0xd3, 0x02, 0x0a, 0x10, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, - 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, - 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x6f, 0x6e, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2b, 0x0a, 0x03, 0x65, 0x6e, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x46, + 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x58, 0x0a, 0x10, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x30, + 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x22, 0xa7, 0x02, 0x0a, 0x05, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x69, 0x6e, 0x6b, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x69, 0x6e, + 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, + 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, + 0x6c, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x45, 0x0a, 0x12, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x69, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x40, 0x0a, 0x0c, 0x64, 0x75, 0x72, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, + 0x73, 0x6b, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x64, + 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x6b, 0x22, 0xf3, 0x01, 0x0a, 0x10, 0x4d, + 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, - 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, + 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, - 0x0a, 0x0c, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, + 0x0a, 0x0c, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x72, - 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, + 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, + 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x53, 0x74, 0x79, 0x6c, 0x65, + 0x22, 0x50, 0x0a, 0x08, 0x4e, 0x75, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x04, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 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, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x22, 0xbf, 0x01, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, + 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 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, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x09, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, - 0x23, 0x5a, 0x21, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x65, - 0x61, 0x6d, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x62, 0x65, 0x74, 0x61, 0x39, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x64, 0x41, 0x74, 0x22, 0xb0, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, + 0x5f, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6d, + 0x61, 0x78, 0x49, 0x6e, 0x46, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, + 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x6f, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x6f, 0x73, + 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x0b, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x38, 0x0a, + 0x19, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x64, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x15, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, + 0x70, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x6d, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x63, 0x6d, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x77, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x63, 0x77, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x69, + 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, + 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x83, 0x03, 0x0a, 0x04, 0x53, 0x74, 0x75, 0x62, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x0a, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0xa7, 0x01, 0x0a, + 0x0f, 0x53, 0x74, 0x75, 0x62, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x1f, 0x0a, 0x04, 0x73, 0x74, 0x75, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x75, 0x62, 0x52, 0x04, 0x73, 0x74, 0x75, + 0x62, 0x12, 0x2e, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x25, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1c, 0x0a, 0x03, 0x61, 0x70, 0x70, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x70, + 0x70, 0x52, 0x03, 0x61, 0x70, 0x70, 0x22, 0xcc, 0x06, 0x0a, 0x06, 0x57, 0x6f, 0x72, 0x6b, 0x65, + 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x72, 0x65, 0x65, 0x43, 0x70, 0x75, 0x12, 0x1f, 0x0a, 0x0b, + 0x66, 0x72, 0x65, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0a, 0x66, 0x72, 0x65, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x24, 0x0a, + 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, + 0x64, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x20, + 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x65, 0x6d, 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x11, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x52, 0x10, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, + 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, + 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x2d, + 0x0a, 0x12, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x6f, 0x6c, 0x6c, + 0x6f, 0x75, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, + 0x15, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x6f, + 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x13, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x76, 0x65, + 0x72, 0x72, 0x69, 0x64, 0x65, 0x22, 0xe6, 0x03, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, + 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x5f, + 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, + 0x12, 0x19, 0x0a, 0x08, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x07, 0x66, 0x72, 0x65, 0x65, 0x47, 0x70, 0x75, 0x12, 0x19, 0x0a, 0x08, 0x66, + 0x72, 0x65, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, + 0x72, 0x65, 0x65, 0x43, 0x70, 0x75, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x66, 0x72, 0x65, + 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0e, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, + 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x77, 0x6f, + 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, + 0x12, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x12, + 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, + 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0d, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x8f, + 0x04, 0x0a, 0x09, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x04, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 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, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x69, + 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x69, + 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x47, 0x70, 0x75, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, + 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x49, 0x64, 0x12, 0x44, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x10, 0x63, 0x6f, + 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x31, 0x0a, + 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x22, 0xd3, 0x02, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, + 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 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, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x23, 0x5a, 0x21, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x65, 0x61, 0x6d, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, + 0x62, 0x65, 0x74, 0x61, 0x39, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/sdk/src/beta9/abstractions/base/runner.py b/sdk/src/beta9/abstractions/base/runner.py index e8ae918aa..c055db55f 100644 --- a/sdk/src/beta9/abstractions/base/runner.py +++ b/sdk/src/beta9/abstractions/base/runner.py @@ -110,7 +110,6 @@ def __init__( gpu: Union[GpuTypeAlias, List[GpuTypeAlias]] = GpuType.NoGPU, gpu_count: int = 0, image: Image = Image(), - gpu_virtualized: bool = False, workers: int = 1, concurrent_requests: int = 1, keep_warm_seconds: float = 0.0, @@ -200,7 +199,6 @@ def __init__( self.checkpoint_readiness_timeout = checkpoint_readiness_timeout self.checkpoint_readiness_interval = checkpoint_readiness_interval self.docker_enabled = docker_enabled - self.gpu_virtualized = gpu_virtualized self.allow_marketplace = allow_marketplace self.is_service = False self.serving = ServingConfig.from_options( @@ -719,7 +717,6 @@ def _stub_request( memory=self.memory, gpu=self.gpu, gpu_count=self.gpu_count, - gpu_virtualized=self.gpu_virtualized, handler=self.handler, on_start=self.on_start, on_deploy=self.on_deploy.parent.handler if self.on_deploy else "", diff --git a/sdk/src/beta9/abstractions/pod.py b/sdk/src/beta9/abstractions/pod.py index 7689d001a..15d5c76b5 100644 --- a/sdk/src/beta9/abstractions/pod.py +++ b/sdk/src/beta9/abstractions/pod.py @@ -145,9 +145,6 @@ class Pod(RunnerAbstraction, DeployableMixin): gpu_count (int): The number of GPUs allocated to the pod. Default is 0. If a GPU is specified but this value is set to 0, it will be automatically updated to 1. - gpu_virtualized (bool): - If true, preserve GPU scheduling and image selection but do not expose physical GPU devices - inside the container. Default is False. image (Union[Image, dict]): The container image used for the task execution. Default is [Image](#image). volumes (Optional[List[Union[Volume, CloudBucket]]]): @@ -188,7 +185,6 @@ def __init__( gpu: Union[GpuTypeAlias, List[GpuTypeAlias]] = GpuType.NoGPU, gpu_count: int = 0, image: Image = Image(), - gpu_virtualized: bool = False, volumes: Optional[List[Union[Volume, CloudBucket]]] = None, disks: Optional[List[DurableDisk]] = None, secrets: Optional[List[str]] = None, @@ -216,7 +212,6 @@ def __init__( memory=memory, gpu=gpu, gpu_count=gpu_count, - gpu_virtualized=gpu_virtualized, image=image, volumes=volumes, disks=disks, diff --git a/sdk/src/beta9/abstractions/sandbox.py b/sdk/src/beta9/abstractions/sandbox.py index f599f4f15..e03e1b8a2 100644 --- a/sdk/src/beta9/abstractions/sandbox.py +++ b/sdk/src/beta9/abstractions/sandbox.py @@ -151,9 +151,6 @@ class Sandbox(Pod): applicable or no GPU required, leave it empty. Default is [GpuType.NoGPU](#gputype). gpu_count (int): The number of GPUs to allocate. Default is 0. - gpu_virtualized (bool): - If true, preserve GPU scheduling and image selection but do not expose physical GPU devices - inside the sandbox. Default is False. image (Union[Image, dict]): The container image used for the task execution. Whatever you pass here will have an additional `add_python_packages` call with `["fastapi", "vllm", "huggingface_hub"]` added to it to ensure that we can run vLLM in the container. @@ -238,7 +235,6 @@ def __init__( gpu: Union[GpuTypeAlias, List[GpuTypeAlias]] = GpuType.NoGPU, gpu_count: int = 0, image: Image = Image(python_version="python3.11"), - gpu_virtualized: bool = False, keep_warm_seconds: int = 600, authorized: bool = False, name: Optional[str] = None, @@ -265,7 +261,6 @@ def __init__( memory=memory, gpu=gpu, gpu_count=gpu_count, - gpu_virtualized=gpu_virtualized, image=image, keep_warm_seconds=keep_warm_seconds, authorized=authorized, diff --git a/sdk/src/beta9/clients/gateway/__init__.py b/sdk/src/beta9/clients/gateway/__init__.py index 7129f0316..a64cff45b 100644 --- a/sdk/src/beta9/clients/gateway/__init__.py +++ b/sdk/src/beta9/clients/gateway/__init__.py @@ -400,7 +400,6 @@ class GetOrCreateStubRequest(betterproto.Message): disks: List["DurableDisk"] = betterproto.message_field(44) allow_marketplace: bool = betterproto.bool_field(45) checkpoint_trigger: "_types__.CheckpointTrigger" = betterproto.message_field(46) - gpu_virtualized: bool = betterproto.bool_field(47) @dataclass(eq=False, repr=False) @@ -1808,6 +1807,7 @@ class AgentPoolRuntimeConfig(betterproto.Message): durable_disks_path: str = betterproto.string_field(7) cache: "AgentPoolCacheConfig" = betterproto.message_field(8) config_group: str = betterproto.string_field(9) + gpu_virtualized: bool = betterproto.bool_field(10) class GatewayServiceStub(SyncServiceStub): diff --git a/sdk/src/beta9/clients/types/__init__.py b/sdk/src/beta9/clients/types/__init__.py index d1cbb43a5..50df72f5a 100644 --- a/sdk/src/beta9/clients/types/__init__.py +++ b/sdk/src/beta9/clients/types/__init__.py @@ -122,7 +122,6 @@ class ContainerRequest(betterproto.Message): machine_id: str = betterproto.string_field(34) checkpoint_trigger: "CheckpointTrigger" = betterproto.message_field(35) task_id: str = betterproto.string_field(36) - gpu_virtualized: bool = betterproto.bool_field(37) @dataclass(eq=False, repr=False) From c410af75364f4bab99f899dfc9be352b49530718 Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Fri, 7 Aug 2026 06:31:16 +0000 Subject: [PATCH 22/26] integrated thunder sdk with gateway --- go.mod | 3 + pkg/gateway/gateway.go | 1 - pkg/gateway/services/thunder/client.go | 271 ------------------- pkg/gateway/services/thunder/client_test.go | 170 ------------ pkg/gateway/services/thunder/service.go | 54 ++-- pkg/gateway/services/thunder/service_test.go | 178 +++++------- 6 files changed, 94 insertions(+), 583 deletions(-) delete mode 100644 pkg/gateway/services/thunder/client.go delete mode 100644 pkg/gateway/services/thunder/client_test.go diff --git a/go.mod b/go.mod index 8b502bf03..3becc70bf 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.25.0 require ( github.com/DATA-DOG/go-sqlmock v1.5.2 github.com/Masterminds/squirrel v1.5.4 + github.com/Thunder-Compute/thunder-sdk v0.1.0 github.com/VictoriaMetrics/metrics v1.37.0 github.com/alicebob/miniredis/v2 v2.30.5 github.com/aws/aws-sdk-go-v2 v1.31.0 @@ -326,3 +327,5 @@ replace github.com/aws/aws-sdk-go => github.com/beam-cloud/geesefs/s3ext v0.0.0- replace github.com/winfsp/cgofuse => github.com/vitalif/cgofuse v0.0.0-20230609211427-22e8fa44f6b8 replace github.com/jacobsa/fuse => github.com/beam-cloud/gofuse v0.0.0-20260720132319-1a907975017e + +replace github.com/Thunder-Compute/thunder-sdk => ../../thunder-sdk diff --git a/pkg/gateway/gateway.go b/pkg/gateway/gateway.go index 4b394c256..a6e755497 100644 --- a/pkg/gateway/gateway.go +++ b/pkg/gateway/gateway.go @@ -398,7 +398,6 @@ func (g *Gateway) registerServices() error { // Register Thunder service ts, err := thundersvc.NewService(thundersvc.ServiceOpts{ RedisClient: g.RedisClient, - Client: thundersvc.NewClientFromEnv(nil), ContainerRepo: g.ContainerRepo, WorkerRepo: g.workerRepo, AgentStateValidator: g.ComputeService, diff --git a/pkg/gateway/services/thunder/client.go b/pkg/gateway/services/thunder/client.go deleted file mode 100644 index d59c69509..000000000 --- a/pkg/gateway/services/thunder/client.go +++ /dev/null @@ -1,271 +0,0 @@ -package thunder - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "os" - "strings" - "time" - - "github.com/beam-cloud/beta9/pkg/common" -) - -const ( - thunderAPIURLEnv = "THUNDER_API_URL" - thunderAPITokenEnv = "THUNDER_API_TOKEN" - thunderEnrollmentTokenPath = "/api/v1/enrollment-tokens" - thunderZonesPath = "/api/v1/zones" - - thunderEnrollmentRoleClient = "client" - thunderEnrollmentRoleServer = "server" -) - -type Client struct { - apiURL string - apiToken string - httpClient *http.Client -} - -type Zone struct { - ZoneID string `json:"zoneId"` - OrgID string `json:"orgId"` - DisplayName string `json:"displayName"` -} - -type EnrollmentToken struct { - EnrollmentTokenID string `json:"enrollmentTokenId"` - EnrollmentToken string `json:"enrollmentToken"` - OrgID string `json:"orgId"` - ZoneID string `json:"zoneId"` - Role string `json:"role"` - GPUType string `json:"gpuType"` - GPUCount int `json:"gpuCount"` - ExpiresAt time.Time `json:"expiresAt"` -} - -type DeleteEnrollmentTokenNodeResponse struct { - EnrollmentTokenID string `json:"enrollmentTokenId"` - Role string `json:"role"` - ClientID string `json:"clientId"` - HostID string `json:"hostId"` - NodeDeleted bool `json:"nodeDeleted"` - DeletedAt time.Time `json:"deletedAt"` -} - -type ThunderError struct { - StatusCode int - ErrorCode string - Message string - Code int -} - -func (e *ThunderError) Error() string { - if e == nil { - return "Thunder API error" - } - parts := []string{fmt.Sprintf("Thunder API returned status %d", e.StatusCode)} - if e.ErrorCode != "" { - parts = append(parts, e.ErrorCode) - } - if e.Message != "" { - parts = append(parts, e.Message) - } - return strings.Join(parts, ": ") -} - -func NewClientFromEnv(httpClient *http.Client) *Client { - return NewClient(os.Getenv(thunderAPIURLEnv), os.Getenv(thunderAPITokenEnv), httpClient) -} - -func NewClient(apiURL, apiToken string, httpClient *http.Client) *Client { - if httpClient == nil { - httpClient = &http.Client{Timeout: 10 * time.Second} - } - return &Client{ - apiURL: strings.TrimRight(strings.TrimSpace(apiURL), "/"), - apiToken: strings.TrimSpace(apiToken), - httpClient: httpClient, - } -} - -func (c *Client) ClientInstallCommand(enrollmentToken string) (string, error) { - if c == nil { - return "", fmt.Errorf("Thunder client is required") - } - if c.apiURL == "" { - return "", fmt.Errorf("%s is required", thunderAPIURLEnv) - } - enrollmentToken = strings.TrimSpace(enrollmentToken) - if enrollmentToken == "" { - return "", fmt.Errorf("Thunder enrollment token is required") - } - return "curl -fsSL https://get.thundercompute.com/install.sh | sudo THUNDER_NOWARN=1 THUNDER_INSTALL_MODE=client THUNDER_CENTRAL_URL=" + common.ShellQuote(c.apiURL) + " THUNDER_ENROLLMENT_TOKEN=" + common.ShellQuote(enrollmentToken) + " sh", nil -} - -func (c *Client) CreateZone(ctx context.Context, displayName string) (*Zone, error) { - var response Zone - payload := createZoneRequest{DisplayName: strings.TrimSpace(displayName)} - if err := c.do(ctx, http.MethodPost, thunderZonesPath, payload, &response); err != nil { - return nil, err - } - return &response, nil -} - -func (c *Client) DeleteZone(ctx context.Context, zoneID string) error { - zoneID = strings.TrimSpace(zoneID) - if zoneID == "" { - return fmt.Errorf("Thunder zone id is required") - } - return c.do(ctx, http.MethodDelete, "/api/v1/zones/"+url.PathEscape(zoneID), nil, nil) -} - -func (c *Client) CreateClientEnrollmentToken(ctx context.Context, zoneID, gpuType string, gpuCount int) (*EnrollmentToken, error) { - zoneID = strings.TrimSpace(zoneID) - gpuType = strings.TrimSpace(gpuType) - if zoneID == "" { - return nil, fmt.Errorf("Thunder zone id is required") - } - if gpuType == "" { - return nil, fmt.Errorf("Thunder GPU type is required for client enrollment") - } - if gpuCount <= 0 { - return nil, fmt.Errorf("Thunder GPU count must be greater than zero for client enrollment") - } - return c.createEnrollmentToken(ctx, createEnrollmentTokenRequest{ - ZoneID: zoneID, - Role: thunderEnrollmentRoleClient, - GPUType: gpuType, - GPUCount: gpuCount, - }) -} - -func (c *Client) CreateServerEnrollmentToken(ctx context.Context, zoneID string) (*EnrollmentToken, error) { - zoneID = strings.TrimSpace(zoneID) - if zoneID == "" { - return nil, fmt.Errorf("Thunder zone id is required") - } - return c.createEnrollmentToken(ctx, createEnrollmentTokenRequest{ - ZoneID: zoneID, - Role: thunderEnrollmentRoleServer, - }) -} - -func (c *Client) DeleteEnrollmentTokenNode(ctx context.Context, enrollmentTokenID string) (*DeleteEnrollmentTokenNodeResponse, error) { - enrollmentTokenID = strings.TrimSpace(enrollmentTokenID) - if enrollmentTokenID == "" { - return nil, fmt.Errorf("Thunder enrollment token id is required") - } - var response DeleteEnrollmentTokenNodeResponse - path := fmt.Sprintf("/api/v1/enrollment-tokens/%s/node", url.PathEscape(enrollmentTokenID)) - if err := c.do(ctx, http.MethodDelete, path, nil, &response); err != nil { - return nil, err - } - return &response, nil -} - -func (c *Client) createEnrollmentToken(ctx context.Context, payload createEnrollmentTokenRequest) (*EnrollmentToken, error) { - var response EnrollmentToken - if err := c.do(ctx, http.MethodPost, thunderEnrollmentTokenPath, payload, &response); err != nil { - return nil, err - } - return &response, nil -} - -func (c *Client) do(ctx context.Context, method, path string, payload any, response any) error { - if c == nil { - return fmt.Errorf("Thunder client is required") - } - if c.apiURL == "" { - return fmt.Errorf("%s is required", thunderAPIURLEnv) - } - if c.apiToken == "" { - return fmt.Errorf("%s is required", thunderAPITokenEnv) - } - endpoint, err := thunderEndpoint(c.apiURL, path) - if err != nil { - return err - } - - var body io.Reader - if payload != nil { - buf := &bytes.Buffer{} - if err := json.NewEncoder(buf).Encode(payload); err != nil { - return err - } - body = buf - } - - req, err := http.NewRequestWithContext(ctx, method, endpoint, body) - if err != nil { - return err - } - req.Header.Set("Authorization", "Bearer "+c.apiToken) - if payload != nil { - req.Header.Set("Content-Type", "application/json") - } - if response != nil { - req.Header.Set("Accept", "application/json") - } - - resp, err := c.httpClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - if resp.StatusCode < http.StatusOK || resp.StatusCode >= http.StatusMultipleChoices { - return decodeThunderError(resp) - } - if response == nil || resp.StatusCode == http.StatusNoContent { - return nil - } - return json.NewDecoder(resp.Body).Decode(response) -} - -func decodeThunderError(resp *http.Response) error { - apiErr := &ThunderError{StatusCode: resp.StatusCode} - var payload thunderErrorPayload - if err := json.NewDecoder(resp.Body).Decode(&payload); err == nil { - apiErr.ErrorCode = payload.Error - apiErr.Message = payload.Message - apiErr.Code = payload.Code - } - return apiErr -} - -func thunderEndpoint(apiURL, path string) (string, error) { - base := strings.TrimRight(strings.TrimSpace(apiURL), "/") - parsed, err := url.Parse(base) - if err != nil { - return "", err - } - if parsed.Scheme == "" || parsed.Host == "" { - return "", fmt.Errorf("invalid Thunder API URL %q", apiURL) - } - if !strings.HasPrefix(path, "/") { - path = "/" + path - } - return base + path, nil -} - -type createZoneRequest struct { - DisplayName string `json:"displayName,omitempty"` -} - -type createEnrollmentTokenRequest struct { - ZoneID string `json:"zoneId"` - Role string `json:"role"` - GPUType string `json:"gpuType,omitempty"` - GPUCount int `json:"gpuCount,omitempty"` -} - -type thunderErrorPayload struct { - Error string `json:"error"` - Message string `json:"message"` - Code int `json:"code"` -} diff --git a/pkg/gateway/services/thunder/client_test.go b/pkg/gateway/services/thunder/client_test.go deleted file mode 100644 index 146ae42f8..000000000 --- a/pkg/gateway/services/thunder/client_test.go +++ /dev/null @@ -1,170 +0,0 @@ -package thunder - -import ( - "context" - "encoding/json" - "errors" - "net/http" - "net/http/httptest" - "strings" - "testing" -) - -func TestClientCreateZone(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodPost || r.URL.Path != thunderZonesPath { - t.Fatalf("request = %s %s", r.Method, r.URL.Path) - } - if got := r.Header.Get("Authorization"); got != "Bearer central-token" { - t.Fatalf("authorization = %q", got) - } - var payload createZoneRequest - if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { - t.Fatal(err) - } - if payload.DisplayName != "workspace-pool" { - t.Fatalf("displayName = %q", payload.DisplayName) - } - _ = json.NewEncoder(w).Encode(Zone{ZoneID: "zone-1", OrgID: "org-1", DisplayName: payload.DisplayName}) - })) - defer server.Close() - - client := NewClient(server.URL, "central-token", server.Client()) - zone, err := client.CreateZone(context.Background(), " workspace-pool ") - if err != nil { - t.Fatalf("CreateZone() error = %v", err) - } - if zone.ZoneID != "zone-1" || zone.DisplayName != "workspace-pool" { - t.Fatalf("zone = %+v", zone) - } -} - -func TestClientPreservesAPIURLPathPrefix(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.Path != "/central/api/v1/zones" { - t.Fatalf("path = %q", r.URL.Path) - } - _ = json.NewEncoder(w).Encode(Zone{ZoneID: "zone-1"}) - })) - defer server.Close() - - client := NewClient(server.URL+"/central", "central-token", server.Client()) - if _, err := client.CreateZone(context.Background(), ""); err != nil { - t.Fatalf("CreateZone() error = %v", err) - } -} - -func TestClientCreateClientEnrollmentToken(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodPost || r.URL.Path != thunderEnrollmentTokenPath { - t.Fatalf("request = %s %s", r.Method, r.URL.Path) - } - if got := r.Header.Get("Authorization"); got != "Bearer central-token" { - t.Fatalf("authorization = %q", got) - } - payload := map[string]any{} - if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { - t.Fatal(err) - } - if payload["zoneId"] != "zone-1" || payload["role"] != thunderEnrollmentRoleClient || payload["gpuType"] != "h100" || payload["gpuCount"] != float64(2) { - t.Fatalf("payload = %+v", payload) - } - _ = json.NewEncoder(w).Encode(EnrollmentToken{EnrollmentTokenID: "token-id", EnrollmentToken: "tr_secret", ZoneID: "zone-1", Role: thunderEnrollmentRoleClient, GPUType: "h100", GPUCount: 2}) - })) - defer server.Close() - - client := NewClient(server.URL, "central-token", server.Client()) - token, err := client.CreateClientEnrollmentToken(context.Background(), "zone-1", " h100 ", 2) - if err != nil { - t.Fatalf("CreateClientEnrollmentToken() error = %v", err) - } - if token.EnrollmentTokenID != "token-id" || token.EnrollmentToken != "tr_secret" { - t.Fatalf("token = %+v", token) - } -} - -func TestClientCreateServerEnrollmentTokenOmitsGPUFields(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - payload := map[string]any{} - if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { - t.Fatal(err) - } - if payload["zoneId"] != "zone-1" || payload["role"] != thunderEnrollmentRoleServer { - t.Fatalf("payload = %+v", payload) - } - if _, ok := payload["gpuType"]; ok { - t.Fatalf("server enrollment payload included gpuType: %+v", payload) - } - if _, ok := payload["gpuCount"]; ok { - t.Fatalf("server enrollment payload included gpuCount: %+v", payload) - } - _ = json.NewEncoder(w).Encode(EnrollmentToken{EnrollmentTokenID: "server-token", EnrollmentToken: "tr_server", ZoneID: "zone-1", Role: thunderEnrollmentRoleServer}) - })) - defer server.Close() - - client := NewClient(server.URL, "central-token", server.Client()) - token, err := client.CreateServerEnrollmentToken(context.Background(), "zone-1") - if err != nil { - t.Fatalf("CreateServerEnrollmentToken() error = %v", err) - } - if token.Role != thunderEnrollmentRoleServer || token.EnrollmentTokenID != "server-token" { - t.Fatalf("token = %+v", token) - } -} - -func TestClientDeleteEnrollmentTokenNode(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodDelete || r.URL.Path != "/api/v1/enrollment-tokens/token-1/node" { - t.Fatalf("request = %s %s", r.Method, r.URL.Path) - } - if got := r.Header.Get("Authorization"); got != "Bearer central-token" { - t.Fatalf("authorization = %q", got) - } - _ = json.NewEncoder(w).Encode(DeleteEnrollmentTokenNodeResponse{EnrollmentTokenID: "token-1", Role: thunderEnrollmentRoleClient, NodeDeleted: true}) - })) - defer server.Close() - - client := NewClient(server.URL, "central-token", server.Client()) - resp, err := client.DeleteEnrollmentTokenNode(context.Background(), "token-1") - if err != nil { - t.Fatalf("DeleteEnrollmentTokenNode() error = %v", err) - } - if !resp.NodeDeleted || resp.EnrollmentTokenID != "token-1" { - t.Fatalf("response = %+v", resp) - } -} - -func TestClientDecodesThunderError(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusForbidden) - _ = json.NewEncoder(w).Encode(thunderErrorPayload{Error: "forbidden", Message: "API token is not allowed to create zones", Code: 403}) - })) - defer server.Close() - - client := NewClient(server.URL, "central-token", server.Client()) - _, err := client.CreateZone(context.Background(), "pool") - if err == nil { - t.Fatal("CreateZone() unexpectedly succeeded") - } - var thunderErr *ThunderError - if !errors.As(err, &thunderErr) { - t.Fatalf("error type = %T, want *ThunderError", err) - } - if thunderErr.StatusCode != http.StatusForbidden || thunderErr.ErrorCode != "forbidden" || !strings.Contains(thunderErr.Message, "not allowed") { - t.Fatalf("ThunderError = %+v", thunderErr) - } -} - -func TestClientValidatesRequiredConfig(t *testing.T) { - client := NewClient("", "", nil) - _, err := client.CreateZone(context.Background(), "pool") - if err == nil || !strings.Contains(err.Error(), thunderAPIURLEnv) { - t.Fatalf("CreateZone() error = %v", err) - } - - client = NewClient("https://central.example", "", nil) - _, err = client.CreateZone(context.Background(), "pool") - if err == nil || !strings.Contains(err.Error(), thunderAPITokenEnv) { - t.Fatalf("CreateZone() error = %v", err) - } -} diff --git a/pkg/gateway/services/thunder/service.go b/pkg/gateway/services/thunder/service.go index 76b40db1f..eadfd67a2 100644 --- a/pkg/gateway/services/thunder/service.go +++ b/pkg/gateway/services/thunder/service.go @@ -2,11 +2,11 @@ package thunder import ( "context" - "errors" "fmt" - "net/http" + "os" "strings" + thundersdk "github.com/Thunder-Compute/thunder-sdk" "github.com/beam-cloud/beta9/pkg/auth" "github.com/beam-cloud/beta9/pkg/common" model "github.com/beam-cloud/beta9/pkg/compute" @@ -16,14 +16,6 @@ import ( "github.com/rs/zerolog/log" ) -type ThunderClient interface { - CreateZone(ctx context.Context, displayName string) (*Zone, error) - CreateClientEnrollmentToken(ctx context.Context, zoneID, gpuType string, gpuCount int) (*EnrollmentToken, error) - CreateServerEnrollmentToken(ctx context.Context, zoneID string) (*EnrollmentToken, error) - DeleteEnrollmentTokenNode(ctx context.Context, enrollmentTokenID string) (*DeleteEnrollmentTokenNodeResponse, error) - ClientInstallCommand(enrollmentToken string) (string, error) -} - type AgentStateValidator interface { ResolveAgentState(ctx context.Context, agentToken string) (*model.AgentTokenState, error) } @@ -31,7 +23,7 @@ type AgentStateValidator interface { type ServiceOpts struct { Repository Repository RedisClient *common.RedisClient - Client ThunderClient + Client *thundersdk.Client ContainerRepo repository.ContainerRepository WorkerRepo repository.WorkerRepository AgentStateValidator AgentStateValidator @@ -41,7 +33,7 @@ type Service struct { pb.UnimplementedThunderServiceServer repo Repository - client ThunderClient + client *thundersdk.Client containerRepo repository.ContainerRepository workerRepo repository.WorkerRepository agentValidator AgentStateValidator @@ -58,7 +50,7 @@ func NewService(opts ServiceOpts) (*Service, error) { client := opts.Client if client == nil { - client = NewClientFromEnv(nil) + client = thundersdk.NewClient(os.Getenv("THUNDER_API_URL"), os.Getenv("THUNDER_API_TOKEN")) } if client == nil { return nil, fmt.Errorf("Thunder client is required") @@ -110,17 +102,14 @@ func (s *Service) CreateClientEnrollment(ctx context.Context, req *pb.CreateClie return err } - enrollment, err := s.client.CreateClientEnrollmentToken(ctx, zoneID, attrs.gpuType, attrs.gpuCount) + enrollment, err := s.client.CreateClientEnrollment(ctx, thundersdk.CreateClientEnrollmentRequest{ZoneID: zoneID, GPUType: attrs.gpuType, GPUCount: uint64(attrs.gpuCount)}) if err != nil { return err } - if enrollment == nil || strings.TrimSpace(enrollment.EnrollmentTokenID) == "" || strings.TrimSpace(enrollment.EnrollmentToken) == "" { + if strings.TrimSpace(enrollment.EnrollmentTokenID) == "" || strings.TrimSpace(enrollment.EnrollmentToken) == "" { return fmt.Errorf("Thunder client enrollment response was incomplete") } - installCommand, err = s.client.ClientInstallCommand(enrollment.EnrollmentToken) - if err != nil { - return err - } + installCommand = s.client.ClientEnrollmentCommand(enrollment.EnrollmentToken) if err := s.repo.SaveClientEnrollment(ctx, &ClientEnrollmentState{ ContainerID: containerID, WorkspaceID: attrs.workspaceID, @@ -129,7 +118,7 @@ func (s *Service) CreateClientEnrollment(ctx context.Context, req *pb.CreateClie PoolName: attrs.poolName, EnrollmentTokenID: enrollment.EnrollmentTokenID, }, 0); err != nil { - if _, deleteErr := s.client.DeleteEnrollmentTokenNode(ctx, enrollment.EnrollmentTokenID); deleteErr != nil && !isThunderNotFound(deleteErr) { + if _, deleteErr := s.client.DeleteEnrollmentServer(ctx, enrollment.EnrollmentTokenID); deleteErr != nil && !thundersdk.IsNotFound(deleteErr) { return fmt.Errorf("failed to save Thunder client enrollment: %w; additionally failed to revoke Thunder enrollment token %q: %v", err, enrollment.EnrollmentTokenID, deleteErr) } return err @@ -150,7 +139,7 @@ func (s *Service) revokePreviousEnrollmentToken(ctx context.Context, previousEnr if previousEnrollmentTokenID == "" || previousEnrollmentTokenID == currentEnrollmentTokenID { return } - if _, err := s.client.DeleteEnrollmentTokenNode(ctx, previousEnrollmentTokenID); err != nil && !isThunderNotFound(err) { + if _, err := s.client.DeleteEnrollmentServer(ctx, previousEnrollmentTokenID); err != nil && !thundersdk.IsNotFound(err) { log.Warn(). Err(err). Str("workspace_id", workspaceID). @@ -203,8 +192,8 @@ func (s *Service) DeleteClientEnrollment(ctx context.Context, req *pb.DeleteClie return nil } if currentEnrollmentTokenID != "" { - _, err = s.client.DeleteEnrollmentTokenNode(ctx, currentEnrollmentTokenID) - if err != nil && !isThunderNotFound(err) { + _, err = s.client.DeleteEnrollmentServer(ctx, currentEnrollmentTokenID) + if err != nil && !thundersdk.IsNotFound(err) { return err } } @@ -236,11 +225,11 @@ func (s *Service) CreateNodeEnrollment(ctx context.Context, req *pb.CreateNodeEn return err } - enrollment, err := s.client.CreateServerEnrollmentToken(ctx, zoneID) + enrollment, err := s.client.CreateServerEnrollment(ctx, thundersdk.CreateServerEnrollmentRequest{ZoneID: zoneID}) if err != nil { return err } - if enrollment == nil || strings.TrimSpace(enrollment.EnrollmentTokenID) == "" || strings.TrimSpace(enrollment.EnrollmentToken) == "" { + if strings.TrimSpace(enrollment.EnrollmentTokenID) == "" || strings.TrimSpace(enrollment.EnrollmentToken) == "" { return fmt.Errorf("Thunder node enrollment response was incomplete") } if err := s.repo.SaveNodeEnrollment(ctx, &NodeEnrollmentState{ @@ -249,7 +238,7 @@ func (s *Service) CreateNodeEnrollment(ctx context.Context, req *pb.CreateNodeEn MachineID: agentState.MachineID, EnrollmentTokenID: enrollment.EnrollmentTokenID, }, 0); err != nil { - if _, deleteErr := s.client.DeleteEnrollmentTokenNode(ctx, enrollment.EnrollmentTokenID); deleteErr != nil && !isThunderNotFound(deleteErr) { + if _, deleteErr := s.client.DeleteEnrollmentServer(ctx, enrollment.EnrollmentTokenID); deleteErr != nil && !thundersdk.IsNotFound(deleteErr) { return fmt.Errorf("failed to save Thunder node enrollment: %w; additionally failed to revoke Thunder enrollment token %q: %v", err, enrollment.EnrollmentTokenID, deleteErr) } return err @@ -294,8 +283,8 @@ func (s *Service) DeleteNodeEnrollment(ctx context.Context, req *pb.DeleteNodeEn return nil } if currentEnrollmentTokenID != "" { - _, err = s.client.DeleteEnrollmentTokenNode(ctx, currentEnrollmentTokenID) - if err != nil && !isThunderNotFound(err) { + _, err = s.client.DeleteEnrollmentServer(ctx, currentEnrollmentTokenID) + if err != nil && !thundersdk.IsNotFound(err) { return err } } @@ -387,11 +376,11 @@ func (s *Service) ensureZoneLocked(ctx context.Context, workspaceID, poolName st return state.ThunderZoneID, nil } - zone, err := s.client.CreateZone(ctx, thunderZoneDisplayName(workspaceID, poolName)) + zone, err := s.client.CreateZone(ctx, thundersdk.CreateZoneRequest{DisplayName: thunderZoneDisplayName(workspaceID, poolName)}) if err != nil { return "", err } - if zone == nil || strings.TrimSpace(zone.ZoneID) == "" { + if strings.TrimSpace(zone.ZoneID) == "" { return "", fmt.Errorf("Thunder zone response did not include a zone id") } return zone.ZoneID, s.repo.SaveZone(ctx, &ZoneState{ @@ -439,8 +428,3 @@ func requireWorkerToken(ctx context.Context, workspaceID string) error { } return nil } - -func isThunderNotFound(err error) bool { - var thunderErr *ThunderError - return errors.As(err, &thunderErr) && thunderErr.StatusCode == http.StatusNotFound -} diff --git a/pkg/gateway/services/thunder/service_test.go b/pkg/gateway/services/thunder/service_test.go index 068914edc..f8dea26e1 100644 --- a/pkg/gateway/services/thunder/service_test.go +++ b/pkg/gateway/services/thunder/service_test.go @@ -10,6 +10,7 @@ import ( "testing" "time" + thundersdk "github.com/Thunder-Compute/thunder-sdk" "github.com/beam-cloud/beta9/pkg/auth" model "github.com/beam-cloud/beta9/pkg/compute" "github.com/beam-cloud/beta9/pkg/repository" @@ -45,29 +46,29 @@ func TestServiceCreateAndDeleteClientEnrollment(t *testing.T) { t.Fatalf("authorization = %q", got) } switch { - case r.Method == http.MethodPost && r.URL.Path == thunderZonesPath: + case r.Method == http.MethodPost && r.URL.Path == "/api/v1/zones/ensure": createZoneCalls++ - var payload createZoneRequest + var payload thundersdk.CreateZoneRequest if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { t.Fatal(err) } if payload.DisplayName != "workspace-1-pool-1" { t.Fatalf("zone displayName = %q", payload.DisplayName) } - _ = json.NewEncoder(w).Encode(Zone{ZoneID: "zone-1", DisplayName: payload.DisplayName}) - case r.Method == http.MethodPost && r.URL.Path == thunderEnrollmentTokenPath: + _ = json.NewEncoder(w).Encode(thundersdk.CreateZoneResponse{ZoneID: "zone-1", DisplayName: payload.DisplayName}) + case r.Method == http.MethodPost && r.URL.Path == "/api/v1/enrollment-tokens": createTokenCalls++ payload := map[string]any{} if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { t.Fatal(err) } - if payload["zoneId"] != "zone-1" || payload["role"] != thunderEnrollmentRoleClient || payload["gpuType"] != "h100" || payload["gpuCount"] != float64(2) { + if payload["zoneId"] != "zone-1" || payload["role"] != thundersdk.RoleClient || payload["gpuType"] != "h100" || payload["gpuCount"] != float64(2) { t.Fatalf("client enrollment payload = %+v", payload) } - _ = json.NewEncoder(w).Encode(EnrollmentToken{EnrollmentTokenID: "token-1", EnrollmentToken: "tr_client", ZoneID: "zone-1", Role: thunderEnrollmentRoleClient, GPUType: "h100", GPUCount: 2}) + _ = json.NewEncoder(w).Encode(thundersdk.EnrollmentToken{EnrollmentTokenID: "token-1", EnrollmentToken: "tr_client", ZoneID: "zone-1", Role: thundersdk.RoleClient, GPUType: "h100", GPUCount: 2}) case r.Method == http.MethodDelete && r.URL.Path == "/api/v1/enrollment-tokens/token-1/node": deleteTokenCalls++ - _ = json.NewEncoder(w).Encode(DeleteEnrollmentTokenNodeResponse{EnrollmentTokenID: "token-1", Role: thunderEnrollmentRoleClient, NodeDeleted: true}) + _ = json.NewEncoder(w).Encode(thundersdk.DeleteEnrollmentServerResponse{EnrollmentTokenID: "token-1", Role: thundersdk.RoleClient, ServerDeleted: true}) default: t.Fatalf("unexpected request = %s %s", r.Method, r.URL.Path) } @@ -76,7 +77,7 @@ func TestServiceCreateAndDeleteClientEnrollment(t *testing.T) { service, err := NewService(ServiceOpts{ Repository: NewRedisRepository(rdb), - Client: NewClient(server.URL, "central-token", server.Client()), + Client: thundersdk.NewClient(server.URL, "central-token", thundersdk.WithHTTPClient(server.Client())), ContainerRepo: containerRepo, WorkerRepo: workerRepo, }) @@ -155,11 +156,11 @@ func TestServiceCreateClientEnrollmentReusesExistingZone(t *testing.T) { var createZoneCalls int server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method == http.MethodPost && r.URL.Path == thunderZonesPath { + if r.Method == http.MethodPost && r.URL.Path == "/api/v1/zones/ensure" { createZoneCalls++ t.Fatal("CreateZone should not be called for an existing zone") } - if r.Method != http.MethodPost || r.URL.Path != thunderEnrollmentTokenPath { + if r.Method != http.MethodPost || r.URL.Path != "/api/v1/enrollment-tokens" { t.Fatalf("unexpected request = %s %s", r.Method, r.URL.Path) } payload := map[string]any{} @@ -169,11 +170,11 @@ func TestServiceCreateClientEnrollmentReusesExistingZone(t *testing.T) { if payload["zoneId"] != "zone-existing" { t.Fatalf("zoneId = %v", payload["zoneId"]) } - _ = json.NewEncoder(w).Encode(EnrollmentToken{EnrollmentTokenID: "token-1", EnrollmentToken: "tr_client", ZoneID: "zone-existing", Role: thunderEnrollmentRoleClient}) + _ = json.NewEncoder(w).Encode(thundersdk.EnrollmentToken{EnrollmentTokenID: "token-1", EnrollmentToken: "tr_client", ZoneID: "zone-existing", Role: thundersdk.RoleClient}) })) defer server.Close() - service, err := NewService(ServiceOpts{Repository: repo, Client: NewClient(server.URL, "central-token", server.Client()), ContainerRepo: containerRepo, WorkerRepo: workerRepo}) + service, err := NewService(ServiceOpts{Repository: repo, Client: thundersdk.NewClient(server.URL, "central-token", thundersdk.WithHTTPClient(server.Client())), ContainerRepo: containerRepo, WorkerRepo: workerRepo}) if err != nil { t.Fatal(err) } @@ -213,19 +214,19 @@ func TestServiceCreateClientEnrollmentReplacesExistingToken(t *testing.T) { var deleted []string server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch { - case r.Method == http.MethodPost && r.URL.Path == thunderEnrollmentTokenPath: + case r.Method == http.MethodPost && r.URL.Path == "/api/v1/enrollment-tokens": createTokenCalls++ - _ = json.NewEncoder(w).Encode(EnrollmentToken{EnrollmentTokenID: "token-new", EnrollmentToken: "tr_client_new", ZoneID: "zone-existing", Role: thunderEnrollmentRoleClient}) + _ = json.NewEncoder(w).Encode(thundersdk.EnrollmentToken{EnrollmentTokenID: "token-new", EnrollmentToken: "tr_client_new", ZoneID: "zone-existing", Role: thundersdk.RoleClient}) case r.Method == http.MethodDelete && strings.HasPrefix(r.URL.Path, "/api/v1/enrollment-tokens/"): deleted = append(deleted, strings.TrimSuffix(strings.TrimPrefix(r.URL.Path, "/api/v1/enrollment-tokens/"), "/node")) - _ = json.NewEncoder(w).Encode(DeleteEnrollmentTokenNodeResponse{NodeDeleted: true}) + _ = json.NewEncoder(w).Encode(thundersdk.DeleteEnrollmentServerResponse{ServerDeleted: true}) default: t.Fatalf("unexpected request = %s %s", r.Method, r.URL.Path) } })) defer server.Close() - service, err := NewService(ServiceOpts{Repository: repo, Client: NewClient(server.URL, "central-token", server.Client()), ContainerRepo: containerRepo, WorkerRepo: workerRepo}) + service, err := NewService(ServiceOpts{Repository: repo, Client: thundersdk.NewClient(server.URL, "central-token", thundersdk.WithHTTPClient(server.Client())), ContainerRepo: containerRepo, WorkerRepo: workerRepo}) if err != nil { t.Fatal(err) } @@ -271,12 +272,22 @@ func TestServiceCreateClientEnrollmentSucceedsWhenPreviousTokenRevokeFails(t *te t.Fatal(err) } - client := &recordingThunderClient{ - clientEnrollment: &EnrollmentToken{EnrollmentTokenID: "token-new", EnrollmentToken: "tr_client_new", ZoneID: "zone-existing", Role: thunderEnrollmentRoleClient}, - installCommand: "curl install thunder", - deleteErr: errors.New("Thunder delete failed"), - } - service, err := NewService(ServiceOpts{Repository: repo, Client: client, ContainerRepo: containerRepo, WorkerRepo: workerRepo}) + var deleted []string + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch { + case r.Method == http.MethodPost && r.URL.Path == "/api/v1/enrollment-tokens": + _ = json.NewEncoder(w).Encode(thundersdk.EnrollmentToken{EnrollmentTokenID: "token-new", EnrollmentToken: "tr_client_new", ZoneID: "zone-existing", Role: thundersdk.RoleClient}) + case r.Method == http.MethodDelete && strings.HasPrefix(r.URL.Path, "/api/v1/enrollment-tokens/"): + deleted = append(deleted, strings.TrimSuffix(strings.TrimPrefix(r.URL.Path, "/api/v1/enrollment-tokens/"), "/node")) + w.WriteHeader(http.StatusInternalServerError) + _ = json.NewEncoder(w).Encode(map[string]string{"error": "internal", "message": "delete failed"}) + default: + t.Fatalf("unexpected request = %s %s", r.Method, r.URL.Path) + } + })) + defer server.Close() + + service, err := NewService(ServiceOpts{Repository: repo, Client: thundersdk.NewClient(server.URL, "central-token", thundersdk.WithHTTPClient(server.Client())), ContainerRepo: containerRepo, WorkerRepo: workerRepo}) if err != nil { t.Fatal(err) } @@ -285,11 +296,11 @@ func TestServiceCreateClientEnrollmentSucceedsWhenPreviousTokenRevokeFails(t *te if err != nil { t.Fatal(err) } - if !resp.Ok || resp.ErrorMsg != "" || resp.InstallCommand != "curl install thunder" { + if !resp.Ok || resp.ErrorMsg != "" || !strings.Contains(resp.InstallCommand, "tr_client_new") { t.Fatalf("CreateClientEnrollment() = %+v", resp) } - if len(client.deletedEnrollmentTokenIDs) != 1 || client.deletedEnrollmentTokenIDs[0] != "token-old" { - t.Fatalf("deleted enrollment token ids = %+v", client.deletedEnrollmentTokenIDs) + if len(deleted) != 1 || deleted[0] != "token-old" { + t.Fatalf("deleted enrollment token ids = %+v", deleted) } state, found, err := repo.GetClientEnrollment(context.Background(), "container-1") if err != nil || !found { @@ -316,7 +327,7 @@ func TestServiceDeleteClientEnrollmentIsIdempotent(t *testing.T) { defer rdb.Close() service, err := NewService(ServiceOpts{ Repository: NewRedisRepository(rdb), - Client: NewClient("https://central.example", "central-token", nil), + Client: thundersdk.NewClient("https://central.example", "central-token"), ContainerRepo: repository.NewContainerRedisRepositoryForTest(rdb), WorkerRepo: repository.NewWorkerRedisRepositoryForTest(rdb), }) @@ -346,7 +357,7 @@ func TestServicePrivateWorkerTokenIsWorkspaceScoped(t *testing.T) { } service, err := NewService(ServiceOpts{ Repository: NewRedisRepository(rdb), - Client: NewClient("https://central.example", "central-token", nil), + Client: thundersdk.NewClient("https://central.example", "central-token"), ContainerRepo: containerRepo, WorkerRepo: workerRepo, }) @@ -379,23 +390,23 @@ func TestServiceCreateAndDeleteNodeEnrollment(t *testing.T) { t.Fatalf("authorization = %q", got) } switch { - case r.Method == http.MethodPost && r.URL.Path == thunderZonesPath: + case r.Method == http.MethodPost && r.URL.Path == "/api/v1/zones/ensure": createZoneCalls++ - var payload createZoneRequest + var payload thundersdk.CreateZoneRequest if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { t.Fatal(err) } if payload.DisplayName != "workspace-1-pool-1" { t.Fatalf("zone displayName = %q", payload.DisplayName) } - _ = json.NewEncoder(w).Encode(Zone{ZoneID: "zone-1", DisplayName: payload.DisplayName}) - case r.Method == http.MethodPost && r.URL.Path == thunderEnrollmentTokenPath: + _ = json.NewEncoder(w).Encode(thundersdk.CreateZoneResponse{ZoneID: "zone-1", DisplayName: payload.DisplayName}) + case r.Method == http.MethodPost && r.URL.Path == "/api/v1/enrollment-tokens": createTokenCalls++ payload := map[string]any{} if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { t.Fatal(err) } - if payload["zoneId"] != "zone-1" || payload["role"] != thunderEnrollmentRoleServer { + if payload["zoneId"] != "zone-1" || payload["role"] != thundersdk.RoleServer { t.Fatalf("node enrollment payload = %+v", payload) } if _, ok := payload["gpuType"]; ok { @@ -404,10 +415,10 @@ func TestServiceCreateAndDeleteNodeEnrollment(t *testing.T) { if _, ok := payload["gpuCount"]; ok { t.Fatalf("node enrollment payload included gpuCount: %+v", payload) } - _ = json.NewEncoder(w).Encode(EnrollmentToken{EnrollmentTokenID: "node-token-1", EnrollmentToken: "tr_node", ZoneID: "zone-1", Role: thunderEnrollmentRoleServer}) + _ = json.NewEncoder(w).Encode(thundersdk.EnrollmentToken{EnrollmentTokenID: "node-token-1", EnrollmentToken: "tr_node", ZoneID: "zone-1", Role: thundersdk.RoleServer}) case r.Method == http.MethodDelete && r.URL.Path == "/api/v1/enrollment-tokens/node-token-1/node": deleteTokenCalls++ - _ = json.NewEncoder(w).Encode(DeleteEnrollmentTokenNodeResponse{EnrollmentTokenID: "node-token-1", Role: thunderEnrollmentRoleServer, NodeDeleted: true}) + _ = json.NewEncoder(w).Encode(thundersdk.DeleteEnrollmentServerResponse{EnrollmentTokenID: "node-token-1", Role: thundersdk.RoleServer, ServerDeleted: true}) default: t.Fatalf("unexpected request = %s %s", r.Method, r.URL.Path) } @@ -416,7 +427,7 @@ func TestServiceCreateAndDeleteNodeEnrollment(t *testing.T) { service, err := NewService(ServiceOpts{ Repository: repo, - Client: NewClient(server.URL, "central-token", server.Client()), + Client: thundersdk.NewClient(server.URL, "central-token", thundersdk.WithHTTPClient(server.Client())), ContainerRepo: repository.NewContainerRedisRepositoryForTest(rdb), WorkerRepo: repository.NewWorkerRedisRepositoryForTest(rdb), AgentStateValidator: validator, @@ -485,19 +496,19 @@ func TestServiceCreateNodeEnrollmentReplacesExistingToken(t *testing.T) { var deleted []string server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch { - case r.Method == http.MethodPost && r.URL.Path == thunderEnrollmentTokenPath: + case r.Method == http.MethodPost && r.URL.Path == "/api/v1/enrollment-tokens": createTokenCalls++ payload := map[string]any{} if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { t.Fatal(err) } - if payload["zoneId"] != "zone-existing" || payload["role"] != thunderEnrollmentRoleServer { + if payload["zoneId"] != "zone-existing" || payload["role"] != thundersdk.RoleServer { t.Fatalf("node enrollment payload = %+v", payload) } - _ = json.NewEncoder(w).Encode(EnrollmentToken{EnrollmentTokenID: "node-token-new", EnrollmentToken: "tr_node_new", ZoneID: "zone-existing", Role: thunderEnrollmentRoleServer}) + _ = json.NewEncoder(w).Encode(thundersdk.EnrollmentToken{EnrollmentTokenID: "node-token-new", EnrollmentToken: "tr_node_new", ZoneID: "zone-existing", Role: thundersdk.RoleServer}) case r.Method == http.MethodDelete && strings.HasPrefix(r.URL.Path, "/api/v1/enrollment-tokens/"): deleted = append(deleted, strings.TrimSuffix(strings.TrimPrefix(r.URL.Path, "/api/v1/enrollment-tokens/"), "/node")) - _ = json.NewEncoder(w).Encode(DeleteEnrollmentTokenNodeResponse{NodeDeleted: true}) + _ = json.NewEncoder(w).Encode(thundersdk.DeleteEnrollmentServerResponse{ServerDeleted: true}) default: t.Fatalf("unexpected request = %s %s", r.Method, r.URL.Path) } @@ -506,7 +517,7 @@ func TestServiceCreateNodeEnrollmentReplacesExistingToken(t *testing.T) { service, err := NewService(ServiceOpts{ Repository: repo, - Client: NewClient(server.URL, "central-token", server.Client()), + Client: thundersdk.NewClient(server.URL, "central-token", thundersdk.WithHTTPClient(server.Client())), ContainerRepo: repository.NewContainerRedisRepositoryForTest(rdb), WorkerRepo: repository.NewWorkerRedisRepositoryForTest(rdb), AgentStateValidator: validator, @@ -548,13 +559,24 @@ func TestServiceCreateNodeEnrollmentSucceedsWhenPreviousTokenRevokeFails(t *test t.Fatal(err) } - client := &recordingThunderClient{ - serverEnrollment: &EnrollmentToken{EnrollmentTokenID: "node-token-new", EnrollmentToken: "tr_node_new", ZoneID: "zone-existing", Role: thunderEnrollmentRoleServer}, - deleteErr: errors.New("Thunder delete failed"), - } + var deleted []string + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch { + case r.Method == http.MethodPost && r.URL.Path == "/api/v1/enrollment-tokens": + _ = json.NewEncoder(w).Encode(thundersdk.EnrollmentToken{EnrollmentTokenID: "node-token-new", EnrollmentToken: "tr_node_new", ZoneID: "zone-existing", Role: thundersdk.RoleServer}) + case r.Method == http.MethodDelete && strings.HasPrefix(r.URL.Path, "/api/v1/enrollment-tokens/"): + deleted = append(deleted, strings.TrimSuffix(strings.TrimPrefix(r.URL.Path, "/api/v1/enrollment-tokens/"), "/node")) + w.WriteHeader(http.StatusInternalServerError) + _ = json.NewEncoder(w).Encode(map[string]string{"error": "internal", "message": "delete failed"}) + default: + t.Fatalf("unexpected request = %s %s", r.Method, r.URL.Path) + } + })) + defer server.Close() + service, err := NewService(ServiceOpts{ Repository: repo, - Client: client, + Client: thundersdk.NewClient(server.URL, "central-token", thundersdk.WithHTTPClient(server.Client())), ContainerRepo: repository.NewContainerRedisRepositoryForTest(rdb), WorkerRepo: repository.NewWorkerRedisRepositoryForTest(rdb), AgentStateValidator: &fakeAgentStateValidator{state: &model.AgentTokenState{WorkspaceID: "workspace-1", PoolName: "pool-1", MachineID: "machine-1"}}, @@ -570,8 +592,8 @@ func TestServiceCreateNodeEnrollmentSucceedsWhenPreviousTokenRevokeFails(t *test if !resp.Ok || resp.ErrorMsg != "" || resp.EnrollmentToken != "tr_node_new" { t.Fatalf("CreateNodeEnrollment() = %+v", resp) } - if len(client.deletedEnrollmentTokenIDs) != 1 || client.deletedEnrollmentTokenIDs[0] != "node-token-old" { - t.Fatalf("deleted enrollment token ids = %+v", client.deletedEnrollmentTokenIDs) + if len(deleted) != 1 || deleted[0] != "node-token-old" { + t.Fatalf("deleted enrollment token ids = %+v", deleted) } state, found, err := repo.GetNodeEnrollment(context.Background(), "workspace-1", "pool-1", "machine-1") if err != nil || !found { @@ -597,8 +619,7 @@ func TestServiceDeleteClientEnrollmentSkipsChangedTokenUnderPoolLock(t *testing. EnrollmentTokenID: "token-new", }, } - client := &recordingThunderClient{} - service := &Service{repo: repo, client: client} + service := &Service{repo: repo, client: thundersdk.NewClient("https://central.example", "central-token")} resp, err := service.DeleteClientEnrollment(thunderWorkerAuthContext(types.TokenTypeWorker, ""), &pb.DeleteClientEnrollmentRequest{ContainerId: "container-1"}) if err != nil { @@ -616,9 +637,6 @@ func TestServiceDeleteClientEnrollmentSkipsChangedTokenUnderPoolLock(t *testing. if repo.deletedClientID != "" { t.Fatalf("deleted client id = %q", repo.deletedClientID) } - if len(client.deletedEnrollmentTokenIDs) != 0 { - t.Fatalf("deleted enrollment token ids = %+v", client.deletedEnrollmentTokenIDs) - } } func TestServiceDeleteNodeEnrollmentSkipsChangedTokenUnderPoolLock(t *testing.T) { @@ -636,10 +654,9 @@ func TestServiceDeleteNodeEnrollmentSkipsChangedTokenUnderPoolLock(t *testing.T) EnrollmentTokenID: "node-token-new", }, } - client := &recordingThunderClient{} service := &Service{ repo: repo, - client: client, + client: thundersdk.NewClient("https://central.example", "central-token"), agentValidator: &fakeAgentStateValidator{state: &model.AgentTokenState{WorkspaceID: "workspace-1", PoolName: "pool-1", MachineID: "machine-1"}}, } @@ -659,9 +676,6 @@ func TestServiceDeleteNodeEnrollmentSkipsChangedTokenUnderPoolLock(t *testing.T) if repo.deletedNodeMachineID != "" { t.Fatalf("deleted node machine id = %q", repo.deletedNodeMachineID) } - if len(client.deletedEnrollmentTokenIDs) != 0 { - t.Fatalf("deleted enrollment token ids = %+v", client.deletedEnrollmentTokenIDs) - } } func TestServiceCreateNodeEnrollmentRequiresValidAgentToken(t *testing.T) { @@ -669,7 +683,7 @@ func TestServiceCreateNodeEnrollmentRequiresValidAgentToken(t *testing.T) { defer rdb.Close() service, err := NewService(ServiceOpts{ Repository: NewRedisRepository(rdb), - Client: NewClient("https://central.example", "central-token", nil), + Client: thundersdk.NewClient("https://central.example", "central-token"), ContainerRepo: repository.NewContainerRedisRepositoryForTest(rdb), WorkerRepo: repository.NewWorkerRedisRepositoryForTest(rdb), AgentStateValidator: &fakeAgentStateValidator{err: errors.New("managed pool no longer exists")}, @@ -686,54 +700,6 @@ func TestServiceCreateNodeEnrollmentRequiresValidAgentToken(t *testing.T) { } } -type recordingThunderClient struct { - zone *Zone - clientEnrollment *EnrollmentToken - serverEnrollment *EnrollmentToken - installCommand string - deleteErr error - deletedEnrollmentTokenIDs []string -} - -func (c *recordingThunderClient) CreateZone(ctx context.Context, displayName string) (*Zone, error) { - if c.zone == nil { - return nil, errors.New("unexpected CreateZone call") - } - zone := *c.zone - return &zone, nil -} - -func (c *recordingThunderClient) CreateClientEnrollmentToken(ctx context.Context, zoneID, gpuType string, gpuCount int) (*EnrollmentToken, error) { - if c.clientEnrollment == nil { - return nil, errors.New("unexpected CreateClientEnrollmentToken call") - } - enrollment := *c.clientEnrollment - return &enrollment, nil -} - -func (c *recordingThunderClient) CreateServerEnrollmentToken(ctx context.Context, zoneID string) (*EnrollmentToken, error) { - if c.serverEnrollment == nil { - return nil, errors.New("unexpected CreateServerEnrollmentToken call") - } - enrollment := *c.serverEnrollment - return &enrollment, nil -} - -func (c *recordingThunderClient) DeleteEnrollmentTokenNode(ctx context.Context, enrollmentTokenID string) (*DeleteEnrollmentTokenNodeResponse, error) { - c.deletedEnrollmentTokenIDs = append(c.deletedEnrollmentTokenIDs, enrollmentTokenID) - if c.deleteErr != nil { - return nil, c.deleteErr - } - return &DeleteEnrollmentTokenNodeResponse{EnrollmentTokenID: enrollmentTokenID, NodeDeleted: true}, nil -} - -func (c *recordingThunderClient) ClientInstallCommand(enrollmentToken string) (string, error) { - if c.installCommand == "" { - return "", errors.New("unexpected ClientInstallCommand call") - } - return c.installCommand, nil -} - type lockingThunderRepository struct { inLock bool lockedWorkspaceID string From 6ce2a944296f44a21a7da402923dd37dfc3c6471 Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Fri, 7 Aug 2026 06:42:09 +0000 Subject: [PATCH 23/26] removed replace --- go.mod | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.mod b/go.mod index 3becc70bf..4eb2d2eb7 100644 --- a/go.mod +++ b/go.mod @@ -327,5 +327,3 @@ replace github.com/aws/aws-sdk-go => github.com/beam-cloud/geesefs/s3ext v0.0.0- replace github.com/winfsp/cgofuse => github.com/vitalif/cgofuse v0.0.0-20230609211427-22e8fa44f6b8 replace github.com/jacobsa/fuse => github.com/beam-cloud/gofuse v0.0.0-20260720132319-1a907975017e - -replace github.com/Thunder-Compute/thunder-sdk => ../../thunder-sdk From b2b901dbcbd6c1da4006c8abbe3e4e3485b0626c Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Fri, 7 Aug 2026 07:38:34 +0000 Subject: [PATCH 24/26] using cache IP address --- go.sum | 2 + pkg/agent/thunder.go | 55 +-- pkg/agent/thunder_test.go | 51 ++- pkg/agent/transport.go | 31 +- pkg/agent/transport_test.go | 48 +++ pkg/auth/grpc.go | 1 + pkg/auth/grpc_test.go | 5 +- pkg/gateway/gateway.proto | 10 + pkg/gateway/services/compute.go | 4 + pkg/gateway/services/compute/agent.go | 21 + pkg/gateway/services/compute/compute_test.go | 45 ++ proto/gateway.pb.go | 424 ++++++++++++------- proto/gateway_grpc.pb.go | 38 ++ 13 files changed, 519 insertions(+), 216 deletions(-) diff --git a/go.sum b/go.sum index 0122fe526..dccb3fdae 100644 --- a/go.sum +++ b/go.sum @@ -63,6 +63,8 @@ github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA4 github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= +github.com/Thunder-Compute/thunder-sdk v0.1.0 h1:dZzdBJKJZdiYDh/lcHHgcTHXsOdN+EeNUkaf39IY8Bc= +github.com/Thunder-Compute/thunder-sdk v0.1.0/go.mod h1:vm4X6bGP6hCsy+UvXYan4Xg33p6T28uVwqiAXVeQ/E0= github.com/VictoriaMetrics/metrics v1.37.0 h1:u5Yr+HFofQyn7kgmmkufgkX0nEA6G1oEyK2eaKsVaUM= github.com/VictoriaMetrics/metrics v1.37.0/go.mod h1:r7hveu6xMdUACXvB8TYdAj8WEsKzWB0EkpJN+RDtOf8= github.com/akutz/memconn v0.1.0 h1:NawI0TORU4hcOMsMr11g7vwlCdkYeLKXBcxWu2W/P8A= diff --git a/pkg/agent/thunder.go b/pkg/agent/thunder.go index 473643795..1bb3cec8a 100644 --- a/pkg/agent/thunder.go +++ b/pkg/agent/thunder.go @@ -4,13 +4,12 @@ import ( "context" "fmt" "io" - "net" - "net/netip" "os/exec" "strings" "time" - "github.com/beam-cloud/beta9/pkg/common" + thundersdk "github.com/Thunder-Compute/thunder-sdk" + "github.com/beam-cloud/beta9/pkg/cache" pb "github.com/beam-cloud/beta9/proto" "google.golang.org/grpc" ) @@ -18,18 +17,19 @@ import ( const thunderNodeInstallTimeout = 2 * time.Minute var runThunderNodeInstallCommand = defaultRunThunderNodeInstallCommand +var discoverThunderNodeIP = defaultDiscoverThunderNodeIP type nodeEnrollmentGatewayClient interface { CreateNodeEnrollment(context.Context, *pb.CreateNodeEnrollmentRequest, ...grpc.CallOption) (*pb.CreateNodeEnrollmentResponse, error) DeleteNodeEnrollment(context.Context, *pb.DeleteNodeEnrollmentRequest, ...grpc.CallOption) (*pb.DeleteNodeEnrollmentResponse, error) } -func setupThunderNode(ctx context.Context, client nodeEnrollmentGatewayClient, agentToken string, tailscaleIPs []netip.Addr, stdout, stderr io.Writer) error { +func setupThunderNode(ctx context.Context, client nodeEnrollmentGatewayClient, agentToken string, stdout, stderr io.Writer) error { if client == nil { return fmt.Errorf("gateway client is required for Thunder node enrollment") } - reachableIP, err := thunderReachableNodeIP(tailscaleIPs) + reachableIP, err := discoverThunderNodeIP() if err != nil { return err } @@ -81,46 +81,23 @@ func deleteThunderNodeEnrollment(ctx context.Context, client nodeEnrollmentGatew } } -func thunderReachableNodeIP(ips []netip.Addr) (string, error) { - for _, ip := range ips { - if ip.IsValid() && ip.Is4() { - return ip.String(), nil - } - } - for _, ip := range ips { - if ip.IsValid() { - return ip.String(), nil - } - } - return "", fmt.Errorf("tailscale IP address is required for Thunder node enrollment") -} - -func hostTailscaleIPs() []netip.Addr { - iface, err := net.InterfaceByName("tailscale0") +func defaultDiscoverThunderNodeIP() (string, error) { + ip, err := cache.GetPrivateIpAddr() if err != nil { - return nil + return "", fmt.Errorf("cache locality private IP address is required for Thunder node enrollment: %w", err) } - addrs, err := iface.Addrs() - if err != nil { - return nil - } - - ips := make([]netip.Addr, 0, len(addrs)) - for _, addr := range addrs { - prefix, err := netip.ParsePrefix(addr.String()) - if err == nil { - ips = append(ips, prefix.Addr()) - continue - } - if ip, err := netip.ParseAddr(addr.String()); err == nil { - ips = append(ips, ip) - } + ip = strings.TrimSpace(ip) + if ip == "" { + return "", fmt.Errorf("cache locality private IP address is required for Thunder node enrollment") } - return ips + return ip, nil } func thunderNodeInstallCommand(reachableIP, enrollmentToken string) string { - return "curl -fsSL https://get.thundercompute.com/install.sh | sudo THUNDER_INSTALL_MODE=thunderd THUNDERD_IP=" + common.ShellQuote(reachableIP) + " THUNDER_ENROLLMENT_TOKEN=" + common.ShellQuote(enrollmentToken) + " sh" + return thundersdk.NewClient("", "").ServerEnrollmentCommand(thundersdk.ServerEnrollmentCommandRequest{ + EnrollmentToken: enrollmentToken, + IP: reachableIP, + }) } func defaultRunThunderNodeInstallCommand(ctx context.Context, command string) error { diff --git a/pkg/agent/thunder_test.go b/pkg/agent/thunder_test.go index c84bda83f..7a4e462c0 100644 --- a/pkg/agent/thunder_test.go +++ b/pkg/agent/thunder_test.go @@ -3,7 +3,6 @@ package agent import ( "context" "errors" - "net/netip" "strings" "testing" @@ -11,8 +10,10 @@ import ( "google.golang.org/grpc" ) -func TestSetupThunderNodeInstallsWithTailscaleIP(t *testing.T) { +func TestSetupThunderNodeInstallsWithCacheLocalityPrivateIP(t *testing.T) { client := &fakeGatewayNodeEnrollmentClient{createResp: &pb.CreateNodeEnrollmentResponse{Ok: true, EnrollmentToken: "tr_node"}} + restoreIP := stubThunderNodeIP("10.0.0.10", nil) + defer restoreIP() var commands []string restore := stubThunderNodeInstallCommand(func(ctx context.Context, command string) error { commands = append(commands, command) @@ -20,17 +21,14 @@ func TestSetupThunderNodeInstallsWithTailscaleIP(t *testing.T) { }) defer restore() - err := setupThunderNode(context.Background(), client, "agent-token", []netip.Addr{ - netip.MustParseAddr("fd7a:115c:a1e0::1"), - netip.MustParseAddr("100.64.0.10"), - }, nil, nil) + err := setupThunderNode(context.Background(), client, "agent-token", nil, nil) if err != nil { t.Fatal(err) } if len(commands) != 1 { t.Fatalf("install command count = %d", len(commands)) } - if !strings.Contains(commands[0], "THUNDER_INSTALL_MODE=thunderd") || !strings.Contains(commands[0], "THUNDERD_IP='100.64.0.10'") || !strings.Contains(commands[0], "THUNDER_ENROLLMENT_TOKEN='tr_node'") { + if !strings.Contains(commands[0], "THUNDER_INSTALL_MODE=thunderd") || !strings.Contains(commands[0], "THUNDERD_IP='10.0.0.10'") || !strings.Contains(commands[0], "THUNDER_ENROLLMENT_TOKEN='tr_node'") { t.Fatalf("install command = %q", commands[0]) } if client.createAgentToken != "agent-token" { @@ -43,13 +41,15 @@ func TestSetupThunderNodeInstallsWithTailscaleIP(t *testing.T) { func TestSetupThunderNodeSkipsInstallerWhenEnrollmentFails(t *testing.T) { client := &fakeGatewayNodeEnrollmentClient{createErr: errors.New("gateway unavailable")} + restoreIP := stubThunderNodeIP("10.0.0.10", nil) + defer restoreIP() restore := stubThunderNodeInstallCommand(func(ctx context.Context, command string) error { t.Fatalf("installer should not run when enrollment fails: %s", command) return nil }) defer restore() - err := setupThunderNode(context.Background(), client, "agent-token", []netip.Addr{netip.MustParseAddr("100.64.0.10")}, nil, nil) + err := setupThunderNode(context.Background(), client, "agent-token", nil, nil) if err == nil || !strings.Contains(err.Error(), "gateway unavailable") { t.Fatalf("setupThunderNode() error = %v", err) } @@ -57,25 +57,29 @@ func TestSetupThunderNodeSkipsInstallerWhenEnrollmentFails(t *testing.T) { func TestSetupThunderNodeSkipsInstallerWhenAlreadyEnrolled(t *testing.T) { client := &fakeGatewayNodeEnrollmentClient{createResp: &pb.CreateNodeEnrollmentResponse{Ok: true}} + restoreIP := stubThunderNodeIP("10.0.0.10", nil) + defer restoreIP() restore := stubThunderNodeInstallCommand(func(ctx context.Context, command string) error { t.Fatalf("installer should not run for an existing enrollment: %s", command) return nil }) defer restore() - if err := setupThunderNode(context.Background(), client, "agent-token", []netip.Addr{netip.MustParseAddr("100.64.0.10")}, nil, nil); err != nil { + if err := setupThunderNode(context.Background(), client, "agent-token", nil, nil); err != nil { t.Fatal(err) } } func TestSetupThunderNodeDeletesEnrollmentWhenInstallFails(t *testing.T) { client := &fakeGatewayNodeEnrollmentClient{createResp: &pb.CreateNodeEnrollmentResponse{Ok: true, EnrollmentToken: "tr_node"}, deleteResp: &pb.DeleteNodeEnrollmentResponse{Ok: true}} + restoreIP := stubThunderNodeIP("10.0.0.10", nil) + defer restoreIP() restore := stubThunderNodeInstallCommand(func(ctx context.Context, command string) error { return errors.New("install failed") }) defer restore() - err := setupThunderNode(context.Background(), client, "agent-token", []netip.Addr{netip.MustParseAddr("100.64.0.10")}, nil, nil) + err := setupThunderNode(context.Background(), client, "agent-token", nil, nil) if err == nil || !strings.Contains(err.Error(), "install failed") { t.Fatalf("setupThunderNode() error = %v", err) } @@ -84,17 +88,28 @@ func TestSetupThunderNodeDeletesEnrollmentWhenInstallFails(t *testing.T) { } } -func TestThunderReachableNodeIPPrefersIPv4(t *testing.T) { - got, err := thunderReachableNodeIP([]netip.Addr{ - netip.MustParseAddr("fd7a:115c:a1e0::1"), - netip.MustParseAddr("100.64.0.10"), +func TestSetupThunderNodeSkipsInstallerWhenPrivateIPMissing(t *testing.T) { + client := &fakeGatewayNodeEnrollmentClient{createResp: &pb.CreateNodeEnrollmentResponse{Ok: true, EnrollmentToken: "tr_node"}} + restoreIP := stubThunderNodeIP("", errors.New("no private ip")) + defer restoreIP() + restoreInstall := stubThunderNodeInstallCommand(func(ctx context.Context, command string) error { + t.Fatalf("installer should not run without a private IP: %s", command) + return nil }) - if err != nil { - t.Fatal(err) + defer restoreInstall() + + err := setupThunderNode(context.Background(), client, "agent-token", nil, nil) + if err == nil || !strings.Contains(err.Error(), "no private ip") { + t.Fatalf("setupThunderNode() error = %v", err) } - if got != "100.64.0.10" { - t.Fatalf("reachable IP = %q", got) +} + +func stubThunderNodeIP(ip string, err error) func() { + old := discoverThunderNodeIP + discoverThunderNodeIP = func() (string, error) { + return ip, err } + return func() { discoverThunderNodeIP = old } } func stubThunderNodeInstallCommand(fn func(context.Context, string) error) func() { diff --git a/pkg/agent/transport.go b/pkg/agent/transport.go index 36c5990b6..a05325f60 100644 --- a/pkg/agent/transport.go +++ b/pkg/agent/transport.go @@ -13,6 +13,7 @@ import ( "github.com/beam-cloud/beta9/pkg/types" pb "github.com/beam-cloud/beta9/proto" + "google.golang.org/grpc" "tailscale.com/ipn/ipnstate" "tailscale.com/tsnet" "tailscale.com/types/key" @@ -86,10 +87,15 @@ func runTSNetRouteProxy(ctx context.Context, client pb.GatewayServiceClient, age } } } - if err := setupThunderNode(ctx, client, agentToken, hostTailscaleIPs(), stdout, stderr); err != nil { + poolVirtualized, err := requestAgentPoolGPUVirtualized(ctx, client, agentToken) + if err != nil { fmt.Fprintf(stderr, "Thunder node enrollment skipped: %v\n", err) - } else { - defer deleteThunderNodeEnrollment(context.Background(), client, agentToken, stderr) + } else if shouldSetupThunderNode(poolVirtualized) { + if err := setupThunderNode(ctx, client, agentToken, stdout, stderr); err != nil { + fmt.Fprintf(stderr, "Thunder node enrollment skipped: %v\n", err) + } else { + defer deleteThunderNodeEnrollment(context.Background(), client, agentToken, stderr) + } } listener, err := server.Listen("tcp", fmt.Sprintf(":%d", types.DefaultAgentTSNetRouteProxyPort)) @@ -113,6 +119,10 @@ func runTSNetRouteProxy(ctx context.Context, client pb.GatewayServiceClient, age return newRouteProxy(client, agentToken, machineID, listener, proxyTarget, workers, stdout, stderr).run(ctx) } +func shouldSetupThunderNode(gpuVirtualized bool) bool { + return gpuVirtualized +} + func emitTSNetSnapshots(ctx context.Context, telemetry *agentTelemetry, client tsnetStatusClient, proxyTarget string) { if telemetry == nil || client == nil { return @@ -321,6 +331,21 @@ func agentTSNetLogf(stderr io.Writer) func(string, ...any) { } } +type agentPoolVirtualizationGatewayClient interface { + GetAgentPoolVirtualization(context.Context, *pb.GetAgentPoolVirtualizationRequest, ...grpc.CallOption) (*pb.GetAgentPoolVirtualizationResponse, error) +} + +func requestAgentPoolGPUVirtualized(ctx context.Context, client agentPoolVirtualizationGatewayClient, agentToken string) (bool, error) { + res, err := client.GetAgentPoolVirtualization(ctx, &pb.GetAgentPoolVirtualizationRequest{AgentToken: agentToken}) + if err != nil { + return false, err + } + if !res.GetOk() { + return false, fmt.Errorf("%s", res.GetErrMsg()) + } + return res.GetGpuVirtualized(), nil +} + func requestTransportCredential(ctx context.Context, client pb.GatewayServiceClient, agentToken, transport string) (*transportCredentialResponse, error) { res, err := client.RequestAgentTransportCredential(ctx, &pb.RequestAgentTransportCredentialRequest{ AgentToken: agentToken, diff --git a/pkg/agent/transport_test.go b/pkg/agent/transport_test.go index 4110c23cb..8c98bf96c 100644 --- a/pkg/agent/transport_test.go +++ b/pkg/agent/transport_test.go @@ -7,6 +7,7 @@ import ( "github.com/beam-cloud/beta9/pkg/types" pb "github.com/beam-cloud/beta9/proto" + "google.golang.org/grpc" "tailscale.com/ipn/ipnstate" ) @@ -26,6 +27,53 @@ func (c *fakeTSNetStatusClient) StatusWithoutPeers(context.Context) (*ipnstate.S return c.status, c.err } +type fakeAgentPoolVirtualizationClient struct { + resp *pb.GetAgentPoolVirtualizationResponse + err error + agentToken string +} + +func (c *fakeAgentPoolVirtualizationClient) GetAgentPoolVirtualization(ctx context.Context, in *pb.GetAgentPoolVirtualizationRequest, _ ...grpc.CallOption) (*pb.GetAgentPoolVirtualizationResponse, error) { + c.agentToken = in.GetAgentToken() + if c.err != nil { + return nil, c.err + } + return c.resp, nil +} + +func TestShouldSetupThunderNodeRequiresGPUVirtualization(t *testing.T) { + if shouldSetupThunderNode(false) { + t.Fatal("non-virtualized pool should not set up Thunder") + } + if !shouldSetupThunderNode(true) { + t.Fatal("virtualized GPU pool should set up Thunder") + } +} + +func TestRequestAgentPoolGPUVirtualizedUsesAgentTokenRPC(t *testing.T) { + client := &fakeAgentPoolVirtualizationClient{resp: &pb.GetAgentPoolVirtualizationResponse{Ok: true, GpuVirtualized: true}} + + got, err := requestAgentPoolGPUVirtualized(context.Background(), client, "agent-token") + if err != nil { + t.Fatal(err) + } + if !got { + t.Fatal("gpu virtualized = false, want true") + } + if client.agentToken != "agent-token" { + t.Fatalf("agent token = %q", client.agentToken) + } +} + +func TestRequestAgentPoolGPUVirtualizedReturnsRPCError(t *testing.T) { + client := &fakeAgentPoolVirtualizationClient{resp: &pb.GetAgentPoolVirtualizationResponse{Ok: false, ErrMsg: "invalid agent token"}} + + _, err := requestAgentPoolGPUVirtualized(context.Background(), client, "agent-token") + if err == nil || err.Error() != "invalid agent token" { + t.Fatalf("requestAgentPoolGPUVirtualized() error = %v", err) + } +} + func TestTSNetSnapshotSuppressesTransientTimeouts(t *testing.T) { telemetry := newAgentTelemetry(nil, "", bootstrapConfig{}, "", nil) client := &fakeTSNetStatusClient{err: context.DeadlineExceeded} diff --git a/pkg/auth/grpc.go b/pkg/auth/grpc.go index 72f18e040..a0370f2c2 100644 --- a/pkg/auth/grpc.go +++ b/pkg/auth/grpc.go @@ -41,6 +41,7 @@ func NewAuthInterceptor(config types.AppConfig, backendRepo repository.BackendRe pb.GatewayService_JoinAgent_FullMethodName: true, pb.GatewayService_ListAgentRoutes_FullMethodName: true, pb.GatewayService_RequestAgentTransportCredential_FullMethodName: true, + pb.GatewayService_GetAgentPoolVirtualization_FullMethodName: true, pb.GatewayService_CreateNodeEnrollment_FullMethodName: true, pb.GatewayService_DeleteNodeEnrollment_FullMethodName: true, pb.GatewayService_StreamAgent_FullMethodName: true, diff --git a/pkg/auth/grpc_test.go b/pkg/auth/grpc_test.go index 4a1038b1e..cdfbbe707 100644 --- a/pkg/auth/grpc_test.go +++ b/pkg/auth/grpc_test.go @@ -61,15 +61,16 @@ func TestAuthInterceptorAllowsPublicMarketplaceBrowse(t *testing.T) { } } -func TestAuthInterceptorLetsAgentNodeEnrollmentSelfAuthenticate(t *testing.T) { +func TestAuthInterceptorLetsAgentTokenRPCsSelfAuthenticate(t *testing.T) { interceptor := NewAuthInterceptor(types.AppConfig{}, nil, nil) for _, method := range []string{ + pb.GatewayService_GetAgentPoolVirtualization_FullMethodName, pb.GatewayService_CreateNodeEnrollment_FullMethodName, pb.GatewayService_DeleteNodeEnrollment_FullMethodName, } { if interceptor.isAuthRequired(method) { - t.Fatalf("method %s requires interceptor auth, want agent token field auth", method) + t.Fatalf("method %s requires interceptor auth, want agent token auth", method) } } } diff --git a/pkg/gateway/gateway.proto b/pkg/gateway/gateway.proto index 7338a5775..07a2fd6ca 100644 --- a/pkg/gateway/gateway.proto +++ b/pkg/gateway/gateway.proto @@ -340,6 +340,8 @@ service GatewayService { body : "*" }; } + rpc GetAgentPoolVirtualization(GetAgentPoolVirtualizationRequest) + returns (GetAgentPoolVirtualizationResponse); rpc CreateNodeEnrollment(CreateNodeEnrollmentRequest) returns (CreateNodeEnrollmentResponse); rpc DeleteNodeEnrollment(DeleteNodeEnrollmentRequest) @@ -1906,3 +1908,11 @@ message AgentPoolRuntimeConfig { string config_group = 9; bool gpu_virtualized = 10; } + +message GetAgentPoolVirtualizationRequest { string agent_token = 1; } + +message GetAgentPoolVirtualizationResponse { + bool ok = 1; + string err_msg = 2; + bool gpu_virtualized = 3; +} diff --git a/pkg/gateway/services/compute.go b/pkg/gateway/services/compute.go index 51b02789a..a06283e35 100644 --- a/pkg/gateway/services/compute.go +++ b/pkg/gateway/services/compute.go @@ -130,6 +130,10 @@ func (gws *GatewayService) RequestAgentTransportCredential(ctx context.Context, return gws.computeService.RequestAgentTransportCredential(ctx, in) } +func (gws *GatewayService) GetAgentPoolVirtualization(ctx context.Context, in *pb.GetAgentPoolVirtualizationRequest) (*pb.GetAgentPoolVirtualizationResponse, error) { + return gws.computeService.GetAgentPoolVirtualization(ctx, in) +} + func (gws *GatewayService) CreateNodeEnrollment(ctx context.Context, in *pb.CreateNodeEnrollmentRequest) (*pb.CreateNodeEnrollmentResponse, error) { if gws.thunderService == nil { return &pb.CreateNodeEnrollmentResponse{ErrorMsg: "Thunder service is unavailable"}, nil diff --git a/pkg/gateway/services/compute/agent.go b/pkg/gateway/services/compute/agent.go index 7067c9f54..1255093a1 100644 --- a/pkg/gateway/services/compute/agent.go +++ b/pkg/gateway/services/compute/agent.go @@ -364,6 +364,19 @@ func (s *Service) RequestAgentTransportCredential(ctx context.Context, in *pb.Re }, nil } +func (s *Service) GetAgentPoolVirtualization(ctx context.Context, in *pb.GetAgentPoolVirtualizationRequest) (*pb.GetAgentPoolVirtualizationResponse, error) { + agentState, errMsg := s.requireAgentState(ctx, in.GetAgentToken()) + if errMsg != "" { + return &pb.GetAgentPoolVirtualizationResponse{Ok: false, ErrMsg: errMsg}, nil + } + + gpuVirtualized, err := s.agentPoolGPUVirtualized(ctx, agentState) + if err != nil { + return &pb.GetAgentPoolVirtualizationResponse{Ok: false, ErrMsg: err.Error()}, nil + } + return &pb.GetAgentPoolVirtualizationResponse{Ok: true, GpuVirtualized: gpuVirtualized}, nil +} + func (s *Service) StreamAgent(in *pb.StreamAgentRequest, stream pb.GatewayService_StreamAgentServer) error { ctx := stream.Context() agentState, errMsg := s.requireAgentState(ctx, in.AgentToken) @@ -1104,6 +1117,14 @@ func (s *Service) agentBillingConfig(poolState *model.PoolState) *pb.AgentBillin } } +func (s *Service) agentPoolGPUVirtualized(ctx context.Context, agentState *model.AgentTokenState) (bool, error) { + poolState, err := s.getAgentPoolState(ctx, agentState) + if err != nil || poolState == nil || poolState.WorkerConfig == nil { + return false, err + } + return poolState.WorkerConfig.GpuVirtualized, nil +} + func (s *Service) validateAgentTransportConfig(transport string) error { transport = strings.ReplaceAll(firstNonEmpty(transport, types.BackendRouteTransportTSNet), "-", "_") switch transport { diff --git a/pkg/gateway/services/compute/compute_test.go b/pkg/gateway/services/compute/compute_test.go index e9fdaccea..6d9fc3b35 100644 --- a/pkg/gateway/services/compute/compute_test.go +++ b/pkg/gateway/services/compute/compute_test.go @@ -2478,6 +2478,51 @@ func TestIsLocalGatewayURL(t *testing.T) { } } +func TestGetAgentPoolVirtualizationReportsGPUVirtualized(t *testing.T) { + workspaceID := "workspace-1" + poolName := "pool-1" + agentToken := "agent-token" + service := &Service{ + appConfig: types.AppConfig{ + Tailscale: types.TailscaleConfig{ + Enabled: true, + AuthKey: "tskey-auth-gateway", + AgentAuthKey: "tskey-auth-worker", + }, + }, + computeRepo: &fakeComputeRepo{ + pools: map[string][]*model.PoolState{ + workspaceID: { + { + Name: poolName, + WorkerConfig: &types.WorkerPoolConfig{ + GpuVirtualized: true, + }, + }, + }, + }, + machines: map[string][]*model.AgentTokenState{ + fakeComputeKey(workspaceID, poolName): { + { + TokenHash: hashComputeToken(agentToken), + WorkspaceID: workspaceID, + PoolName: poolName, + MachineID: "machine-1", + }, + }, + }, + }, + } + + resp, err := service.GetAgentPoolVirtualization(context.Background(), &pb.GetAgentPoolVirtualizationRequest{AgentToken: agentToken}) + if err != nil { + t.Fatalf("GetAgentPoolVirtualization() error = %v", err) + } + if !resp.GetOk() || !resp.GetGpuVirtualized() { + t.Fatalf("GetAgentPoolVirtualization() = %+v, want gpu virtualized", resp) + } +} + func TestValidateAgentTransportConfig(t *testing.T) { s := &Service{ appConfig: types.AppConfig{ diff --git a/proto/gateway.pb.go b/proto/gateway.pb.go index 57d5402a8..b9188d617 100644 --- a/proto/gateway.pb.go +++ b/proto/gateway.pb.go @@ -14236,6 +14236,110 @@ func (x *AgentPoolRuntimeConfig) GetGpuVirtualized() bool { return false } +type GetAgentPoolVirtualizationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + AgentToken string `protobuf:"bytes,1,opt,name=agent_token,json=agentToken,proto3" json:"agent_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetAgentPoolVirtualizationRequest) Reset() { + *x = GetAgentPoolVirtualizationRequest{} + mi := &file_gateway_proto_msgTypes[192] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetAgentPoolVirtualizationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAgentPoolVirtualizationRequest) ProtoMessage() {} + +func (x *GetAgentPoolVirtualizationRequest) ProtoReflect() protoreflect.Message { + mi := &file_gateway_proto_msgTypes[192] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAgentPoolVirtualizationRequest.ProtoReflect.Descriptor instead. +func (*GetAgentPoolVirtualizationRequest) Descriptor() ([]byte, []int) { + return file_gateway_proto_rawDescGZIP(), []int{192} +} + +func (x *GetAgentPoolVirtualizationRequest) GetAgentToken() string { + if x != nil { + return x.AgentToken + } + return "" +} + +type GetAgentPoolVirtualizationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + GpuVirtualized bool `protobuf:"varint,3,opt,name=gpu_virtualized,json=gpuVirtualized,proto3" json:"gpu_virtualized,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetAgentPoolVirtualizationResponse) Reset() { + *x = GetAgentPoolVirtualizationResponse{} + mi := &file_gateway_proto_msgTypes[193] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetAgentPoolVirtualizationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAgentPoolVirtualizationResponse) ProtoMessage() {} + +func (x *GetAgentPoolVirtualizationResponse) ProtoReflect() protoreflect.Message { + mi := &file_gateway_proto_msgTypes[193] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAgentPoolVirtualizationResponse.ProtoReflect.Descriptor instead. +func (*GetAgentPoolVirtualizationResponse) Descriptor() ([]byte, []int) { + return file_gateway_proto_rawDescGZIP(), []int{193} +} + +func (x *GetAgentPoolVirtualizationResponse) GetOk() bool { + if x != nil { + return x.Ok + } + return false +} + +func (x *GetAgentPoolVirtualizationResponse) GetErrMsg() string { + if x != nil { + return x.ErrMsg + } + return "" +} + +func (x *GetAgentPoolVirtualizationResponse) GetGpuVirtualized() bool { + if x != nil { + return x.GpuVirtualized + } + return false +} + var File_gateway_proto protoreflect.FileDescriptor const file_gateway_proto_rawDesc = "" + @@ -15509,12 +15613,19 @@ const file_gateway_proto_rawDesc = "" + "\x05cache\x18\b \x01(\v2\x1d.gateway.AgentPoolCacheConfigR\x05cache\x12!\n" + "\fconfig_group\x18\t \x01(\tR\vconfigGroup\x12'\n" + "\x0fgpu_virtualized\x18\n" + - " \x01(\bR\x0egpuVirtualized*C\n" + + " \x01(\bR\x0egpuVirtualized\"D\n" + + "!GetAgentPoolVirtualizationRequest\x12\x1f\n" + + "\vagent_token\x18\x01 \x01(\tR\n" + + "agentToken\"v\n" + + "\"GetAgentPoolVirtualizationResponse\x12\x0e\n" + + "\x02ok\x18\x01 \x01(\bR\x02ok\x12\x17\n" + + "\aerr_msg\x18\x02 \x01(\tR\x06errMsg\x12'\n" + + "\x0fgpu_virtualized\x18\x03 \x01(\bR\x0egpuVirtualized*C\n" + "\x1fSyncContainerWorkspaceOperation\x12\t\n" + "\x05WRITE\x10\x00\x12\n" + "\n" + "\x06DELETE\x10\x01\x12\t\n" + - "\x05MOVED\x10\x022\xe8C\n" + + "\x05MOVED\x10\x022\xdfD\n" + "\x0eGatewayService\x12[\n" + "\tAuthorize\x12\x19.gateway.AuthorizeRequest\x1a\x1a.gateway.AuthorizeResponse\"\x17\x82\xd3\xe4\x93\x02\x11\"\x0f/auth/authorize\x12_\n" + "\vSignPayload\x12\x1b.gateway.SignPayloadRequest\x1a\x1c.gateway.SignPayloadResponse\"\x15\x82\xd3\xe4\x93\x02\x0f:\x01*\"\n" + @@ -15574,7 +15685,8 @@ const file_gateway_proto_rawDesc = "" + "\x13RotateMachineSSHKey\x12#.gateway.RotateMachineSSHKeyRequest\x1a$.gateway.RotateMachineSSHKeyResponse\"B\x82\xd3\xe4\x93\x02<:\x01*\"7/pools/{pool_name}/machines/{machine_id}/ssh/key:rotate\x12\xac\x01\n" + "\x15ActivateMachineSSHKey\x12%.gateway.ActivateMachineSSHKeyRequest\x1a&.gateway.ActivateMachineSSHKeyResponse\"D\x82\xd3\xe4\x93\x02>:\x01*\"9/pools/{pool_name}/machines/{machine_id}/ssh/key:activate\x12Z\n" + "\tJoinAgent\x12\x19.gateway.JoinAgentRequest\x1a\x1a.gateway.JoinAgentResponse\"\x16\x82\xd3\xe4\x93\x02\x10:\x01*\"\v/agent/join\x12\xac\x01\n" + - "\x1fRequestAgentTransportCredential\x12/.gateway.RequestAgentTransportCredentialRequest\x1a0.gateway.RequestAgentTransportCredentialResponse\"&\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/agent/transport-credential\x12c\n" + + "\x1fRequestAgentTransportCredential\x12/.gateway.RequestAgentTransportCredentialRequest\x1a0.gateway.RequestAgentTransportCredentialResponse\"&\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/agent/transport-credential\x12u\n" + + "\x1aGetAgentPoolVirtualization\x12*.gateway.GetAgentPoolVirtualizationRequest\x1a+.gateway.GetAgentPoolVirtualizationResponse\x12c\n" + "\x14CreateNodeEnrollment\x12$.gateway.CreateNodeEnrollmentRequest\x1a%.gateway.CreateNodeEnrollmentResponse\x12c\n" + "\x14DeleteNodeEnrollment\x12$.gateway.DeleteNodeEnrollmentRequest\x1a%.gateway.DeleteNodeEnrollmentResponse\x12s\n" + "\x0fListAgentRoutes\x12\x1f.gateway.ListAgentRoutesRequest\x1a .gateway.ListAgentRoutesResponse\"\x1d\x82\xd3\xe4\x93\x02\x17:\x01*\"\x12/agent/routes:list\x12\x8a\x01\n" + @@ -15611,7 +15723,7 @@ func file_gateway_proto_rawDescGZIP() []byte { } var file_gateway_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_gateway_proto_msgTypes = make([]protoimpl.MessageInfo, 202) +var file_gateway_proto_msgTypes = make([]protoimpl.MessageInfo, 204) var file_gateway_proto_goTypes = []any{ (SyncContainerWorkspaceOperation)(0), // 0: gateway.SyncContainerWorkspaceOperation (*AuthorizeRequest)(nil), // 1: gateway.AuthorizeRequest @@ -15806,75 +15918,77 @@ var file_gateway_proto_goTypes = []any{ (*AgentPoolCacheDiskConfig)(nil), // 190: gateway.AgentPoolCacheDiskConfig (*AgentPoolCacheConfig)(nil), // 191: gateway.AgentPoolCacheConfig (*AgentPoolRuntimeConfig)(nil), // 192: gateway.AgentPoolRuntimeConfig - nil, // 193: gateway.CreateObjectResponse.PutHeadersEntry - nil, // 194: gateway.ListTasksRequest.FiltersEntry - nil, // 195: gateway.Schema.FieldsEntry - nil, // 196: gateway.ListDeploymentsRequest.FiltersEntry - nil, // 197: gateway.ListPoolsRequest.FiltersEntry - nil, // 198: gateway.ListPrivatePoolsRequest.FiltersEntry - nil, // 199: gateway.UpdateAgentRouteStatusRequest.AttrsEntry - nil, // 200: gateway.AgentEventRecord.AttrsEntry - nil, // 201: gateway.ListMachinesResponse.GpusEntry - nil, // 202: gateway.ListMachinesResponse.SupportedGpusEntry - (*Container)(nil), // 203: types.Container - (*timestamppb.Timestamp)(nil), // 204: google.protobuf.Timestamp - (*MountPointConfig)(nil), // 205: types.MountPointConfig - (*PricingPolicy)(nil), // 206: types.PricingPolicy - (*CheckpointTrigger)(nil), // 207: types.CheckpointTrigger - (*WorkerPoolState)(nil), // 208: types.WorkerPoolState - (*Worker)(nil), // 209: types.Worker + (*GetAgentPoolVirtualizationRequest)(nil), // 193: gateway.GetAgentPoolVirtualizationRequest + (*GetAgentPoolVirtualizationResponse)(nil), // 194: gateway.GetAgentPoolVirtualizationResponse + nil, // 195: gateway.CreateObjectResponse.PutHeadersEntry + nil, // 196: gateway.ListTasksRequest.FiltersEntry + nil, // 197: gateway.Schema.FieldsEntry + nil, // 198: gateway.ListDeploymentsRequest.FiltersEntry + nil, // 199: gateway.ListPoolsRequest.FiltersEntry + nil, // 200: gateway.ListPrivatePoolsRequest.FiltersEntry + nil, // 201: gateway.UpdateAgentRouteStatusRequest.AttrsEntry + nil, // 202: gateway.AgentEventRecord.AttrsEntry + nil, // 203: gateway.ListMachinesResponse.GpusEntry + nil, // 204: gateway.ListMachinesResponse.SupportedGpusEntry + (*Container)(nil), // 205: types.Container + (*timestamppb.Timestamp)(nil), // 206: google.protobuf.Timestamp + (*MountPointConfig)(nil), // 207: types.MountPointConfig + (*PricingPolicy)(nil), // 208: types.PricingPolicy + (*CheckpointTrigger)(nil), // 209: types.CheckpointTrigger + (*WorkerPoolState)(nil), // 210: types.WorkerPoolState + (*Worker)(nil), // 211: types.Worker } var file_gateway_proto_depIdxs = []int32{ 5, // 0: gateway.HeadObjectResponse.object_metadata:type_name -> gateway.ObjectMetadata 5, // 1: gateway.CreateObjectRequest.object_metadata:type_name -> gateway.ObjectMetadata - 193, // 2: gateway.CreateObjectResponse.put_headers:type_name -> gateway.CreateObjectResponse.PutHeadersEntry + 195, // 2: gateway.CreateObjectResponse.put_headers:type_name -> gateway.CreateObjectResponse.PutHeadersEntry 5, // 3: gateway.PutObjectRequest.object_metadata:type_name -> gateway.ObjectMetadata 0, // 4: gateway.SyncContainerWorkspaceRequest.op:type_name -> gateway.SyncContainerWorkspaceOperation - 203, // 5: gateway.ListContainersResponse.containers:type_name -> types.Container + 205, // 5: gateway.ListContainersResponse.containers:type_name -> types.Container 21, // 6: gateway.ContainerStreamMessage.attach_request:type_name -> gateway.AttachToContainerRequest 12, // 7: gateway.ContainerStreamMessage.sync_container_workspace:type_name -> gateway.SyncContainerWorkspaceRequest - 194, // 8: gateway.ListTasksRequest.filters:type_name -> gateway.ListTasksRequest.FiltersEntry - 204, // 9: gateway.Task.started_at:type_name -> google.protobuf.Timestamp - 204, // 10: gateway.Task.ended_at:type_name -> google.protobuf.Timestamp - 204, // 11: gateway.Task.created_at:type_name -> google.protobuf.Timestamp - 204, // 12: gateway.Task.updated_at:type_name -> google.protobuf.Timestamp + 196, // 8: gateway.ListTasksRequest.filters:type_name -> gateway.ListTasksRequest.FiltersEntry + 206, // 9: gateway.Task.started_at:type_name -> google.protobuf.Timestamp + 206, // 10: gateway.Task.ended_at:type_name -> google.protobuf.Timestamp + 206, // 11: gateway.Task.created_at:type_name -> google.protobuf.Timestamp + 206, // 12: gateway.Task.updated_at:type_name -> google.protobuf.Timestamp 29, // 13: gateway.ListTasksResponse.tasks:type_name -> gateway.Task - 205, // 14: gateway.Volume.config:type_name -> types.MountPointConfig + 207, // 14: gateway.Volume.config:type_name -> types.MountPointConfig 36, // 15: gateway.ServingConfig.llm:type_name -> gateway.LLMConfig 37, // 16: gateway.ServingConfig.database:type_name -> gateway.DatabaseServingConfig - 195, // 17: gateway.Schema.fields:type_name -> gateway.Schema.FieldsEntry + 197, // 17: gateway.Schema.fields:type_name -> gateway.Schema.FieldsEntry 41, // 18: gateway.SchemaField.fields:type_name -> gateway.Schema 33, // 19: gateway.GetOrCreateStubRequest.volumes:type_name -> gateway.Volume 34, // 20: gateway.GetOrCreateStubRequest.secrets:type_name -> gateway.SecretVar 35, // 21: gateway.GetOrCreateStubRequest.autoscaler:type_name -> gateway.Autoscaler 40, // 22: gateway.GetOrCreateStubRequest.task_policy:type_name -> gateway.TaskPolicy - 206, // 23: gateway.GetOrCreateStubRequest.pricing:type_name -> types.PricingPolicy + 208, // 23: gateway.GetOrCreateStubRequest.pricing:type_name -> types.PricingPolicy 41, // 24: gateway.GetOrCreateStubRequest.inputs:type_name -> gateway.Schema 41, // 25: gateway.GetOrCreateStubRequest.outputs:type_name -> gateway.Schema 61, // 26: gateway.GetOrCreateStubRequest.pool:type_name -> gateway.PoolConfig 38, // 27: gateway.GetOrCreateStubRequest.serving:type_name -> gateway.ServingConfig 39, // 28: gateway.GetOrCreateStubRequest.disks:type_name -> gateway.DurableDisk - 207, // 29: gateway.GetOrCreateStubRequest.checkpoint_trigger:type_name -> types.CheckpointTrigger - 204, // 30: gateway.Deployment.created_at:type_name -> google.protobuf.Timestamp - 204, // 31: gateway.Deployment.updated_at:type_name -> google.protobuf.Timestamp - 196, // 32: gateway.ListDeploymentsRequest.filters:type_name -> gateway.ListDeploymentsRequest.FiltersEntry + 209, // 29: gateway.GetOrCreateStubRequest.checkpoint_trigger:type_name -> types.CheckpointTrigger + 206, // 30: gateway.Deployment.created_at:type_name -> google.protobuf.Timestamp + 206, // 31: gateway.Deployment.updated_at:type_name -> google.protobuf.Timestamp + 198, // 32: gateway.ListDeploymentsRequest.filters:type_name -> gateway.ListDeploymentsRequest.FiltersEntry 47, // 33: gateway.ListDeploymentsResponse.deployments:type_name -> gateway.Deployment - 208, // 34: gateway.Pool.state:type_name -> types.WorkerPoolState - 197, // 35: gateway.ListPoolsRequest.filters:type_name -> gateway.ListPoolsRequest.FiltersEntry + 210, // 34: gateway.Pool.state:type_name -> types.WorkerPoolState + 199, // 35: gateway.ListPoolsRequest.filters:type_name -> gateway.ListPoolsRequest.FiltersEntry 58, // 36: gateway.ListPoolsResponse.pools:type_name -> gateway.Pool - 204, // 37: gateway.ProviderInstance.created_at:type_name -> google.protobuf.Timestamp - 204, // 38: gateway.ProviderInstance.expires_at:type_name -> google.protobuf.Timestamp - 204, // 39: gateway.ProviderInstance.billing_renewal_at:type_name -> google.protobuf.Timestamp + 206, // 37: gateway.ProviderInstance.created_at:type_name -> google.protobuf.Timestamp + 206, // 38: gateway.ProviderInstance.expires_at:type_name -> google.protobuf.Timestamp + 206, // 39: gateway.ProviderInstance.billing_renewal_at:type_name -> google.protobuf.Timestamp 61, // 40: gateway.PrivatePool.config:type_name -> gateway.PoolConfig 63, // 41: gateway.PrivatePool.reservations:type_name -> gateway.ProviderInstance - 204, // 42: gateway.PrivatePool.created_at:type_name -> google.protobuf.Timestamp - 204, // 43: gateway.PrivatePool.expires_at:type_name -> google.protobuf.Timestamp + 206, // 42: gateway.PrivatePool.created_at:type_name -> google.protobuf.Timestamp + 206, // 43: gateway.PrivatePool.expires_at:type_name -> google.protobuf.Timestamp 73, // 44: gateway.PrivatePool.byoc:type_name -> gateway.BYOCPoolState 61, // 45: gateway.ListPoolOffersRequest.pool:type_name -> gateway.PoolConfig 62, // 46: gateway.ListPoolOffersResponse.offers:type_name -> gateway.PoolOffer 61, // 47: gateway.LaunchPoolCapacityRequest.pool:type_name -> gateway.PoolConfig 64, // 48: gateway.LaunchPoolCapacityResponse.pool:type_name -> gateway.PrivatePool - 198, // 49: gateway.ListPrivatePoolsRequest.filters:type_name -> gateway.ListPrivatePoolsRequest.FiltersEntry + 200, // 49: gateway.ListPrivatePoolsRequest.filters:type_name -> gateway.ListPrivatePoolsRequest.FiltersEntry 64, // 50: gateway.ListPrivatePoolsResponse.pools:type_name -> gateway.PrivatePool 64, // 51: gateway.CreateBYOCPoolResponse.pool:type_name -> gateway.PrivatePool 73, // 52: gateway.CreateBYOCPoolResponse.byoc:type_name -> gateway.BYOCPoolState @@ -15882,16 +15996,16 @@ var file_gateway_proto_depIdxs = []int32{ 73, // 54: gateway.GetBYOCPoolResponse.byoc:type_name -> gateway.BYOCPoolState 64, // 55: gateway.ScaleBYOCPoolResponse.pool:type_name -> gateway.PrivatePool 73, // 56: gateway.ScaleBYOCPoolResponse.byoc:type_name -> gateway.BYOCPoolState - 204, // 57: gateway.MarketplaceListing.created_at:type_name -> google.protobuf.Timestamp - 204, // 58: gateway.MarketplaceListing.updated_at:type_name -> google.protobuf.Timestamp - 204, // 59: gateway.MarketplaceOffer.created_at:type_name -> google.protobuf.Timestamp + 206, // 57: gateway.MarketplaceListing.created_at:type_name -> google.protobuf.Timestamp + 206, // 58: gateway.MarketplaceListing.updated_at:type_name -> google.protobuf.Timestamp + 206, // 59: gateway.MarketplaceOffer.created_at:type_name -> google.protobuf.Timestamp 78, // 60: gateway.CreateMarketplaceListingResponse.listing:type_name -> gateway.MarketplaceListing 78, // 61: gateway.UpdateMarketplaceListingResponse.listing:type_name -> gateway.MarketplaceListing 78, // 62: gateway.ListMarketplaceListingsResponse.listings:type_name -> gateway.MarketplaceListing - 204, // 63: gateway.GetMarketplaceJoinCommandResponse.expires_at:type_name -> google.protobuf.Timestamp + 206, // 63: gateway.GetMarketplaceJoinCommandResponse.expires_at:type_name -> google.protobuf.Timestamp 79, // 64: gateway.ListMarketplaceOffersResponse.offers:type_name -> gateway.MarketplaceOffer 79, // 65: gateway.GetMarketplaceOfferResponse.offer:type_name -> gateway.MarketplaceOffer - 204, // 66: gateway.MarketplaceRental.created_at:type_name -> google.protobuf.Timestamp + 206, // 66: gateway.MarketplaceRental.created_at:type_name -> google.protobuf.Timestamp 94, // 67: gateway.CreateMarketplaceRentalResponse.rental:type_name -> gateway.MarketplaceRental 94, // 68: gateway.ListMarketplaceRentalsResponse.rentals:type_name -> gateway.MarketplaceRental 148, // 69: gateway.ListMarketplaceMachinesResponse.machines:type_name -> gateway.Machine @@ -15899,8 +16013,8 @@ var file_gateway_proto_depIdxs = []int32{ 61, // 71: gateway.CreatePoolRequest.pool:type_name -> gateway.PoolConfig 64, // 72: gateway.CreatePoolResponse.pool:type_name -> gateway.PrivatePool 64, // 73: gateway.ExtendPoolCapacityResponse.pool:type_name -> gateway.PrivatePool - 204, // 74: gateway.CreatePoolJoinTokenResponse.expires_at:type_name -> google.protobuf.Timestamp - 204, // 75: gateway.GetPoolJoinCommandResponse.expires_at:type_name -> google.protobuf.Timestamp + 206, // 74: gateway.CreatePoolJoinTokenResponse.expires_at:type_name -> google.protobuf.Timestamp + 206, // 75: gateway.GetPoolJoinCommandResponse.expires_at:type_name -> google.protobuf.Timestamp 148, // 76: gateway.ListPoolMachinesResponse.machines:type_name -> gateway.Machine 124, // 77: gateway.AgentBootstrapConfig.telemetry:type_name -> gateway.AgentTelemetryConfig 123, // 78: gateway.AgentBootstrapConfig.billing:type_name -> gateway.AgentBillingConfig @@ -15909,13 +16023,13 @@ var file_gateway_proto_depIdxs = []int32{ 128, // 81: gateway.JoinAgentRequest.preflight:type_name -> gateway.AgentPreflightCheck 122, // 82: gateway.JoinAgentResponse.bootstrap:type_name -> gateway.AgentBootstrapConfig 129, // 83: gateway.ListAgentRoutesResponse.routes:type_name -> gateway.AgentRoute - 199, // 84: gateway.UpdateAgentRouteStatusRequest.attrs:type_name -> gateway.UpdateAgentRouteStatusRequest.AttrsEntry + 201, // 84: gateway.UpdateAgentRouteStatusRequest.attrs:type_name -> gateway.UpdateAgentRouteStatusRequest.AttrsEntry 192, // 85: gateway.AgentWorkerSlot.pool_config:type_name -> gateway.AgentPoolRuntimeConfig 129, // 86: gateway.StreamAgentResponse.routes:type_name -> gateway.AgentRoute 140, // 87: gateway.StreamAgentResponse.slots:type_name -> gateway.AgentWorkerSlot 186, // 88: gateway.StreamAgentResponse.ssh:type_name -> gateway.AgentSSHConfig 150, // 89: gateway.AgentMetricSnapshot.path_metrics:type_name -> gateway.MachinePathMetrics - 200, // 90: gateway.AgentEventRecord.attrs:type_name -> gateway.AgentEventRecord.AttrsEntry + 202, // 90: gateway.AgentEventRecord.attrs:type_name -> gateway.AgentEventRecord.AttrsEntry 143, // 91: gateway.AgentTelemetryRequest.logs:type_name -> gateway.AgentLogRecord 144, // 92: gateway.AgentTelemetryRequest.metrics:type_name -> gateway.AgentMetricSnapshot 145, // 93: gateway.AgentTelemetryRequest.events:type_name -> gateway.AgentEventRecord @@ -15923,18 +16037,18 @@ var file_gateway_proto_depIdxs = []int32{ 189, // 95: gateway.Machine.ssh:type_name -> gateway.MachineSSHAccess 150, // 96: gateway.MachineMetrics.path_metrics:type_name -> gateway.MachinePathMetrics 148, // 97: gateway.ListMachinesResponse.machines:type_name -> gateway.Machine - 201, // 98: gateway.ListMachinesResponse.gpus:type_name -> gateway.ListMachinesResponse.GpusEntry - 202, // 99: gateway.ListMachinesResponse.supported_gpus:type_name -> gateway.ListMachinesResponse.SupportedGpusEntry + 203, // 98: gateway.ListMachinesResponse.gpus:type_name -> gateway.ListMachinesResponse.GpusEntry + 204, // 99: gateway.ListMachinesResponse.supported_gpus:type_name -> gateway.ListMachinesResponse.SupportedGpusEntry 148, // 100: gateway.CreateMachineResponse.machine:type_name -> gateway.Machine - 204, // 101: gateway.Token.created_at:type_name -> google.protobuf.Timestamp - 204, // 102: gateway.Token.updated_at:type_name -> google.protobuf.Timestamp + 206, // 101: gateway.Token.created_at:type_name -> google.protobuf.Timestamp + 206, // 102: gateway.Token.updated_at:type_name -> google.protobuf.Timestamp 157, // 103: gateway.ListTokensResponse.tokens:type_name -> gateway.Token 157, // 104: gateway.CreateTokenResponse.token:type_name -> gateway.Token 157, // 105: gateway.ToggleTokenResponse.token:type_name -> gateway.Token - 209, // 106: gateway.ListWorkersResponse.workers:type_name -> types.Worker + 211, // 106: gateway.ListWorkersResponse.workers:type_name -> types.Worker 189, // 107: gateway.RotateMachineSSHKeyResponse.ssh:type_name -> gateway.MachineSSHAccess 189, // 108: gateway.ActivateMachineSSHKeyResponse.ssh:type_name -> gateway.MachineSSHAccess - 204, // 109: gateway.MachineSSHAccess.updated_at:type_name -> google.protobuf.Timestamp + 206, // 109: gateway.MachineSSHAccess.updated_at:type_name -> google.protobuf.Timestamp 190, // 110: gateway.AgentPoolCacheConfig.disk:type_name -> gateway.AgentPoolCacheDiskConfig 191, // 111: gateway.AgentPoolRuntimeConfig.cache:type_name -> gateway.AgentPoolCacheConfig 27, // 112: gateway.ListTasksRequest.FiltersEntry.value:type_name -> gateway.StringList @@ -15995,101 +16109,103 @@ var file_gateway_proto_depIdxs = []int32{ 184, // 167: gateway.GatewayService.ActivateMachineSSHKey:input_type -> gateway.ActivateMachineSSHKeyRequest 126, // 168: gateway.GatewayService.JoinAgent:input_type -> gateway.JoinAgentRequest 130, // 169: gateway.GatewayService.RequestAgentTransportCredential:input_type -> gateway.RequestAgentTransportCredentialRequest - 132, // 170: gateway.GatewayService.CreateNodeEnrollment:input_type -> gateway.CreateNodeEnrollmentRequest - 134, // 171: gateway.GatewayService.DeleteNodeEnrollment:input_type -> gateway.DeleteNodeEnrollmentRequest - 136, // 172: gateway.GatewayService.ListAgentRoutes:input_type -> gateway.ListAgentRoutesRequest - 138, // 173: gateway.GatewayService.UpdateAgentRouteStatus:input_type -> gateway.UpdateAgentRouteStatusRequest - 187, // 174: gateway.GatewayService.UpdateAgentSSHStatus:input_type -> gateway.UpdateAgentSSHStatusRequest - 178, // 175: gateway.GatewayService.UpdateAgentAvailability:input_type -> gateway.UpdateAgentAvailabilityRequest - 141, // 176: gateway.GatewayService.StreamAgent:input_type -> gateway.StreamAgentRequest - 146, // 177: gateway.GatewayService.StreamAgentTelemetry:input_type -> gateway.AgentTelemetryRequest - 151, // 178: gateway.GatewayService.ListMachines:input_type -> gateway.ListMachinesRequest - 153, // 179: gateway.GatewayService.CreateMachine:input_type -> gateway.CreateMachineRequest - 155, // 180: gateway.GatewayService.DeleteMachine:input_type -> gateway.DeleteMachineRequest - 158, // 181: gateway.GatewayService.ListTokens:input_type -> gateway.ListTokensRequest - 160, // 182: gateway.GatewayService.CreateToken:input_type -> gateway.CreateTokenRequest - 162, // 183: gateway.GatewayService.ToggleToken:input_type -> gateway.ToggleTokenRequest - 164, // 184: gateway.GatewayService.DeleteToken:input_type -> gateway.DeleteTokenRequest - 168, // 185: gateway.GatewayService.ListWorkers:input_type -> gateway.ListWorkersRequest - 170, // 186: gateway.GatewayService.CordonWorker:input_type -> gateway.CordonWorkerRequest - 172, // 187: gateway.GatewayService.UncordonWorker:input_type -> gateway.UncordonWorkerRequest - 174, // 188: gateway.GatewayService.DrainWorker:input_type -> gateway.DrainWorkerRequest - 176, // 189: gateway.GatewayService.ExportWorkspaceConfig:input_type -> gateway.ExportWorkspaceConfigRequest - 2, // 190: gateway.GatewayService.Authorize:output_type -> gateway.AuthorizeResponse - 4, // 191: gateway.GatewayService.SignPayload:output_type -> gateway.SignPayloadResponse - 7, // 192: gateway.GatewayService.HeadObject:output_type -> gateway.HeadObjectResponse - 9, // 193: gateway.GatewayService.CreateObject:output_type -> gateway.CreateObjectResponse - 11, // 194: gateway.GatewayService.PutObjectStream:output_type -> gateway.PutObjectResponse - 19, // 195: gateway.GatewayService.CheckpointContainer:output_type -> gateway.CheckpointContainerResponse - 15, // 196: gateway.GatewayService.ListContainers:output_type -> gateway.ListContainersResponse - 17, // 197: gateway.GatewayService.StopContainer:output_type -> gateway.StopContainerResponse - 22, // 198: gateway.GatewayService.AttachToContainer:output_type -> gateway.AttachToContainerResponse - 24, // 199: gateway.GatewayService.StartTask:output_type -> gateway.StartTaskResponse - 26, // 200: gateway.GatewayService.EndTask:output_type -> gateway.EndTaskResponse - 32, // 201: gateway.GatewayService.StopTasks:output_type -> gateway.StopTasksResponse - 30, // 202: gateway.GatewayService.ListTasks:output_type -> gateway.ListTasksResponse - 44, // 203: gateway.GatewayService.GetOrCreateStub:output_type -> gateway.GetOrCreateStubResponse - 46, // 204: gateway.GatewayService.DeployStub:output_type -> gateway.DeployStubResponse - 167, // 205: gateway.GatewayService.GetURL:output_type -> gateway.GetURLResponse - 49, // 206: gateway.GatewayService.ListDeployments:output_type -> gateway.ListDeploymentsResponse - 51, // 207: gateway.GatewayService.StopDeployment:output_type -> gateway.StopDeploymentResponse - 53, // 208: gateway.GatewayService.StartDeployment:output_type -> gateway.StartDeploymentResponse - 55, // 209: gateway.GatewayService.ScaleDeployment:output_type -> gateway.ScaleDeploymentResponse - 57, // 210: gateway.GatewayService.DeleteDeployment:output_type -> gateway.DeleteDeploymentResponse - 60, // 211: gateway.GatewayService.ListPools:output_type -> gateway.ListPoolsResponse - 66, // 212: gateway.GatewayService.ListPoolOffers:output_type -> gateway.ListPoolOffersResponse - 68, // 213: gateway.GatewayService.LaunchPoolCapacity:output_type -> gateway.LaunchPoolCapacityResponse - 70, // 214: gateway.GatewayService.ListPrivatePools:output_type -> gateway.ListPrivatePoolsResponse - 72, // 215: gateway.GatewayService.CreateBYOCPool:output_type -> gateway.CreateBYOCPoolResponse - 75, // 216: gateway.GatewayService.GetBYOCPool:output_type -> gateway.GetBYOCPoolResponse - 77, // 217: gateway.GatewayService.ScaleBYOCPool:output_type -> gateway.ScaleBYOCPoolResponse - 81, // 218: gateway.GatewayService.CreateMarketplaceListing:output_type -> gateway.CreateMarketplaceListingResponse - 83, // 219: gateway.GatewayService.UpdateMarketplaceListing:output_type -> gateway.UpdateMarketplaceListingResponse - 85, // 220: gateway.GatewayService.DeleteMarketplaceListing:output_type -> gateway.DeleteMarketplaceListingResponse - 87, // 221: gateway.GatewayService.ListMarketplaceListings:output_type -> gateway.ListMarketplaceListingsResponse - 89, // 222: gateway.GatewayService.GetMarketplaceJoinCommand:output_type -> gateway.GetMarketplaceJoinCommandResponse - 91, // 223: gateway.GatewayService.ListMarketplaceOffers:output_type -> gateway.ListMarketplaceOffersResponse - 93, // 224: gateway.GatewayService.GetMarketplaceOffer:output_type -> gateway.GetMarketplaceOfferResponse - 96, // 225: gateway.GatewayService.CreateMarketplaceRental:output_type -> gateway.CreateMarketplaceRentalResponse - 98, // 226: gateway.GatewayService.ListMarketplaceRentals:output_type -> gateway.ListMarketplaceRentalsResponse - 100, // 227: gateway.GatewayService.DeleteMarketplaceRental:output_type -> gateway.DeleteMarketplaceRentalResponse - 102, // 228: gateway.GatewayService.LaunchRentalWorkload:output_type -> gateway.LaunchRentalWorkloadResponse - 104, // 229: gateway.GatewayService.ListMarketplaceMachines:output_type -> gateway.ListMarketplaceMachinesResponse - 107, // 230: gateway.GatewayService.ListMachineContainers:output_type -> gateway.ListMachineContainersResponse - 109, // 231: gateway.GatewayService.CreatePool:output_type -> gateway.CreatePoolResponse - 111, // 232: gateway.GatewayService.DeletePool:output_type -> gateway.DeletePoolResponse - 113, // 233: gateway.GatewayService.ExtendPoolCapacity:output_type -> gateway.ExtendPoolCapacityResponse - 115, // 234: gateway.GatewayService.CreatePoolJoinToken:output_type -> gateway.CreatePoolJoinTokenResponse - 117, // 235: gateway.GatewayService.RevokePoolJoinToken:output_type -> gateway.RevokePoolJoinTokenResponse - 119, // 236: gateway.GatewayService.GetPoolJoinCommand:output_type -> gateway.GetPoolJoinCommandResponse - 121, // 237: gateway.GatewayService.ListPoolMachines:output_type -> gateway.ListPoolMachinesResponse - 181, // 238: gateway.GatewayService.DownloadMachineSSHKey:output_type -> gateway.DownloadMachineSSHKeyResponse - 183, // 239: gateway.GatewayService.RotateMachineSSHKey:output_type -> gateway.RotateMachineSSHKeyResponse - 185, // 240: gateway.GatewayService.ActivateMachineSSHKey:output_type -> gateway.ActivateMachineSSHKeyResponse - 127, // 241: gateway.GatewayService.JoinAgent:output_type -> gateway.JoinAgentResponse - 131, // 242: gateway.GatewayService.RequestAgentTransportCredential:output_type -> gateway.RequestAgentTransportCredentialResponse - 133, // 243: gateway.GatewayService.CreateNodeEnrollment:output_type -> gateway.CreateNodeEnrollmentResponse - 135, // 244: gateway.GatewayService.DeleteNodeEnrollment:output_type -> gateway.DeleteNodeEnrollmentResponse - 137, // 245: gateway.GatewayService.ListAgentRoutes:output_type -> gateway.ListAgentRoutesResponse - 139, // 246: gateway.GatewayService.UpdateAgentRouteStatus:output_type -> gateway.UpdateAgentRouteStatusResponse - 188, // 247: gateway.GatewayService.UpdateAgentSSHStatus:output_type -> gateway.UpdateAgentSSHStatusResponse - 179, // 248: gateway.GatewayService.UpdateAgentAvailability:output_type -> gateway.UpdateAgentAvailabilityResponse - 142, // 249: gateway.GatewayService.StreamAgent:output_type -> gateway.StreamAgentResponse - 147, // 250: gateway.GatewayService.StreamAgentTelemetry:output_type -> gateway.AgentTelemetryResponse - 152, // 251: gateway.GatewayService.ListMachines:output_type -> gateway.ListMachinesResponse - 154, // 252: gateway.GatewayService.CreateMachine:output_type -> gateway.CreateMachineResponse - 156, // 253: gateway.GatewayService.DeleteMachine:output_type -> gateway.DeleteMachineResponse - 159, // 254: gateway.GatewayService.ListTokens:output_type -> gateway.ListTokensResponse - 161, // 255: gateway.GatewayService.CreateToken:output_type -> gateway.CreateTokenResponse - 163, // 256: gateway.GatewayService.ToggleToken:output_type -> gateway.ToggleTokenResponse - 165, // 257: gateway.GatewayService.DeleteToken:output_type -> gateway.DeleteTokenResponse - 169, // 258: gateway.GatewayService.ListWorkers:output_type -> gateway.ListWorkersResponse - 171, // 259: gateway.GatewayService.CordonWorker:output_type -> gateway.CordonWorkerResponse - 173, // 260: gateway.GatewayService.UncordonWorker:output_type -> gateway.UncordonWorkerResponse - 175, // 261: gateway.GatewayService.DrainWorker:output_type -> gateway.DrainWorkerResponse - 177, // 262: gateway.GatewayService.ExportWorkspaceConfig:output_type -> gateway.ExportWorkspaceConfigResponse - 190, // [190:263] is the sub-list for method output_type - 117, // [117:190] is the sub-list for method input_type + 193, // 170: gateway.GatewayService.GetAgentPoolVirtualization:input_type -> gateway.GetAgentPoolVirtualizationRequest + 132, // 171: gateway.GatewayService.CreateNodeEnrollment:input_type -> gateway.CreateNodeEnrollmentRequest + 134, // 172: gateway.GatewayService.DeleteNodeEnrollment:input_type -> gateway.DeleteNodeEnrollmentRequest + 136, // 173: gateway.GatewayService.ListAgentRoutes:input_type -> gateway.ListAgentRoutesRequest + 138, // 174: gateway.GatewayService.UpdateAgentRouteStatus:input_type -> gateway.UpdateAgentRouteStatusRequest + 187, // 175: gateway.GatewayService.UpdateAgentSSHStatus:input_type -> gateway.UpdateAgentSSHStatusRequest + 178, // 176: gateway.GatewayService.UpdateAgentAvailability:input_type -> gateway.UpdateAgentAvailabilityRequest + 141, // 177: gateway.GatewayService.StreamAgent:input_type -> gateway.StreamAgentRequest + 146, // 178: gateway.GatewayService.StreamAgentTelemetry:input_type -> gateway.AgentTelemetryRequest + 151, // 179: gateway.GatewayService.ListMachines:input_type -> gateway.ListMachinesRequest + 153, // 180: gateway.GatewayService.CreateMachine:input_type -> gateway.CreateMachineRequest + 155, // 181: gateway.GatewayService.DeleteMachine:input_type -> gateway.DeleteMachineRequest + 158, // 182: gateway.GatewayService.ListTokens:input_type -> gateway.ListTokensRequest + 160, // 183: gateway.GatewayService.CreateToken:input_type -> gateway.CreateTokenRequest + 162, // 184: gateway.GatewayService.ToggleToken:input_type -> gateway.ToggleTokenRequest + 164, // 185: gateway.GatewayService.DeleteToken:input_type -> gateway.DeleteTokenRequest + 168, // 186: gateway.GatewayService.ListWorkers:input_type -> gateway.ListWorkersRequest + 170, // 187: gateway.GatewayService.CordonWorker:input_type -> gateway.CordonWorkerRequest + 172, // 188: gateway.GatewayService.UncordonWorker:input_type -> gateway.UncordonWorkerRequest + 174, // 189: gateway.GatewayService.DrainWorker:input_type -> gateway.DrainWorkerRequest + 176, // 190: gateway.GatewayService.ExportWorkspaceConfig:input_type -> gateway.ExportWorkspaceConfigRequest + 2, // 191: gateway.GatewayService.Authorize:output_type -> gateway.AuthorizeResponse + 4, // 192: gateway.GatewayService.SignPayload:output_type -> gateway.SignPayloadResponse + 7, // 193: gateway.GatewayService.HeadObject:output_type -> gateway.HeadObjectResponse + 9, // 194: gateway.GatewayService.CreateObject:output_type -> gateway.CreateObjectResponse + 11, // 195: gateway.GatewayService.PutObjectStream:output_type -> gateway.PutObjectResponse + 19, // 196: gateway.GatewayService.CheckpointContainer:output_type -> gateway.CheckpointContainerResponse + 15, // 197: gateway.GatewayService.ListContainers:output_type -> gateway.ListContainersResponse + 17, // 198: gateway.GatewayService.StopContainer:output_type -> gateway.StopContainerResponse + 22, // 199: gateway.GatewayService.AttachToContainer:output_type -> gateway.AttachToContainerResponse + 24, // 200: gateway.GatewayService.StartTask:output_type -> gateway.StartTaskResponse + 26, // 201: gateway.GatewayService.EndTask:output_type -> gateway.EndTaskResponse + 32, // 202: gateway.GatewayService.StopTasks:output_type -> gateway.StopTasksResponse + 30, // 203: gateway.GatewayService.ListTasks:output_type -> gateway.ListTasksResponse + 44, // 204: gateway.GatewayService.GetOrCreateStub:output_type -> gateway.GetOrCreateStubResponse + 46, // 205: gateway.GatewayService.DeployStub:output_type -> gateway.DeployStubResponse + 167, // 206: gateway.GatewayService.GetURL:output_type -> gateway.GetURLResponse + 49, // 207: gateway.GatewayService.ListDeployments:output_type -> gateway.ListDeploymentsResponse + 51, // 208: gateway.GatewayService.StopDeployment:output_type -> gateway.StopDeploymentResponse + 53, // 209: gateway.GatewayService.StartDeployment:output_type -> gateway.StartDeploymentResponse + 55, // 210: gateway.GatewayService.ScaleDeployment:output_type -> gateway.ScaleDeploymentResponse + 57, // 211: gateway.GatewayService.DeleteDeployment:output_type -> gateway.DeleteDeploymentResponse + 60, // 212: gateway.GatewayService.ListPools:output_type -> gateway.ListPoolsResponse + 66, // 213: gateway.GatewayService.ListPoolOffers:output_type -> gateway.ListPoolOffersResponse + 68, // 214: gateway.GatewayService.LaunchPoolCapacity:output_type -> gateway.LaunchPoolCapacityResponse + 70, // 215: gateway.GatewayService.ListPrivatePools:output_type -> gateway.ListPrivatePoolsResponse + 72, // 216: gateway.GatewayService.CreateBYOCPool:output_type -> gateway.CreateBYOCPoolResponse + 75, // 217: gateway.GatewayService.GetBYOCPool:output_type -> gateway.GetBYOCPoolResponse + 77, // 218: gateway.GatewayService.ScaleBYOCPool:output_type -> gateway.ScaleBYOCPoolResponse + 81, // 219: gateway.GatewayService.CreateMarketplaceListing:output_type -> gateway.CreateMarketplaceListingResponse + 83, // 220: gateway.GatewayService.UpdateMarketplaceListing:output_type -> gateway.UpdateMarketplaceListingResponse + 85, // 221: gateway.GatewayService.DeleteMarketplaceListing:output_type -> gateway.DeleteMarketplaceListingResponse + 87, // 222: gateway.GatewayService.ListMarketplaceListings:output_type -> gateway.ListMarketplaceListingsResponse + 89, // 223: gateway.GatewayService.GetMarketplaceJoinCommand:output_type -> gateway.GetMarketplaceJoinCommandResponse + 91, // 224: gateway.GatewayService.ListMarketplaceOffers:output_type -> gateway.ListMarketplaceOffersResponse + 93, // 225: gateway.GatewayService.GetMarketplaceOffer:output_type -> gateway.GetMarketplaceOfferResponse + 96, // 226: gateway.GatewayService.CreateMarketplaceRental:output_type -> gateway.CreateMarketplaceRentalResponse + 98, // 227: gateway.GatewayService.ListMarketplaceRentals:output_type -> gateway.ListMarketplaceRentalsResponse + 100, // 228: gateway.GatewayService.DeleteMarketplaceRental:output_type -> gateway.DeleteMarketplaceRentalResponse + 102, // 229: gateway.GatewayService.LaunchRentalWorkload:output_type -> gateway.LaunchRentalWorkloadResponse + 104, // 230: gateway.GatewayService.ListMarketplaceMachines:output_type -> gateway.ListMarketplaceMachinesResponse + 107, // 231: gateway.GatewayService.ListMachineContainers:output_type -> gateway.ListMachineContainersResponse + 109, // 232: gateway.GatewayService.CreatePool:output_type -> gateway.CreatePoolResponse + 111, // 233: gateway.GatewayService.DeletePool:output_type -> gateway.DeletePoolResponse + 113, // 234: gateway.GatewayService.ExtendPoolCapacity:output_type -> gateway.ExtendPoolCapacityResponse + 115, // 235: gateway.GatewayService.CreatePoolJoinToken:output_type -> gateway.CreatePoolJoinTokenResponse + 117, // 236: gateway.GatewayService.RevokePoolJoinToken:output_type -> gateway.RevokePoolJoinTokenResponse + 119, // 237: gateway.GatewayService.GetPoolJoinCommand:output_type -> gateway.GetPoolJoinCommandResponse + 121, // 238: gateway.GatewayService.ListPoolMachines:output_type -> gateway.ListPoolMachinesResponse + 181, // 239: gateway.GatewayService.DownloadMachineSSHKey:output_type -> gateway.DownloadMachineSSHKeyResponse + 183, // 240: gateway.GatewayService.RotateMachineSSHKey:output_type -> gateway.RotateMachineSSHKeyResponse + 185, // 241: gateway.GatewayService.ActivateMachineSSHKey:output_type -> gateway.ActivateMachineSSHKeyResponse + 127, // 242: gateway.GatewayService.JoinAgent:output_type -> gateway.JoinAgentResponse + 131, // 243: gateway.GatewayService.RequestAgentTransportCredential:output_type -> gateway.RequestAgentTransportCredentialResponse + 194, // 244: gateway.GatewayService.GetAgentPoolVirtualization:output_type -> gateway.GetAgentPoolVirtualizationResponse + 133, // 245: gateway.GatewayService.CreateNodeEnrollment:output_type -> gateway.CreateNodeEnrollmentResponse + 135, // 246: gateway.GatewayService.DeleteNodeEnrollment:output_type -> gateway.DeleteNodeEnrollmentResponse + 137, // 247: gateway.GatewayService.ListAgentRoutes:output_type -> gateway.ListAgentRoutesResponse + 139, // 248: gateway.GatewayService.UpdateAgentRouteStatus:output_type -> gateway.UpdateAgentRouteStatusResponse + 188, // 249: gateway.GatewayService.UpdateAgentSSHStatus:output_type -> gateway.UpdateAgentSSHStatusResponse + 179, // 250: gateway.GatewayService.UpdateAgentAvailability:output_type -> gateway.UpdateAgentAvailabilityResponse + 142, // 251: gateway.GatewayService.StreamAgent:output_type -> gateway.StreamAgentResponse + 147, // 252: gateway.GatewayService.StreamAgentTelemetry:output_type -> gateway.AgentTelemetryResponse + 152, // 253: gateway.GatewayService.ListMachines:output_type -> gateway.ListMachinesResponse + 154, // 254: gateway.GatewayService.CreateMachine:output_type -> gateway.CreateMachineResponse + 156, // 255: gateway.GatewayService.DeleteMachine:output_type -> gateway.DeleteMachineResponse + 159, // 256: gateway.GatewayService.ListTokens:output_type -> gateway.ListTokensResponse + 161, // 257: gateway.GatewayService.CreateToken:output_type -> gateway.CreateTokenResponse + 163, // 258: gateway.GatewayService.ToggleToken:output_type -> gateway.ToggleTokenResponse + 165, // 259: gateway.GatewayService.DeleteToken:output_type -> gateway.DeleteTokenResponse + 169, // 260: gateway.GatewayService.ListWorkers:output_type -> gateway.ListWorkersResponse + 171, // 261: gateway.GatewayService.CordonWorker:output_type -> gateway.CordonWorkerResponse + 173, // 262: gateway.GatewayService.UncordonWorker:output_type -> gateway.UncordonWorkerResponse + 175, // 263: gateway.GatewayService.DrainWorker:output_type -> gateway.DrainWorkerResponse + 177, // 264: gateway.GatewayService.ExportWorkspaceConfig:output_type -> gateway.ExportWorkspaceConfigResponse + 191, // [191:265] is the sub-list for method output_type + 117, // [117:191] is the sub-list for method input_type 117, // [117:117] is the sub-list for extension type_name 117, // [117:117] is the sub-list for extension extendee 0, // [0:117] is the sub-list for field type_name @@ -16114,7 +16230,7 @@ func file_gateway_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_gateway_proto_rawDesc), len(file_gateway_proto_rawDesc)), NumEnums: 1, - NumMessages: 202, + NumMessages: 204, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/gateway_grpc.pb.go b/proto/gateway_grpc.pb.go index a5acbbadf..125970d87 100644 --- a/proto/gateway_grpc.pb.go +++ b/proto/gateway_grpc.pb.go @@ -72,6 +72,7 @@ const ( GatewayService_ActivateMachineSSHKey_FullMethodName = "/gateway.GatewayService/ActivateMachineSSHKey" GatewayService_JoinAgent_FullMethodName = "/gateway.GatewayService/JoinAgent" GatewayService_RequestAgentTransportCredential_FullMethodName = "/gateway.GatewayService/RequestAgentTransportCredential" + GatewayService_GetAgentPoolVirtualization_FullMethodName = "/gateway.GatewayService/GetAgentPoolVirtualization" GatewayService_CreateNodeEnrollment_FullMethodName = "/gateway.GatewayService/CreateNodeEnrollment" GatewayService_DeleteNodeEnrollment_FullMethodName = "/gateway.GatewayService/DeleteNodeEnrollment" GatewayService_ListAgentRoutes_FullMethodName = "/gateway.GatewayService/ListAgentRoutes" @@ -159,6 +160,7 @@ type GatewayServiceClient interface { ActivateMachineSSHKey(ctx context.Context, in *ActivateMachineSSHKeyRequest, opts ...grpc.CallOption) (*ActivateMachineSSHKeyResponse, error) JoinAgent(ctx context.Context, in *JoinAgentRequest, opts ...grpc.CallOption) (*JoinAgentResponse, error) RequestAgentTransportCredential(ctx context.Context, in *RequestAgentTransportCredentialRequest, opts ...grpc.CallOption) (*RequestAgentTransportCredentialResponse, error) + GetAgentPoolVirtualization(ctx context.Context, in *GetAgentPoolVirtualizationRequest, opts ...grpc.CallOption) (*GetAgentPoolVirtualizationResponse, error) CreateNodeEnrollment(ctx context.Context, in *CreateNodeEnrollmentRequest, opts ...grpc.CallOption) (*CreateNodeEnrollmentResponse, error) DeleteNodeEnrollment(ctx context.Context, in *DeleteNodeEnrollmentRequest, opts ...grpc.CallOption) (*DeleteNodeEnrollmentResponse, error) ListAgentRoutes(ctx context.Context, in *ListAgentRoutesRequest, opts ...grpc.CallOption) (*ListAgentRoutesResponse, error) @@ -726,6 +728,16 @@ func (c *gatewayServiceClient) RequestAgentTransportCredential(ctx context.Conte return out, nil } +func (c *gatewayServiceClient) GetAgentPoolVirtualization(ctx context.Context, in *GetAgentPoolVirtualizationRequest, opts ...grpc.CallOption) (*GetAgentPoolVirtualizationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetAgentPoolVirtualizationResponse) + err := c.cc.Invoke(ctx, GatewayService_GetAgentPoolVirtualization_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *gatewayServiceClient) CreateNodeEnrollment(ctx context.Context, in *CreateNodeEnrollmentRequest, opts ...grpc.CallOption) (*CreateNodeEnrollmentResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CreateNodeEnrollmentResponse) @@ -1002,6 +1014,7 @@ type GatewayServiceServer interface { ActivateMachineSSHKey(context.Context, *ActivateMachineSSHKeyRequest) (*ActivateMachineSSHKeyResponse, error) JoinAgent(context.Context, *JoinAgentRequest) (*JoinAgentResponse, error) RequestAgentTransportCredential(context.Context, *RequestAgentTransportCredentialRequest) (*RequestAgentTransportCredentialResponse, error) + GetAgentPoolVirtualization(context.Context, *GetAgentPoolVirtualizationRequest) (*GetAgentPoolVirtualizationResponse, error) CreateNodeEnrollment(context.Context, *CreateNodeEnrollmentRequest) (*CreateNodeEnrollmentResponse, error) DeleteNodeEnrollment(context.Context, *DeleteNodeEnrollmentRequest) (*DeleteNodeEnrollmentResponse, error) ListAgentRoutes(context.Context, *ListAgentRoutesRequest) (*ListAgentRoutesResponse, error) @@ -1195,6 +1208,9 @@ func (UnimplementedGatewayServiceServer) JoinAgent(context.Context, *JoinAgentRe func (UnimplementedGatewayServiceServer) RequestAgentTransportCredential(context.Context, *RequestAgentTransportCredentialRequest) (*RequestAgentTransportCredentialResponse, error) { return nil, status.Error(codes.Unimplemented, "method RequestAgentTransportCredential not implemented") } +func (UnimplementedGatewayServiceServer) GetAgentPoolVirtualization(context.Context, *GetAgentPoolVirtualizationRequest) (*GetAgentPoolVirtualizationResponse, error) { + return nil, status.Error(codes.Unimplemented, "method GetAgentPoolVirtualization not implemented") +} func (UnimplementedGatewayServiceServer) CreateNodeEnrollment(context.Context, *CreateNodeEnrollmentRequest) (*CreateNodeEnrollmentResponse, error) { return nil, status.Error(codes.Unimplemented, "method CreateNodeEnrollment not implemented") } @@ -2208,6 +2224,24 @@ func _GatewayService_RequestAgentTransportCredential_Handler(srv interface{}, ct return interceptor(ctx, in, info, handler) } +func _GatewayService_GetAgentPoolVirtualization_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetAgentPoolVirtualizationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GatewayServiceServer).GetAgentPoolVirtualization(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GatewayService_GetAgentPoolVirtualization_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GatewayServiceServer).GetAgentPoolVirtualization(ctx, req.(*GetAgentPoolVirtualizationRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _GatewayService_CreateNodeEnrollment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateNodeEnrollmentRequest) if err := dec(in); err != nil { @@ -2761,6 +2795,10 @@ var GatewayService_ServiceDesc = grpc.ServiceDesc{ MethodName: "RequestAgentTransportCredential", Handler: _GatewayService_RequestAgentTransportCredential_Handler, }, + { + MethodName: "GetAgentPoolVirtualization", + Handler: _GatewayService_GetAgentPoolVirtualization_Handler, + }, { MethodName: "CreateNodeEnrollment", Handler: _GatewayService_CreateNodeEnrollment_Handler, From cee5b5008ded6d01e11903a55dde236e4aa08fa7 Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Fri, 7 Aug 2026 09:02:06 +0000 Subject: [PATCH 25/26] added startup hook functionality --- pkg/runtime/startup_hook.go | 47 ++++ pkg/runtime/startup_hook_test.go | 379 ++++++++++++++++++++++++++++ pkg/runtime/startup_hook_wrapper.go | 144 +++++++++++ pkg/worker/container_server.go | 7 - pkg/worker/container_server_test.go | 61 ----- pkg/worker/lifecycle.go | 51 +--- pkg/worker/lifecycle_test.go | 5 - pkg/worker/thunder.go | 162 ++---------- pkg/worker/thunder_test.go | 99 ++------ pkg/worker/worker.go | 8 - 10 files changed, 617 insertions(+), 346 deletions(-) create mode 100644 pkg/runtime/startup_hook.go create mode 100644 pkg/runtime/startup_hook_test.go create mode 100644 pkg/runtime/startup_hook_wrapper.go diff --git a/pkg/runtime/startup_hook.go b/pkg/runtime/startup_hook.go new file mode 100644 index 000000000..dbb2c2905 --- /dev/null +++ b/pkg/runtime/startup_hook.go @@ -0,0 +1,47 @@ +package runtime + +import ( + "context" + "fmt" + "time" + + "github.com/opencontainers/runtime-spec/specs-go" +) + +// StartupHook runs after the container init process starts but before the +// runtime publishes the container as started to worker lifecycle consumers. +type StartupHook interface { + Name() string + Run(ctx context.Context, rt Runtime, containerID string) error +} + +// StartupExecHook runs a process inside the container as a startup hook. +type StartupExecHook struct { + HookName string + Process specs.Process + Timeout time.Duration + OutputWriter OutputWriter +} + +func (h StartupExecHook) Name() string { + if h.HookName != "" { + return h.HookName + } + return "startup_exec" +} + +func (h StartupExecHook) Run(ctx context.Context, rt Runtime, containerID string) error { + if rt == nil { + return fmt.Errorf("runtime is required for startup hook %q", h.Name()) + } + + if h.Timeout > 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, h.Timeout) + defer cancel() + } + + return rt.Exec(ctx, containerID, h.Process, &ExecOpts{ + OutputWriter: h.OutputWriter, + }) +} diff --git a/pkg/runtime/startup_hook_test.go b/pkg/runtime/startup_hook_test.go new file mode 100644 index 000000000..650d59198 --- /dev/null +++ b/pkg/runtime/startup_hook_test.go @@ -0,0 +1,379 @@ +package runtime + +import ( + "bytes" + "context" + "errors" + "sync" + "syscall" + "testing" + "time" + + "github.com/opencontainers/runtime-spec/specs-go" + "github.com/stretchr/testify/require" +) + +func TestStartupHookRuntimeWithholdsStartedUntilHooksComplete(t *testing.T) { + rt := newStartupHookMockRuntime(1234) + hook := &blockingStartupHook{ + name: "install", + entered: make(chan struct{}), + release: make(chan struct{}), + } + wrapped := WithStartupHooks(rt, hook) + + started := make(chan int, 1) + done := make(chan error, 1) + go func() { + _, err := wrapped.Run(context.Background(), "container-1", "/bundle", &RunOpts{Started: started}) + done <- err + }() + + select { + case <-hook.entered: + case <-time.After(time.Second): + t.Fatal("startup hook did not run") + } + select { + case pid := <-started: + t.Fatalf("started was published before hook completion: %d", pid) + default: + } + + close(hook.release) + select { + case pid := <-started: + require.Equal(t, 1234, pid) + case <-time.After(time.Second): + t.Fatal("started was not published after hook completion") + } + + rt.finishRun() + select { + case err := <-done: + require.NoError(t, err) + case <-time.After(time.Second): + t.Fatal("run did not return after runtime finished") + } +} + +func TestStartupHookRuntimeRunsHooksInOrder(t *testing.T) { + rt := newStartupHookMockRuntime(4321) + calls := []string{} + wrapped := WithStartupHooks( + rt, + &recordingStartupHook{name: "first", calls: &calls}, + &recordingStartupHook{name: "second", calls: &calls}, + ) + + started := make(chan int, 1) + done := make(chan error, 1) + go func() { + _, err := wrapped.Run(context.Background(), "container-1", "/bundle", &RunOpts{Started: started}) + done <- err + }() + + select { + case pid := <-started: + require.Equal(t, 4321, pid) + case <-time.After(time.Second): + t.Fatal("started was not published") + } + require.Equal(t, []string{"first", "second"}, calls) + + rt.finishRun() + select { + case err := <-done: + require.NoError(t, err) + case <-time.After(time.Second): + t.Fatal("run did not return after runtime finished") + } +} + +func TestStartupHookRuntimeWithholdsRestoreStartedUntilHooksComplete(t *testing.T) { + rt := newStartupHookMockRuntime(5678) + hook := &blockingStartupHook{ + name: "restore-install", + entered: make(chan struct{}), + release: make(chan struct{}), + } + wrapped := WithStartupHooks(rt, hook) + + started := make(chan int, 1) + done := make(chan error, 1) + go func() { + _, err := wrapped.Restore(context.Background(), "container-1", &RestoreOpts{Started: started}) + done <- err + }() + + select { + case <-hook.entered: + case <-time.After(time.Second): + t.Fatal("startup hook did not run during restore") + } + select { + case pid := <-started: + t.Fatalf("restore started was published before hook completion: %d", pid) + default: + } + + close(hook.release) + select { + case pid := <-started: + require.Equal(t, 5678, pid) + case <-time.After(time.Second): + t.Fatal("restore started was not published after hook completion") + } + + rt.finishRun() + select { + case err := <-done: + require.NoError(t, err) + case <-time.After(time.Second): + t.Fatal("restore did not return after runtime finished") + } +} + +func TestStartupHookRuntimeDelegatesOptionalRuntimeMethods(t *testing.T) { + rt := newStartupHookMockRuntime(0) + rt.restoreWaitsForExit = true + wrapped := WithStartupHooks(rt, &recordingStartupHook{name: "install"}) + + restoreRuntime, ok := wrapped.(interface{ RestoreWaitsForExit() bool }) + require.True(t, ok) + require.True(t, restoreRuntime.RestoreWaitsForExit()) + + updater, ok := wrapped.(interface { + UpdateResources(context.Context, string, *specs.LinuxResources) error + }) + require.True(t, ok) + resources := &specs.LinuxResources{CPU: &specs.LinuxCPU{Cpus: "0"}} + require.NoError(t, updater.UpdateResources(context.Background(), "container-1", resources)) + require.Same(t, resources, rt.updatedResources[0]) +} + +func TestStartupHookRuntimeFailureKillsContainerAndDoesNotPublishStarted(t *testing.T) { + rt := newStartupHookMockRuntime(1234) + wrapped := WithStartupHooks(rt, &recordingStartupHook{ + name: "install", + err: errors.New("installer failed"), + }) + + started := make(chan int, 1) + exitCode, err := wrapped.Run(context.Background(), "container-1", "/bundle", &RunOpts{Started: started}) + + require.Equal(t, -1, exitCode) + require.Error(t, err) + require.Contains(t, err.Error(), `startup hook "install" failed`) + require.Contains(t, err.Error(), "installer failed") + select { + case pid := <-started: + t.Fatalf("started was published after hook failure: %d", pid) + default: + } + require.Equal(t, []syscall.Signal{syscall.SIGKILL}, rt.killSignals()) + require.Equal(t, []bool{true}, rt.killAllOpts()) +} + +func TestStartupExecHookRunsProcessWithExec(t *testing.T) { + rt := newStartupHookMockRuntime(0) + output := &bytes.Buffer{} + process := specs.Process{ + Args: []string{"sh", "-c", "curl install"}, + Cwd: "/workspace", + Env: []string{"PATH=/usr/bin"}, + } + hook := StartupExecHook{ + HookName: "thunder_install", + Process: process, + OutputWriter: output, + } + + require.Equal(t, "thunder_install", hook.Name()) + require.NoError(t, hook.Run(context.Background(), rt, "container-1")) + require.Equal(t, []specs.Process{process}, rt.execCalls()) + require.Len(t, rt.execOutputWriters(), 1) + require.Same(t, output, rt.execOutputWriters()[0]) +} + +type blockingStartupHook struct { + name string + entered chan struct{} + release chan struct{} + once sync.Once +} + +func (h *blockingStartupHook) Name() string { + return h.name +} + +func (h *blockingStartupHook) Run(ctx context.Context, rt Runtime, containerID string) error { + h.once.Do(func() { close(h.entered) }) + select { + case <-h.release: + return nil + case <-ctx.Done(): + return ctx.Err() + } +} + +type recordingStartupHook struct { + name string + calls *[]string + err error +} + +func (h *recordingStartupHook) Name() string { + return h.name +} + +func (h *recordingStartupHook) Run(ctx context.Context, rt Runtime, containerID string) error { + if h.calls != nil { + *h.calls = append(*h.calls, h.name) + } + return h.err +} + +type startupHookMockRuntime struct { + pid int + finish chan struct{} + finishOnce sync.Once + + mu sync.Mutex + kills []syscall.Signal + killOpts []*KillOpts + execs []specs.Process + execWriterCaptures []OutputWriter + execErr error + updatedResources []*specs.LinuxResources + checkpointCallCount int + restoreWaitsForExit bool +} + +func newStartupHookMockRuntime(pid int) *startupHookMockRuntime { + return &startupHookMockRuntime{ + pid: pid, + finish: make(chan struct{}), + } +} + +func (m *startupHookMockRuntime) Name() string { + return "mock" +} + +func (m *startupHookMockRuntime) Capabilities() Capabilities { + return Capabilities{} +} + +func (m *startupHookMockRuntime) Prepare(ctx context.Context, spec *specs.Spec) error { + return nil +} + +func (m *startupHookMockRuntime) Run(ctx context.Context, containerID, bundlePath string, opts *RunOpts) (int, error) { + if opts != nil && opts.Started != nil { + opts.Started <- m.pid + } + select { + case <-m.finish: + return 0, nil + case <-ctx.Done(): + return -1, ctx.Err() + } +} + +func (m *startupHookMockRuntime) Exec(ctx context.Context, containerID string, proc specs.Process, opts *ExecOpts) error { + m.mu.Lock() + defer m.mu.Unlock() + m.execs = append(m.execs, proc) + if opts != nil { + m.execWriterCaptures = append(m.execWriterCaptures, opts.OutputWriter) + } else { + m.execWriterCaptures = append(m.execWriterCaptures, nil) + } + return m.execErr +} + +func (m *startupHookMockRuntime) Kill(ctx context.Context, containerID string, sig syscall.Signal, opts *KillOpts) error { + m.mu.Lock() + m.kills = append(m.kills, sig) + m.killOpts = append(m.killOpts, opts) + m.mu.Unlock() + m.finishRun() + return nil +} + +func (m *startupHookMockRuntime) Delete(ctx context.Context, containerID string, opts *DeleteOpts) error { + return nil +} + +func (m *startupHookMockRuntime) State(ctx context.Context, containerID string) (State, error) { + return State{}, nil +} + +func (m *startupHookMockRuntime) Events(ctx context.Context, containerID string) (<-chan Event, error) { + return nil, nil +} + +func (m *startupHookMockRuntime) Checkpoint(ctx context.Context, containerID string, opts *CheckpointOpts) error { + m.checkpointCallCount++ + return nil +} + +func (m *startupHookMockRuntime) Restore(ctx context.Context, containerID string, opts *RestoreOpts) (int, error) { + if opts != nil && opts.Started != nil { + opts.Started <- m.pid + } + select { + case <-m.finish: + return 0, nil + case <-ctx.Done(): + return -1, ctx.Err() + } +} + +func (m *startupHookMockRuntime) UpdateResources(ctx context.Context, containerID string, resources *specs.LinuxResources) error { + m.mu.Lock() + defer m.mu.Unlock() + m.updatedResources = append(m.updatedResources, resources) + return nil +} + +func (m *startupHookMockRuntime) RestoreWaitsForExit() bool { + return m.restoreWaitsForExit +} + +func (m *startupHookMockRuntime) Close() error { + return nil +} + +func (m *startupHookMockRuntime) finishRun() { + m.finishOnce.Do(func() { close(m.finish) }) +} + +func (m *startupHookMockRuntime) killSignals() []syscall.Signal { + m.mu.Lock() + defer m.mu.Unlock() + return append([]syscall.Signal(nil), m.kills...) +} + +func (m *startupHookMockRuntime) killAllOpts() []bool { + m.mu.Lock() + defer m.mu.Unlock() + out := make([]bool, 0, len(m.killOpts)) + for _, opts := range m.killOpts { + out = append(out, opts != nil && opts.All) + } + return out +} + +func (m *startupHookMockRuntime) execCalls() []specs.Process { + m.mu.Lock() + defer m.mu.Unlock() + return append([]specs.Process(nil), m.execs...) +} + +func (m *startupHookMockRuntime) execOutputWriters() []OutputWriter { + m.mu.Lock() + defer m.mu.Unlock() + return append([]OutputWriter(nil), m.execWriterCaptures...) +} diff --git a/pkg/runtime/startup_hook_wrapper.go b/pkg/runtime/startup_hook_wrapper.go new file mode 100644 index 000000000..0f13ad274 --- /dev/null +++ b/pkg/runtime/startup_hook_wrapper.go @@ -0,0 +1,144 @@ +package runtime + +import ( + "context" + "fmt" + "syscall" + "time" + + "github.com/opencontainers/runtime-spec/specs-go" +) + +const startupHookShutdownTimeout = 5 * time.Second + +type startupHookRuntime struct { + Runtime + hooks []StartupHook +} + +// WithStartupHooks wraps a runtime so hooks complete before Run publishes the +// container PID to lifecycle consumers. +func WithStartupHooks(rt Runtime, hooks ...StartupHook) Runtime { + if rt == nil || len(hooks) == 0 { + return rt + } + + filtered := make([]StartupHook, 0, len(hooks)) + for _, hook := range hooks { + if hook != nil { + filtered = append(filtered, hook) + } + } + if len(filtered) == 0 { + return rt + } + + return &startupHookRuntime{ + Runtime: rt, + hooks: filtered, + } +} + +type startupHookRunResult struct { + exitCode int + err error +} + +func (r *startupHookRuntime) Run(ctx context.Context, containerID, bundlePath string, opts *RunOpts) (int, error) { + runOpts := &RunOpts{} + if opts != nil { + *runOpts = *opts + } + originalStarted := runOpts.Started + exitCode, err := r.runWithStartedHook(ctx, containerID, originalStarted, func(ctx context.Context, started chan<- int) (int, error) { + runOpts.Started = started + return r.Runtime.Run(ctx, containerID, bundlePath, runOpts) + }) + return exitCode, err +} + +func (r *startupHookRuntime) Restore(ctx context.Context, containerID string, opts *RestoreOpts) (int, error) { + restoreOpts := &RestoreOpts{} + if opts != nil { + *restoreOpts = *opts + } + originalStarted := restoreOpts.Started + exitCode, err := r.runWithStartedHook(ctx, containerID, originalStarted, func(ctx context.Context, started chan<- int) (int, error) { + restoreOpts.Started = started + return r.Runtime.Restore(ctx, containerID, restoreOpts) + }) + return exitCode, err +} + +func (r *startupHookRuntime) runWithStartedHook(ctx context.Context, containerID string, originalStarted chan<- int, run func(context.Context, chan<- int) (int, error)) (int, error) { + runCtx, cancel := context.WithCancel(ctx) + defer cancel() + + started := make(chan int, 1) + done := make(chan startupHookRunResult, 1) + go func() { + exitCode, err := run(runCtx, started) + done <- startupHookRunResult{exitCode: exitCode, err: err} + }() + + var pid int + select { + case result := <-done: + return result.exitCode, result.err + case pid = <-started: + case <-ctx.Done(): + return -1, ctx.Err() + } + + for _, hook := range r.hooks { + if err := hook.Run(ctx, r.Runtime, containerID); err != nil { + return r.failStartupHook(ctx, containerID, done, hook, err) + } + } + + if originalStarted != nil { + select { + case result := <-done: + return result.exitCode, result.err + case originalStarted <- pid: + case <-ctx.Done(): + return -1, ctx.Err() + } + } + + select { + case result := <-done: + return result.exitCode, result.err + case <-ctx.Done(): + return -1, ctx.Err() + } +} + +func (r *startupHookRuntime) failStartupHook(ctx context.Context, containerID string, done <-chan startupHookRunResult, hook StartupHook, hookErr error) (int, error) { + _ = r.Runtime.Kill(context.Background(), containerID, syscall.SIGKILL, &KillOpts{All: true}) + + waitCtx, cancel := context.WithTimeout(context.WithoutCancel(ctx), startupHookShutdownTimeout) + defer cancel() + + select { + case <-done: + case <-waitCtx.Done(): + } + + return -1, fmt.Errorf("startup hook %q failed: %w", hook.Name(), hookErr) +} + +func (r *startupHookRuntime) UpdateResources(ctx context.Context, containerID string, resources *specs.LinuxResources) error { + updater, ok := r.Runtime.(interface { + UpdateResources(context.Context, string, *specs.LinuxResources) error + }) + if !ok { + return fmt.Errorf("runtime %s does not support resource updates", r.Name()) + } + return updater.UpdateResources(ctx, containerID, resources) +} + +func (r *startupHookRuntime) RestoreWaitsForExit() bool { + restoreRuntime, ok := r.Runtime.(interface{ RestoreWaitsForExit() bool }) + return ok && restoreRuntime.RestoreWaitsForExit() +} diff --git a/pkg/worker/container_server.go b/pkg/worker/container_server.go index 3ef39c308..61495ce8a 100644 --- a/pkg/worker/container_server.go +++ b/pkg/worker/container_server.go @@ -59,7 +59,6 @@ type ContainerRuntimeServer struct { killedSandboxProcesses sync.Map containerRepoClient pb.ContainerRepositoryServiceClient containerNetworkManager ContainerNetwork - thunderSetupTracker *thunderSetupTracker imageClient *ImageClient runtime runtime.Runtime // The worker's configured runtime (from pool config) eventRepo processLogEventRepository @@ -82,7 +81,6 @@ type ContainerRuntimeServerOpts struct { ImageClient *ImageClient ContainerRepoClient pb.ContainerRepositoryServiceClient ContainerNetworkManager ContainerNetwork - ThunderSetupTracker *thunderSetupTracker EventRepo repository.EventRepository WorkerID string BackendRoute backendRouteFunc @@ -109,7 +107,6 @@ func NewContainerRuntimeServer(opts *ContainerRuntimeServerOpts) (*ContainerRunt imageClient: opts.ImageClient, containerRepoClient: opts.ContainerRepoClient, containerNetworkManager: opts.ContainerNetworkManager, - thunderSetupTracker: opts.ThunderSetupTracker, eventRepo: opts.EventRepo, workerID: opts.WorkerID, backendRoute: opts.BackendRoute, @@ -630,10 +627,6 @@ func (s *ContainerRuntimeServer) ContainerSandboxExec(ctx context.Context, in *p return &pb.ContainerSandboxExecResponse{Ok: false, ErrorMsg: err.Error()}, nil } - if err := s.thunderSetupTracker.Wait(ctx, in.ContainerId); err != nil { - return &pb.ContainerSandboxExecResponse{Ok: false, ErrorMsg: err.Error()}, nil - } - if instance.Spec == nil || instance.Spec.Process == nil { return &pb.ContainerSandboxExecResponse{Ok: false, ErrorMsg: "Container spec not ready"}, nil } diff --git a/pkg/worker/container_server_test.go b/pkg/worker/container_server_test.go index 80e54b810..c1d038707 100644 --- a/pkg/worker/container_server_test.go +++ b/pkg/worker/container_server_test.go @@ -3,7 +3,6 @@ package worker import ( "context" "encoding/json" - "errors" "fmt" "os" "path/filepath" @@ -421,66 +420,6 @@ func TestContainerSandboxExecDoesNotPollRuntimeStateBeforeProcessManagerReady(t require.Equal(t, int32(0), rt.stateCalls.Load()) } -func TestContainerSandboxExecWaitsForThunderSetup(t *testing.T) { - containerId := "sandbox-test" - ready := make(chan struct{}) - close(ready) - tracker := newThunderSetupTracker() - tracker.Begin(containerId) - - server := &ContainerRuntimeServer{ - containerInstances: common.NewSafeMap[*ContainerInstance](), - thunderSetupTracker: tracker, - } - server.containerInstances.Set(containerId, &ContainerInstance{ - Id: containerId, - SandboxProcessManagerReady: true, - ProcessManagerReadyChan: ready, - Spec: &specs.Spec{Process: &specs.Process{}}, - }) - - ctx, cancel := context.WithTimeout(context.Background(), 25*time.Millisecond) - defer cancel() - resp, err := server.ContainerSandboxExec(ctx, &pb.ContainerSandboxExecRequest{ - ContainerId: containerId, - Cmd: "true", - }) - - require.NoError(t, err) - require.False(t, resp.Ok) - require.Contains(t, resp.ErrorMsg, "Thunder client setup did not complete") -} - -func TestContainerSandboxExecReturnsThunderSetupFailure(t *testing.T) { - containerId := "sandbox-test" - ready := make(chan struct{}) - close(ready) - tracker := newThunderSetupTracker() - tracker.Begin(containerId) - tracker.Complete(containerId, errors.New("install failed")) - - server := &ContainerRuntimeServer{ - containerInstances: common.NewSafeMap[*ContainerInstance](), - thunderSetupTracker: tracker, - } - server.containerInstances.Set(containerId, &ContainerInstance{ - Id: containerId, - SandboxProcessManagerReady: true, - ProcessManagerReadyChan: ready, - Spec: &specs.Spec{Process: &specs.Process{}}, - }) - - resp, err := server.ContainerSandboxExec(context.Background(), &pb.ContainerSandboxExecRequest{ - ContainerId: containerId, - Cmd: "true", - }) - - require.NoError(t, err) - require.False(t, resp.Ok) - require.Contains(t, resp.ErrorMsg, "Thunder client setup failed") - require.Contains(t, resp.ErrorMsg, "install failed") -} - func TestContainerSandboxStatusReportsPendingBeforeProcessManagerReady(t *testing.T) { containerId := "sandbox-test" server := &ContainerRuntimeServer{ diff --git a/pkg/worker/lifecycle.go b/pkg/worker/lifecycle.go index 15e979059..746ea5028 100644 --- a/pkg/worker/lifecycle.go +++ b/pkg/worker/lifecycle.go @@ -269,8 +269,6 @@ func (s *Worker) markContainerStopping(containerId string) { } func (s *Worker) deleteContainer(containerId string) { - s.thunderSetupTracker.Delete(containerId) - if instance, exists := s.containerInstances.Get(containerId); exists && instance.SandboxProcessManager != nil { if err := instance.SandboxProcessManager.Cleanup(); err != nil { log.Debug().Str("container_id", containerId).Err(err).Msg("failed to cleanup sandbox process manager client") @@ -310,9 +308,6 @@ func (s *Worker) RunContainer(ctx context.Context, request *types.ContainerReque } if request.Stub.Type.Kind() == types.StubTypeSandbox { instance.initializeProcessManagerReadiness() - if s.gpuVirtualizedForRequest(request) { - s.thunderSetupTracker.Begin(request.ContainerId) - } } } s.containerInstances.Set(containerId, instance) @@ -1289,6 +1284,16 @@ func (s *Worker) spawn(request *types.ContainerRequest, spec *specs.Spec, output spec.Process.Env = gpuManager.InjectAssignedEnvVars(spec.Process.Env, assignedDevices) } + if request.Stub.Type.Kind() == types.StubTypeSandbox && s.gpuVirtualizedForRequest(request) { + hook, err := s.thunderStartupHook(request, spec) + if err != nil { + log.Error().Str("container_id", request.ContainerId).Msgf("failed to prepare Thunder startup hook: %v", err) + return + } + containerInstance.Runtime = runtime.WithStartupHooks(containerInstance.Runtime, hook) + s.containerInstances.Set(containerId, containerInstance) + } + // Expose the bind ports phaseStart = time.Now() err = s.containerNetworkManager.ExposePorts(containerId, opts.StartupPortBindings) @@ -1387,8 +1392,6 @@ func (s *Worker) spawn(request *types.ContainerRequest, spec *specs.Spec, output startedChan := make(chan int, 1) checkpointPIDChan := make(chan int, 1) monitorPIDChan := make(chan int, 1) - thunderInstallResult := make(chan error, 1) - defer func() { // Close in reverse order of dependency close(checkpointPIDChan) @@ -1446,24 +1449,6 @@ func (s *Worker) spawn(request *types.ContainerRequest, spec *specs.Spec, output return } - if s.gpuVirtualizedForRequest(request) { - if err := s.installThunderClient(ctx, request); err != nil { - s.thunderSetupTracker.Complete(request.ContainerId, err) - log.Error().Err(err).Str("container_id", request.ContainerId).Msg("failed to install Thunder client") - s.stopContainer(request.ContainerId, false) - select { - case thunderInstallResult <- err: - default: - } - return - } - s.thunderSetupTracker.Complete(request.ContainerId, nil) - select { - case thunderInstallResult <- nil: - default: - } - } - if request.DockerEnabled { go s.startDockerDaemon(ctx, containerId, instance) } @@ -1487,7 +1472,7 @@ func (s *Worker) spawn(request *types.ContainerRequest, spec *specs.Spec, output s.setupOOMWatcher(ctx, containerId, pid, spec, request, outputLogger, &isOOMKilled) }() - exitCode, _ = s.runContainer(ctx, request, outputLogger, outputWriter, startedChan, checkpointPIDChan, thunderInstallResult, opts.StartupStartedAt, opts.StartupPortBindings, opts.CheckpointFilesystemRestore) + exitCode, _ = s.runContainer(ctx, request, outputLogger, outputWriter, startedChan, checkpointPIDChan, opts.StartupStartedAt, opts.StartupPortBindings, opts.CheckpointFilesystemRestore) stopReason := types.StopContainerReasonUnknown containerInstance, exists = s.containerInstances.Get(containerId) @@ -1604,7 +1589,7 @@ func eventStopReason(stopReason types.StopContainerReason) string { return string(stopReason) } -func (s *Worker) runContainer(ctx context.Context, request *types.ContainerRequest, outputLogger *slog.Logger, outputWriter *common.OutputWriter, startedChan chan int, checkpointPIDChan chan int, thunderInstallResult chan error, startupStartedAt time.Time, startupPortBindings []PortBinding, filesystemRestore *checkpointFilesystemRestore) (int, error) { +func (s *Worker) runContainer(ctx context.Context, request *types.ContainerRequest, outputLogger *slog.Logger, outputWriter *common.OutputWriter, startedChan chan int, checkpointPIDChan chan int, startupStartedAt time.Time, startupPortBindings []PortBinding, filesystemRestore *checkpointFilesystemRestore) (int, error) { phaseStart := time.Now() releaseStartupSlot := func() {} if s.containerStartSem != nil { @@ -1725,18 +1710,6 @@ func (s *Worker) runContainer(ctx context.Context, request *types.ContainerReque publishRuntimeStarted(pid) } - if request.Stub.Type.Kind() == types.StubTypeSandbox && s.gpuVirtualizedForRequest(request) { - select { - case err := <-thunderInstallResult: - if err != nil { - return - } - case <-ctx.Done(): - return - } - } - - s.markContainerRunning(ctx, request, startupStartedAt) } startRuntimeStartedHandler := func() func() { diff --git a/pkg/worker/lifecycle_test.go b/pkg/worker/lifecycle_test.go index aff83ce5f..12466cc6d 100644 --- a/pkg/worker/lifecycle_test.go +++ b/pkg/worker/lifecycle_test.go @@ -1312,7 +1312,6 @@ func TestRunContainerDoesNotCancelRuntimeRunWithWorkerContext(t *testing.T) { common.NewOutputWriter(func(string) {}), make(chan int, 1), make(chan int, 1), - nil, time.Now(), nil, nil, @@ -1398,7 +1397,6 @@ func TestRunContainerRestorePublishesAddressFromStartedHandler(t *testing.T) { common.NewOutputWriter(func(string) {}), make(chan int, 1), make(chan int, 1), - nil, time.Now(), []PortBinding{{HostPort: 30001, ContainerPort: 8001}}, nil, @@ -1533,7 +1531,6 @@ func TestRunContainerRestoreWaitsForRestoredRuntimeExit(t *testing.T) { common.NewOutputWriter(func(string) {}), make(chan int, 1), make(chan int, 1), - nil, time.Now(), []PortBinding{{HostPort: 30001, ContainerPort: 8001}}, nil, @@ -1723,7 +1720,6 @@ func TestRunContainerRestoreFailureCleansRuntimeBeforeFallback(t *testing.T) { common.NewOutputWriter(func(string) {}), make(chan int, 1), make(chan int, 1), - nil, time.Now(), []PortBinding{{HostPort: 30001, ContainerPort: 8001}}, nil, @@ -1791,7 +1787,6 @@ func TestRunContainerMaterializeFailureFallsBackWithoutRestore(t *testing.T) { common.NewOutputWriter(func(string) {}), make(chan int, 1), make(chan int, 1), - nil, time.Now(), []PortBinding{{HostPort: 30001, ContainerPort: 8001}}, nil, diff --git a/pkg/worker/thunder.go b/pkg/worker/thunder.go index d43bcddbf..91078be12 100644 --- a/pkg/worker/thunder.go +++ b/pkg/worker/thunder.go @@ -4,10 +4,10 @@ import ( "context" "fmt" "strings" - "sync" "time" common "github.com/beam-cloud/beta9/pkg/common" + "github.com/beam-cloud/beta9/pkg/runtime" "github.com/beam-cloud/beta9/pkg/types" pb "github.com/beam-cloud/beta9/proto" "github.com/opencontainers/runtime-spec/specs-go" @@ -21,122 +21,6 @@ const ( thunderCudaDriverLibraryPath = "/usr/lib/x86_64-linux-gnu/libcuda.so.1" ) -type thunderSetupState int - -const ( - thunderSetupPending thunderSetupState = iota - thunderSetupReady - thunderSetupFailed -) - -type thunderSetupStatus struct { - done chan struct{} - once sync.Once - - mu sync.RWMutex - state thunderSetupState - err error -} - -func newThunderSetupStatus() *thunderSetupStatus { - return &thunderSetupStatus{ - done: make(chan struct{}), - state: thunderSetupPending, - } -} - -func (s *thunderSetupStatus) complete(err error) { - s.once.Do(func() { - s.mu.Lock() - defer s.mu.Unlock() - if err != nil { - s.state = thunderSetupFailed - s.err = err - } else { - s.state = thunderSetupReady - } - close(s.done) - }) -} - -func (s *thunderSetupStatus) wait(ctx context.Context) error { - select { - case <-s.done: - s.mu.RLock() - defer s.mu.RUnlock() - if s.state == thunderSetupFailed { - if s.err != nil { - return fmt.Errorf("Thunder client setup failed: %w", s.err) - } - return fmt.Errorf("Thunder client setup failed") - } - return nil - case <-ctx.Done(): - return fmt.Errorf("Thunder client setup did not complete: %w", ctx.Err()) - } -} - -type thunderSetupTracker struct { - mu sync.Mutex - statuses map[string]*thunderSetupStatus -} - -func newThunderSetupTracker() *thunderSetupTracker { - return &thunderSetupTracker{statuses: map[string]*thunderSetupStatus{}} -} - -func (t *thunderSetupTracker) Begin(containerId string) { - if t == nil || containerId == "" { - return - } - t.mu.Lock() - defer t.mu.Unlock() - if _, exists := t.statuses[containerId]; exists { - return - } - t.statuses[containerId] = newThunderSetupStatus() -} - -func (t *thunderSetupTracker) Complete(containerId string, err error) { - if t == nil || containerId == "" { - return - } - t.mu.Lock() - status, exists := t.statuses[containerId] - if !exists { - status = newThunderSetupStatus() - t.statuses[containerId] = status - } - t.mu.Unlock() - status.complete(err) -} - -func (t *thunderSetupTracker) Wait(ctx context.Context, containerId string) error { - if t == nil || containerId == "" { - return nil - } - t.mu.Lock() - status := t.statuses[containerId] - t.mu.Unlock() - if status == nil { - return nil - } - return status.wait(ctx) -} - -func (t *thunderSetupTracker) Delete(containerId string) { - if t == nil || containerId == "" { - return - } - t.mu.Lock() - status := t.statuses[containerId] - delete(t.statuses, containerId) - t.mu.Unlock() - if status != nil { - status.complete(fmt.Errorf("Thunder client setup cancelled")) - } -} - type ContainerThunderManager struct { client pb.ThunderServiceClient installCache *common.SafeMap[string] @@ -235,52 +119,40 @@ func thunderBindMount(path string) specs.Mount { } } -func (s *Worker) installThunderClient(ctx context.Context, request *types.ContainerRequest) error { +func (s *Worker) thunderStartupHook(request *types.ContainerRequest, spec *specs.Spec) (runtime.StartupHook, error) { if s == nil || request == nil || !s.gpuVirtualizedForRequest(request) { - return nil + return nil, nil } manager, ok := s.containerThunderManager.(*ContainerThunderManager) if !ok || manager == nil { - return fmt.Errorf("thunder manager unavailable") + return nil, fmt.Errorf("thunder manager unavailable") } cmd, ok := manager.installCache.Get(request.ContainerId) if !ok || strings.TrimSpace(cmd) == "" { - return fmt.Errorf("missing Thunder install command for container %s", request.ContainerId) + return nil, fmt.Errorf("missing Thunder install command for container %s", request.ContainerId) } - instance, ok := s.containerInstances.Get(request.ContainerId) - if !ok || instance == nil || instance.Runtime == nil { - return fmt.Errorf("container runtime unavailable for Thunder install") + if spec == nil || spec.Process == nil { + return nil, fmt.Errorf("container spec unavailable for Thunder install") } - env := append([]string(nil), instance.Spec.Process.Env...) + env := append([]string(nil), spec.Process.Env...) if !containsEnvKey(env, "PATH") { env = append(env, "PATH="+strings.Join(defaultContainerPath, ":")) } cwd := "/" - if instance.Spec != nil && instance.Spec.Process != nil { - if instance.Spec.Process.Cwd != "" { - cwd = instance.Spec.Process.Cwd - } + if spec.Process.Cwd != "" { + cwd = spec.Process.Cwd } - installCtx, cancel := context.WithTimeout(ctx, 2*time.Minute) - defer cancel() - log.Info().Str("container_id", request.ContainerId).Msg("installing Thunder client in sandbox") - if instance.SandboxProcessManager != nil && instance.SandboxProcessManagerReady { - if err := runSandboxProcessManagerCommand(installCtx, instance.SandboxProcessManager, []string{"sh", "-c", cmd}, cwd, env, "Thunder client install"); err != nil { - return fmt.Errorf("failed to install Thunder client: %w", err) - } - } else { - proc := specs.Process{ + + return runtime.StartupExecHook{ + HookName: "thunder_client_install", + Process: specs.Process{ Args: []string{"sh", "-c", cmd}, Cwd: cwd, Env: env, - } - if err := instance.Runtime.Exec(installCtx, request.ContainerId, proc, nil); err != nil { - return fmt.Errorf("failed to install Thunder client: %w", err) - } - } - log.Info().Str("container_id", request.ContainerId).Msg("installed Thunder client in sandbox") - return nil + }, + Timeout: 2 * time.Minute, + }, nil } func containsEnvKey(env []string, key string) bool { diff --git a/pkg/worker/thunder_test.go b/pkg/worker/thunder_test.go index 83883a7d4..cdec79961 100644 --- a/pkg/worker/thunder_test.go +++ b/pkg/worker/thunder_test.go @@ -2,76 +2,19 @@ package worker import ( "context" - "errors" "strings" "testing" "time" - common "github.com/beam-cloud/beta9/pkg/common" + "github.com/beam-cloud/beta9/pkg/runtime" "github.com/beam-cloud/beta9/pkg/types" pb "github.com/beam-cloud/beta9/proto" "github.com/opencontainers/runtime-spec/specs-go" + "github.com/stretchr/testify/require" "github.com/tj/assert" "google.golang.org/grpc" ) -func TestThunderSetupTrackerWaitsUntilComplete(t *testing.T) { - tracker := newThunderSetupTracker() - tracker.Begin("container-123") - - done := make(chan error, 1) - go func() { - done <- tracker.Wait(context.Background(), "container-123") - }() - - select { - case err := <-done: - t.Fatalf("wait returned before completion: %v", err) - case <-time.After(25 * time.Millisecond): - } - - tracker.Complete("container-123", nil) - requireNoErrorEventually(t, done) -} - -func TestThunderSetupTrackerReturnsFailure(t *testing.T) { - tracker := newThunderSetupTracker() - tracker.Begin("container-123") - tracker.Complete("container-123", errors.New("install failed")) - - err := tracker.Wait(context.Background(), "container-123") - assert.Error(t, err) - assert.Contains(t, err.Error(), "install failed") -} - -func TestThunderSetupTrackerDeleteWakesWaiters(t *testing.T) { - tracker := newThunderSetupTracker() - tracker.Begin("container-123") - tracker.mu.Lock() - status := tracker.statuses["container-123"] - tracker.mu.Unlock() - - done := make(chan error, 1) - go func() { - done <- status.wait(context.Background()) - }() - - tracker.Delete("container-123") - err := <-done - assert.Error(t, err) - assert.Contains(t, err.Error(), "cancelled") -} - -func requireNoErrorEventually(t *testing.T, done <-chan error) { - t.Helper() - select { - case err := <-done: - assert.NoError(t, err) - case <-time.After(time.Second): - t.Fatal("timed out waiting for Thunder setup wait") - } -} - func TestThunderInjectEnvVarsAddsThunderLDPreload(t *testing.T) { manager := NewContainerThunderManager(nil) @@ -170,45 +113,39 @@ func TestThunderUnassignDeletesClientEnrollment(t *testing.T) { assert.False(t, ok) } -func TestInstallThunderClientExecutesCachedInstaller(t *testing.T) { - rt := &mockRuntime{name: "runc"} +func TestThunderStartupHookUsesCachedInstaller(t *testing.T) { manager := NewContainerThunderManager(nil) manager.installCache.Set("container-123", "curl -fsSL https://get.thundercompute.com/install.sh | sudo THUNDER_NOWARN=1 THUNDER_INSTALL_MODE=client THUNDER_CENTRAL_URL='https://gateway.example' THUNDER_ENROLLMENT_TOKEN='enroll-token' sh") - instances := common.NewSafeMap[*ContainerInstance]() - instances.Set("container-123", &ContainerInstance{ - Runtime: rt, - Spec: &specs.Spec{Process: &specs.Process{Cwd: "/workspace", Env: []string{"A=1"}}}, - }) worker := &Worker{ containerThunderManager: manager, - containerInstances: instances, gpuVirtualized: true, } - err := worker.installThunderClient(context.Background(), &types.ContainerRequest{ContainerId: "container-123", GpuRequest: []string{"H100"}}) + hook, err := worker.thunderStartupHook(&types.ContainerRequest{ContainerId: "container-123", GpuRequest: []string{"H100"}}, &specs.Spec{Process: &specs.Process{Cwd: "/workspace", Env: []string{"A=1"}}}) if err != nil { t.Fatal(err) } - if len(rt.execCalls) != 1 { - t.Fatalf("execCalls = %d, want 1", len(rt.execCalls)) - } - call := rt.execCalls[0] - assert.Equal(t, "container-123", call.containerID) - assert.Equal(t, "/workspace", call.proc.Cwd) - assert.Equal(t, []string{"sh", "-c", "curl -fsSL https://get.thundercompute.com/install.sh | sudo THUNDER_NOWARN=1 THUNDER_INSTALL_MODE=client THUNDER_CENTRAL_URL='https://gateway.example' THUNDER_ENROLLMENT_TOKEN='enroll-token' sh"}, call.proc.Args) - assert.Contains(t, call.proc.Env, "A=1") - assert.Contains(t, call.proc.Env, "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin") + + execHook, ok := hook.(runtime.StartupExecHook) + require.True(t, ok) + assert.Equal(t, "thunder_client_install", execHook.HookName) + assert.Equal(t, 2*time.Minute, execHook.Timeout) + assert.Equal(t, "/workspace", execHook.Process.Cwd) + assert.Equal(t, []string{"sh", "-c", "curl -fsSL https://get.thundercompute.com/install.sh | sudo THUNDER_NOWARN=1 THUNDER_INSTALL_MODE=client THUNDER_CENTRAL_URL='https://gateway.example' THUNDER_ENROLLMENT_TOKEN='enroll-token' sh"}, execHook.Process.Args) + assert.Contains(t, execHook.Process.Env, "A=1") + assert.Contains(t, execHook.Process.Env, "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin") } -func TestInstallThunderClientRequiresCachedInstaller(t *testing.T) { +func TestThunderStartupHookRequiresCachedInstaller(t *testing.T) { worker := &Worker{ containerThunderManager: NewContainerThunderManager(nil), - containerInstances: common.NewSafeMap[*ContainerInstance](), gpuVirtualized: true, } - err := worker.installThunderClient(context.Background(), &types.ContainerRequest{ContainerId: "container-123", GpuRequest: []string{"H100"}}) + + hook, err := worker.thunderStartupHook(&types.ContainerRequest{ContainerId: "container-123", GpuRequest: []string{"H100"}}, &specs.Spec{Process: &specs.Process{}}) + require.Nil(t, hook) if err == nil || !strings.Contains(err.Error(), "install command") { - t.Fatalf("installThunderClient() error = %v", err) + t.Fatalf("thunderStartupHook() error = %v", err) } } diff --git a/pkg/worker/worker.go b/pkg/worker/worker.go index 39aec2182..b0f1c5bda 100644 --- a/pkg/worker/worker.go +++ b/pkg/worker/worker.go @@ -96,7 +96,6 @@ type Worker struct { containerNetworkManager ContainerNetwork containerGPUManager GPUManager containerThunderManager GPUManager - thunderSetupTracker *thunderSetupTracker containerMountManager *ContainerMountManager imageClient *ImageClient containerInstances *common.SafeMap[*ContainerInstance] @@ -420,8 +419,6 @@ func NewWorker() (_ *Worker, err error) { return nil, err } containerNetworkManager := newContainerNetwork(baseContainerNetworkManager, podAddr, persistent, machineID, routeTransport, routeLocalTargetHost) - thunderSetupTracker := newThunderSetupTracker() - worker := &Worker{ ctx: ctx, workerId: workerId, @@ -446,7 +443,6 @@ func NewWorker() (_ *Worker, err error) { fileCacheManager: fileCacheManager, containerGPUManager: NewContainerNvidiaManager(uint32(gpuCount), defaultRuntime.Name()), containerThunderManager: NewContainerThunderManager(thunderClient), - thunderSetupTracker: thunderSetupTracker, containerNetworkManager: containerNetworkManager, containerMountManager: NewContainerMountManager(config, poolConfig), podAddr: podAddr, @@ -484,7 +480,6 @@ func NewWorker() (_ *Worker, err error) { ImageClient: imageClient, ContainerRepoClient: containerRepoClient, ContainerNetworkManager: containerNetworkManager, - ThunderSetupTracker: thunderSetupTracker, EventRepo: eventRepo, WorkerID: workerId, BackendRoute: worker.backendRouteFor, @@ -697,9 +692,6 @@ func (s *Worker) reserveContainerInstance(request *types.ContainerRequest) bool } if request.Stub.Type.Kind() == types.StubTypeSandbox { instance.initializeProcessManagerReadiness() - if s.gpuVirtualizedForRequest(request) { - s.thunderSetupTracker.Begin(request.ContainerId) - } } s.containerInstances.Set(request.ContainerId, instance) From 37ada4e832b7ca0725b4d732cf7228d69f8b4e3f Mon Sep 17 00:00:00 2001 From: Rohan Phadnis Date: Fri, 7 Aug 2026 09:13:00 +0000 Subject: [PATCH 26/26] fixed race --- pkg/runtime/startup_hook_test.go | 36 +++++++++++++++++++ pkg/runtime/startup_hook_wrapper.go | 55 +++++++++++++++++++++-------- 2 files changed, 77 insertions(+), 14 deletions(-) diff --git a/pkg/runtime/startup_hook_test.go b/pkg/runtime/startup_hook_test.go index 650d59198..a60cff6bc 100644 --- a/pkg/runtime/startup_hook_test.go +++ b/pkg/runtime/startup_hook_test.go @@ -90,6 +90,42 @@ func TestStartupHookRuntimeRunsHooksInOrder(t *testing.T) { } } +func TestStartupHookRuntimeRunsHooksWhenRuntimeReturnsAfterStarted(t *testing.T) { + for i := 0; i < 100; i++ { + rt := newStartupHookMockRuntime(2468) + rt.finishRun() + calls := []string{} + wrapped := WithStartupHooks(rt, &recordingStartupHook{name: "install", calls: &calls}) + + started := make(chan int, 1) + exitCode, err := wrapped.Run(context.Background(), "container-1", "/bundle", &RunOpts{Started: started}) + + require.NoError(t, err) + require.Equal(t, 0, exitCode) + require.Equal(t, []string{"install"}, calls) + select { + case pid := <-started: + require.Equal(t, 2468, pid) + default: + t.Fatal("started was not published after hook completion") + } + } +} + +func TestWaitForStartupPIDPrioritizesStartedWhenDoneReady(t *testing.T) { + started := make(chan int, 1) + done := make(chan startupHookRunResult, 1) + started <- 1357 + done <- startupHookRunResult{exitCode: 0} + + pid, completed, ok, err := waitForStartupPID(context.Background(), started, done) + + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, 1357, pid) + require.Nil(t, completed) +} + func TestStartupHookRuntimeWithholdsRestoreStartedUntilHooksComplete(t *testing.T) { rt := newStartupHookMockRuntime(5678) hook := &blockingStartupHook{ diff --git a/pkg/runtime/startup_hook_wrapper.go b/pkg/runtime/startup_hook_wrapper.go index 0f13ad274..33ccb5473 100644 --- a/pkg/runtime/startup_hook_wrapper.go +++ b/pkg/runtime/startup_hook_wrapper.go @@ -81,31 +81,32 @@ func (r *startupHookRuntime) runWithStartedHook(ctx context.Context, containerID done <- startupHookRunResult{exitCode: exitCode, err: err} }() - var pid int - select { - case result := <-done: - return result.exitCode, result.err - case pid = <-started: - case <-ctx.Done(): - return -1, ctx.Err() + pid, completed, ok, err := waitForStartupPID(ctx, started, done) + if err != nil { + return -1, err + } + if !ok { + return completed.exitCode, completed.err } for _, hook := range r.hooks { if err := hook.Run(ctx, r.Runtime, containerID); err != nil { - return r.failStartupHook(ctx, containerID, done, hook, err) + return r.failStartupHook(ctx, containerID, done, completed, hook, err) } } if originalStarted != nil { select { - case result := <-done: - return result.exitCode, result.err case originalStarted <- pid: case <-ctx.Done(): return -1, ctx.Err() } } + if completed != nil { + return completed.exitCode, completed.err + } + select { case result := <-done: return result.exitCode, result.err @@ -114,15 +115,41 @@ func (r *startupHookRuntime) runWithStartedHook(ctx context.Context, containerID } } -func (r *startupHookRuntime) failStartupHook(ctx context.Context, containerID string, done <-chan startupHookRunResult, hook StartupHook, hookErr error) (int, error) { +func waitForStartupPID(ctx context.Context, started <-chan int, done <-chan startupHookRunResult) (int, *startupHookRunResult, bool, error) { + for { + select { + case pid := <-started: + return pid, nil, true, nil + default: + } + + select { + case pid := <-started: + return pid, nil, true, nil + case result := <-done: + select { + case pid := <-started: + return pid, &result, true, nil + default: + return 0, &result, false, nil + } + case <-ctx.Done(): + return 0, nil, false, ctx.Err() + } + } +} + +func (r *startupHookRuntime) failStartupHook(ctx context.Context, containerID string, done <-chan startupHookRunResult, completed *startupHookRunResult, hook StartupHook, hookErr error) (int, error) { _ = r.Runtime.Kill(context.Background(), containerID, syscall.SIGKILL, &KillOpts{All: true}) waitCtx, cancel := context.WithTimeout(context.WithoutCancel(ctx), startupHookShutdownTimeout) defer cancel() - select { - case <-done: - case <-waitCtx.Done(): + if completed == nil { + select { + case <-done: + case <-waitCtx.Done(): + } } return -1, fmt.Errorf("startup hook %q failed: %w", hook.Name(), hookErr)